Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Arduino MQTT void funktsioonist muutuja kättesaamine märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 19.10.2020 08:34:56 Arduino MQTT void funktsioonist muutuja kättesaamine vasta tsitaadiga

Selline probleem, et void Callback funktsioonist kuhu tuleb infopakett temperatuuriga on vaja see temp väärtus saada loop funktsiooni.
MQTT näidiskood ise selline:

#include "MQTT.h"

void callback(char* topic, byte* payload, unsigned int length);

/**
* if want to use IP address,
* byte server[] = { XXX,XXX,XXX,XXX };
* MQTT client(server, 1883, callback);
* want to use domain name,
* exp) iot.eclipse.org is Eclipse Open MQTT Broker: https://iot.eclipse.org/getting-started
* MQTT client("iot.eclipse.org", 1883, callback);
**/
MQTT client("server_name", 1883, callback);

// recieve message
void callback(char* topic, byte* payload, unsigned int length) {
    char p[length + 1];
    memcpy(p, payload, length);
    p[length] = NULL;

    if (!strcmp(p, "RED"))
        RGB.color(255, 0, 0);
    else if (!strcmp(p, "GREEN"))
        RGB.color(0, 255, 0);
    else if (!strcmp(p, "BLUE"))
        RGB.color(0, 0, 255);
    else
        RGB.color(255, 255, 255);
    delay(1000);
}


void setup() {
    RGB.control(true);

    // connect to the server
    client.connect("sparkclient");

    // publish/subscribe
    if (client.isConnected()) {
        client.subscribe("inTopic/message");
    }
}

void loop() {
    if (client.isConnected())
        client.loop();
}


callback funktsioonis ei ole võimalik mul seda temp väärtust kasutada, kuna seda on vaja mujal LCD koodis LCD'le info kirjutamiseks.

-e-

Tuli korra selline rumal mõte,et library's muudatus teha.
https://github.com/hirotakaster/MQTT/tree/master/src
Ala muuta VOID callback -> FLOAT callback ning sellisel juhul saaks koodis float callback funtsioonist muutuja kätte teise funktsiooni.
On muudatus nii lihtne nagu eelnevalt kirjeldatud, eeldatavasti mitte? (Koodi kirjutamises olen korralik võhik icon_smile.gif)

_________________
Väiksemagabariidilised trei, frees ning keevitustööd. PS.
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
Supiplex
HV veteran
Supiplex

liitunud: 11.12.2002




sõnum 19.10.2020 13:49:09 vasta tsitaadiga

Hetkel piisab sellest, kui sa tekitad juurde ühe globaalse muutuja oma soovitud temp väärtuse hoidmiseks. Kui MQTT saab serverist andmeid ja "callback" funktsioon käivitub, siis topid oma andmed lihtsalt sinna globaalsesse muutujasse. Pärast kontrollid välimises "loop" funktsioonis üle, kas tuli andmeid või mitte.


// Holds string received from MQTT
static char gBuf[32] = {'\0'};
...
// recieve message
void callback(char* topic, byte* payload, unsigned int length) {
    // Assume zero-terminated string data that fits in gBuf
    strncpy(gBuf, payload, sizeof(gBuf));
    gBuf[sizeof(gBuf) - 1] = '\0'; // Ensure string is zero-terminated
}
...
void loop() {
    if (client.isConnected()) {
        client.loop();
        if (strlen(gBuf)) {
            printf("Got data %s", gBuf);
            gBuf[0] = '\0';
        }
    }
}

_________________
The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions.
Kommentaarid: 38 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 19.10.2020 19:08:39 vasta tsitaadiga

Kirjutasin tööjuures selle library ennist veidi ümber (kõik kus oli void callback -> float callback) ning mu imestuseks paistab asi funkavat.
Kui tekib tõrkeid töö käigus, siis proovin pakutud lahenduse ära.

_________________
Väiksemagabariidilised trei, frees ning keevitustööd. PS.
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ohohh
Kreisi kasutaja
Ohohh

liitunud: 13.09.2003




sõnum 21.10.2020 00:41:11 vasta tsitaadiga

Kas saaksid tuua näite, et mida sa täpselt ei saa callbacki sees välja kutsuda, aga ainult loop'i sees saad?

Ma ei näe mingit põhjust, miks ei võiks saada LCD info uuendust callbacki seest välja kutsuda.
Kommentaarid: 6 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 6
tagasi üles
vaata kasutaja infot saada privaatsõnum
Terror
HV veteran
Terror

liitunud: 08.11.2001




sõnum 21.10.2020 07:50:31 vasta tsitaadiga

LCD'le on selline kood:

    String timeMax;
    String timeMin;



    if(hetkeTemp>-40 && hetkeTemp <50 && update == 1){
            Serial.println("update");
            Serial.println(update);
        if (minTemp>hetkeTemp){
            minTemp=hetkeTemp;
            timeMin = "";
            if(Time.hour()<10){timeMin +=" ";}
            timeMin += Time.hour();
            timeMin += ":";
            if(Time.minute()<10){timeMin +="0";}
            timeMin += Time.minute();
            timeMin += "";
        }
        if (maxTemp<hetkeTemp){
            maxTemp=hetkeTemp;
            timeMax = "";
            if(Time.hour()<10){timeMax +=" ";}
            timeMax += Time.hour();
            timeMax += ":";
            if(Time.minute()<10){timeMax +="0";}
            timeMax += Time.minute();
            timeMax += "";
        }
        tft.setRotation(1);
        tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
        tft.setTextSize(8);
        tft.setCursor(40,30);
        if(hetkeTemp>0){tft.print("+");}
        tft.print(hetkeTemp,1);
        tft.print(" ");
        tft.setTextSize(3);
        tft.setCursor(40,120);
        tft.print("MAX ");
        tft.setTextSize(2);
        tft.setCursor(40,145);
        tft.print(timeMax);
        tft.setCursor(150,120);
        tft.setTextSize(5);
        if(maxTemp>=0){tft.print("+");}
        tft.print(maxTemp,1);
        tft.print(" ");
        tft.setTextSize(3);
        tft.setCursor(40,170);
        tft.print("MIN ");
        tft.setTextSize(2);
        tft.setCursor(40,195);
        tft.print(timeMin);
        tft.setCursor(150,170);
        tft.setTextSize(5);
        if(minTemp>=0){tft.print("+");}
        tft.print(minTemp,1);
        tft.print(" ");
        tft.setTextSize(2);
        tft.setCursor(110,222);
        if(Time.hour()<10){timeStr +=" ";}
            timeStr += Time.hour();
            timeStr += ":";
            if(Time.minute()<10){timeStr +="0";}
            timeStr += Time.minute();
            timeStr += ":";
            if(Time.second()<10){timeStr +="0";}
            timeStr += Time.second();
        tft.print(timeStr);
        timeStr = "";
       
       
       
        update = 0;
    }

Ei ütle, et seda tingimata ei ole võimalik jupitada vms, kuid tahaks, et iga asja kood oleks ühes blokis - võhikul niigi raske oma kätetööd lugeda, kui asi pikemaks kipub minema.

_________________
Väiksemagabariidilised trei, frees ning keevitustööd. PS.
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 2 :: 91
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ohohh
Kreisi kasutaja
Ohohh

liitunud: 13.09.2003




sõnum 21.10.2020 08:08:39 vasta tsitaadiga

Ok, ma saan aru, et tahad kõike ekraanil kuvatavat ühes blokis alati korraga värskendada. Ja värskendada on vaja ka muud infot infot kui ainult temperatuuri.

Siis oleks vist ikkagi mõistlik teha nii nagu Supiplex ütles, et panna väärtus globaalsesse muutujasse.

Callbacki sees võid väärtuse juba ära parsida MQTT sõnumist:
hetkeTemp = ...
update = 1;

Ja nüüd loop'i sees olev LCD uuendaja näeb, et update == 1 ja saadab kõik info ekraani ära.

Ise library muutmine võib selles mõttes halb olla, et kui tulevikus tahad librarit uuendada, siis pead samad muudatused uuesti tegema.
Kommentaarid: 6 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 6
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Arduino MQTT void funktsioonist muutuja kättesaamine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.