Stránka 1 z 1

Změna typu proměnné

Napsal: 12 dub 2023, 23:35
od tosik
Zdravím.

Potřebuji z řetězce vypreparovat číselnou část a tuto převést na číslo typu integer. Vypreparovat mi to jde, tisk na sériovou linku ukazuje, že je to OK, ale když to pak dám odeslat do NODE-RED, přijde mi 0 (nula). Řekl bych, že špatně převádím typy proměnných. Jak udělám, aby výsledek byla proměnná typu int? Získané číslo pak potřebuji vložit do proměnné pozadTeplKuchyn , která je deklarovaná jako integer a odeslat pomocí MQTT do NODE-RED. Po spuštění jednotky se odešle výchozí hodnota proměnné pozadTeplKuchyn správně. Ale když přijmu řetězec z NODE-RED, kterým chci nastavit novou hodnotu, a níže uvedeným kódem získám z tohoto řetězce požadované číslo, které vložím do proměnné pozadTeplKuchyn , odesílá se 0, místo požadovaného čísla. Kde dělám chybu? Vím, že tam už těch převodů mám hodně, ale zkoušel jsem, co se dá, a nic. Tak sem dávám poslední verzi marného pokusu... Fce callback je správně (není moje ... :-D, proto funguje), já řeším tu část od prvního if, tam je někde chyba. Ty výpisy na sériovou linku tam mám jen pro ladění...

Kód: Vybrat vše

void callback(char* topic, byte* message, unsigned int length) {
  // výpis na sériovou linku, že byla přijatá zpráva
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;
  
  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  
  if (String(topic) == "ridiciEsp32/nastavHlidanouTepl") {
    Serial.print("Přišlo: ");
    Serial.println(messageTemp);

    int pozicedvojtecky = messageTemp.indexOf(':');
    Serial.print("Pozice : je: ");
    Serial.println(pozicedvojtecky);
    
    int poziceZavorky = messageTemp.indexOf('}');
    Serial.print("Pozice }: ");
    Serial.println(poziceZavorky);        

    String hodnota = messageTemp.substring(pozicedvojtecky,poziceZavorky);
    Serial.print("Výřez 16/18: ");
    Serial.println(hodnota);

    char buf[6];
    hodnota.toCharArray(buf,6);
    Serial.print("Nová hlídaná teplota převedená na char: ");               
    Serial.println(buf);

    Serial.print("Nová hlídaná teplota: ");               
    pozadTeplKuchyn = (int)atoi(buf);   
    Serial.println(pozadTeplKuchyn);    
  }
}

Re: Změna typu proměnné

Napsal: 13 dub 2023, 17:20
od AstroMiK
Tohle:

Kód: Vybrat vše

    String hodnota = messageTemp.substring(pozicedvojtecky,poziceZavorky);
nahradit tímhle:

Kód: Vybrat vše

    String hodnota = messageTemp.substring(pozicedvojtecky + 1 ,poziceZavorky);
Problém bude asi v tom, že v tom poli 'buf[]' je jako první znak uložená ta dvojtečka před číslem a s tím si pak následně "atoi" neporadí, takže vrací nulu.
Když se to do 'buf[]' začne ukládat až následující znak po dvojtečce, tak to snad začne fungovat.

Jestli ne, tak sem hoď celý ten řetězec 'messageTemp', který se zpracovává.

Re: Změna typu proměnné

Napsal: 13 dub 2023, 20:57
od tosik
Pane Bože, ja su ko..t, celý večer v pr..li a nepřišel jsem na to. Samozřejmě, že to je tím. Nevšimnul jsem si ve výpisu na sériové lince té dvojtečky před vypreparovaným číslem. Díky moc.

Re: Změna typu proměnné

Napsal: 18 kvě 2023, 16:38
od Arthur
Je v této větě nějaká chyba?pozadTeplKuchyn = (int)atoi(buf);