list of strings

algemene C code
Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

list of strings

Berichtdoor ercmrj » 23 Jul 2020, 11:27

Ik heb een project gemaakt waarmee ik via telegram berichten kan ontvangen met een esp8266.

Nu komen die berichten binnen als strings en zou ik die in een lijst willen opslaan.
Ik heb al lang zitten zoeken op internet maar kan wel lijsten vinden waar ze strings (eigenlijk array of char) in opslaan maar om bv de tekst van de 1e string te veranderen, daar kan ik geen voorbeeld van vinden.

In onderstaande code staat ongeveer wat ik wil en wat er mis gaat, aan het einde heb ik 3x dezelfde text.
Code: Alles selecteren
String s1 = "eric";
String s2 = "klaas";
String s3 = "piet";
char ch[10];

char *pointer[] = {"", "", ""};

void setup() {
  Serial.begin(9600);

  pointer[0]="one";pointer[1]="two";pointer[2]="three";
 
  for (int xx = 0; xx < 3; xx++) {
    Serial.print("   "); Serial.println(pointer[xx]);
  }
 
  ch[sizeof(s1)];
  s1.toCharArray(ch, sizeof(ch));
  Serial.print("-"); Serial.println(ch);

  pointer[0] = ch;

  ch[sizeof(s2)];
  s2.toCharArray(ch, sizeof(ch));
  Serial.print("-"); Serial.println(ch);

  pointer[1] = ch;

  ch[sizeof(s3)];
  s3.toCharArray(ch, sizeof(ch));
  Serial.print("-"); Serial.println(ch);

  pointer[2] = ch;

  for (int xx = 0; xx < 3; xx++) {
    Serial.print("   "); Serial.println(pointer[xx]);
  }
}

void loop() {
}


uitkomst is dit:
one
two
three
-eric
-klaas
-piet
piet
piet
piet

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: list of strings

Berichtdoor Koepel » 23 Jul 2020, 16:03

Welke Telegram library gebruik je en hoe geeft die library de tekst door ?

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: list of strings

Berichtdoor ercmrj » 23 Jul 2020, 16:51

Als String lijkt me ik kan de tekst in de String ont_text zetten.

Code: Alles selecteren
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>


#include <UniversalTelegramBot.h>
// Library for interacting with the Telegram API
// Search for "Telegegram" in the Library manager and install
// The universal Telegram library
// https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot


#include <ArduinoJson.h>
// Library used for parsing Json from the API responses
// NOTE: There is a breaking change in the 6.x.x version,
// install the 5.x.x version instead
// Search for "Arduino Json" in the Arduino Library manager
// https://github.com/bblanchon/ArduinoJson

char ssid[] = "";         // your network SSID (name)
char password[] = ""; // your network password

#define TELEGRAM_BOT_TOKEN ""

const String chat_id = "";

int numNewMessages;

// This is the Wifi client that supports HTTPS
WiFiClientSecure client;
UniversalTelegramBot bot(TELEGRAM_BOT_TOKEN, client);

#define LED_PIN 2 // Same as D4 for Wemos

int delayBetweenChecks = 1000;
unsigned long lastTimeChecked;   //last time messages' scan has been done

unsigned long lightTimerExpires;
boolean lightTimerActive = false;

String ontv_text;

void setup() {
  // Set WiFi to station mode and disconnect from an AP if it was Previously connected
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);

  // attempt to connect to Wifi network:
  Serial.print("Connecting Wifi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  // Only required on 2.5 Beta
  client.setInsecure();


  // longPoll keeps the request to Telegram open for the given amount of seconds if there are no messages
  // This hugely improves response time of the bot, but is only really suitable for projects
  // where the the initial interaction comes from Telegram as the requests will block the loop for
  // the length of the long poll
  bot.longPoll = 60;
  //bot.sendMessage("9952488", "   start---", "Markdown");
}


void handleNewMessages(int numNewMessages) {

  for (int i = 0; i < numNewMessages; i++) {
    if (bot.messages[i].type ==  F("message")) {
      ontv_text = bot.messages[i].text;
    }
  }
}

void loop() {
 

  if (millis() > lastTimeChecked + delayBetweenChecks)  {

    // getUpdates returns 1 if there is a new message from Telegram
    numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    if (numNewMessages) {
      Serial.println("got response");
      handleNewMessages(numNewMessages);

      Serial.println(ontv_text);
      bot.sendMessage(chat_id, ontv_text, "Markdown");
    }


    lastTimeChecked = millis();

    if (lightTimerActive && millis() > lightTimerExpires) {
      lightTimerActive = false;
      digitalWrite(LED_PIN, LOW);
    }
  }
}





Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: list of strings

Berichtdoor Koepel » 23 Jul 2020, 20:15

Een zero-terminated character array wordt ook een string genoemd.
https://www.arduino.cc/reference/en/language/variables/data-types/string/.

Er is echter ook een Arduino String object. Dat is een object (van een class) met allerlei extra's.
https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/.

Die Telegram library maakt volop gebruik van het String object.
https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot/blob/master/src/UniversalTelegramBot.h.

Bij een lijst denk ik aan een linked list. Maar volgens mij wil je een array van berichten, waarbij je ze opnieuw kunt toewijzen.
Een String gebruikt intern een pointer naar gealloceerd geheugen. Je kunt dus eenvoudig iets wijzigen of een nieuwe tekst toewijzen, en het String object zorgt dat het goed wordt verwerkt.

Als je de tekst niet gaat omzetten naar een character array en geen pointers gebruikt, dan krijg je iets dat veel eenvoudiger is:
Code: Alles selecteren
String namen[3] =
{
  "eric", "klaas", "piet"
};

void setup()
{
  Serial.begin(9600);
  Serial.println();
  Serial.println( "---------- sketch is gestart --------");

  for( int i = 0; i < 3; i++)
  {
    Serial.print( "[");
    Serial.print( i);
    Serial.print( "] ");
    Serial.println( namen[i]);
  }

  // Een nieuwe tekst wordt opgenomen in het object van namen[0]
  namen[0] = "richard";

  for( int i = 0; i < 3; i++)
  {
    Serial.print( "[");
    Serial.print( i);
    Serial.print( "] ");
    Serial.println( namen[i]);
  }
}

void loop()
{
}


Jouw "ontv_text" is een String object. Dat zou ik zo houden.
Dan kun je dit doen:
Code: Alles selecteren
namen[0] = ontv_text;
Dat is het voordeel van het String object.

Door de indeling van je sketch weet je niet zeker of in "ontv_text" een nieuwe tekst staat. Deze voorbeeld sketch heeft een andere indeling: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot/blob/master/examples/ESP8266/FlashLED/FlashLED.ino.

Je gebruikt millis() op een verkeerde manier.
De juist manier staat bij Blink-Without-Delay: https://www.arduino.cc/en/tutorial/BlinkWithoutDelay.
Het gaat dan vooral hier om:

Code: Alles selecteren
// GOED
if (currentMillis - previousMillis >= interval) {

// FOUT
if (millis() > lastTimeChecked + delayBetweenChecks)  {

Berichten: 139
Geregistreerd: 28 Jul 2013, 13:30

Re: list of strings

Berichtdoor ercmrj » 23 Jul 2020, 20:57

Ik schaam me dood. Zo simpel, ik snap niet dat het bij mij nooit gelukt is.

Heel erg bedankt Koepel.

Ik heb een bestaand script wat aangepast en die millis stond er al in, dat heb ik niet aangepast.

Ik zal de rest van de linkjes eens doorlezen daar leer ik altijd weer van.

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 18 gasten