Temperatuur instellen.

Software die niet past in bovenstaande onderwerpen
Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Temperatuur instellen.

Berichtdoor benvo » 20 Mei 2017, 17:14

Hallo allemaal,

Met onderstaande sketch wordt een temperatuur waarde op een meter gezet.
Om deze waarde te kunnen bewaken zit er een "lampje" in deze sketch dat knippert zodra de temperatuur te hoog of te laag wordt. Dat werkt. De ruimte tussen een te hoge en te lage temperatuur moet instelbaar zijn. Daarvoor wilde ik deze sketch gebruiken om telkens de maximumtemperatuur met een naar boven of naar onder te stellen evenals de minimum temperatuur. Hij drukt echter niets af. Nu zit er aanvankelijk ook nog geen minimum of maximum waarde ingesteld maar ook als ik "maxTemp" en "minTemp" een waarde meegeef wordt er nog niets afgedrukt op mijn tekst velden. Wat overzie ik?

Dank voor jullie hulp!

Groet,
Ben.

cpp code
#include "Nextion.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> // Zit al in de Arduino IDE



// Data aansluiting is aangesloten op pin 7 on the Arduino.
#define ONE_WIRE_BUS 7

// Legt een oneWire aan om te communiceren met elk oneWire apparaat.
OneWire oneWire(ONE_WIRE_BUS);

// Verbind onze oneWire referentie aan Dallas Temperature.
DallasTemperature sensors(&oneWire);

NexGauge pointer = NexGauge(0, 5, "z4"); //Zet de indentificatie van de meter in NexGauge pointer

NexPicture p0 = NexPicture(0, 5, "p0"); //Zet de indentificatie van het plaatje in NexPicture p0

const int ledPin = 16; //Tx ledPin 16
int setPic = LOW; //Low of High geeft de keuze van het plaatje
unsigned long previousMillis = 0; //Houdt de voorgaande tijd vast
const long interval = 1000; //interval tijd van één seconde

float maxTemp; //maximum temperatuur
float minTemp; //minimum temperatuur


//Declaratie button objects (page, Id, component naam)

NexButton b14 = NexButton(3, 1, "b14"); //plus maximum temperatuur
NexButton b15 = NexButton(3, 2, "b15"); //min maximum temperatuur
NexButton b16 = NexButton(3, 3, "b16"); //plus minimum temperatuur
NexButton b17 = NexButton(3, 4, "b17"); //min minimum temperatuur

//Declaratie

//Instelling tekstvelden toegestane temperatuur bereik tussen minimum en maximum

NexText t11 = NexText(3, 7, "t11"); //maximum temperatuur in het tekstveld pagina 3
NexText t12 = NexText(3, 8, "t12"); //minimum temperatuur in het tekstveld pagina 3


NexTouch *nex_listen_list[] =
{

&b14,
&b15,
&b16,
&b17,
&t11,
&t12,
NULL
};

//Na het loslaten van de desbetreffende knop zal de tekstwaarde met één wijzigen.
//maar ik weet nog niet of dit kan werken omdat er niets op mijn scherm komt.
void b14PopCallback(void*ptr)
{
maxTemp = maxTemp + 1;
}

void b15PopCallback(void*ptr)
{
maxTemp = maxTemp - 1;
}

void b16PopCallback(void*ptr)
{
minTemp = minTemp + 1;
}

void b17PopCallback(void*ptr)
{
minTemp = minTemp - 1;
}


void setup(void) {

nexInit(); //initialisatie van het Nextion scherm
Wire.begin();


b14.attachPop(b14PopCallback, &b14);
b15.attachPop(b15PopCallback, &b15);
b16.attachPop(b16PopCallback, &b16);
b17.attachPop(b17PopCallback, &b17);





pinMode(ledPin, OUTPUT); //Pin wordt als uitgang gebruikt


sensors.begin(); //initialisatie van de sensors

}

void loop(void) {


sensors.requestTemperatures(); // Vraagt om de temperatuurmeting.
float x = sensors.getTempCByIndex(0); //Zet de verkregen gemeten waarde in x

//Omrekening waarde naar graden voor de temperatuurschaal
// Temperature (linear)
// temperature = 0, angle = -45 degrees
// temperature = 50, angle = +225 degrees.
// range of temperature is 50
// range of angle is 270 (225 + 45)
//float temperature;
float angle = (x / 50.0 * 270.0) - 45.0;
int degrees = int(angle);
pointer.setValue(degrees);
if (degrees >= 360)
{
degrees = 0;
}


if (x < minTemp || x > maxTemp) //indien de temperatuur buiten het toegestane bereik valt.

{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
}
if (setPic == HIGH)
{
setPic = LOW;
p0.setPic(2);
}
else
{
setPic = HIGH;
p0.setPic(1);
}


Serial2.print("t11.txt=\"");
Serial2.print(maxTemp);


Serial2.print("t12.txt=\"");
Serial2.print(minTemp);
Serial2.print("\"\xFF\xFF\xFF");

nexLoop(nex_listen_list);
}
}

Advertisement

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

Re: Temperatuur instellen.

Berichtdoor Koepel » 21 Mei 2017, 03:52

Het gaat er om dat je een sketch goed opbouwt. Het gaat er niet om dat wij even iets kunnen aanwijzen wat niet goed is, want daarvoor zijn er teveel dingen die niet kloppen.
Wanneer ik vluchtig door je sketch heen loop, dan zie ik dit:

A)
Voor een bibliotheek geef ik de voorkeur aan #include <Nextion.h> in plaats van #include "Nextion.h".

B)
Deze zitten op pagina 0. Hebben ze echt allebei hetzelfde id nummer 5 ?
Code: Alles selecteren
NexGauge pointer = NexGauge(0, 5, "z4");  //Zet de indentificatie van de meter in NexGauge pointer
NexPicture p0 = NexPicture(0, 5, "p0");   //Zet de indentificatie van het plaatje in NexPicture p0


C)
Zit er echt een led aan pin 16 ?

D)
minTemp en maxTemp krijgen geen waarde toegewezen.
Dat het een sketch is om te testen, en dat je dat even hebt weggehaald, dat doet er niet toe. Je laat een sketch zien waarbij minTemp en maxTemp geen waarde krijgen.

E)
Ik dacht dat de graden van de Gauge niet negatief mochten worden. Dat los je niet op.

F)
Waarom zet je de graden van de Gauge op 0 wanneer het groter dan 360 is ?

G)
De software timer met millis() doet niets. Hij loopt wel, maar daarbinnen wordt geen code uitgevoerd.

H)
Met p0.setPic() overlaad je de seriële verbinding naar het display. Dat gebeurt alleen als de temperatuur buiten de grenzen komt, maar het hoort niet. Dan wordt een p0.setPic() bij iedere loop() uitgevoerd.

I)
Ik zie toch weer "\xFF\xFF\xFF". Gebruikt de Nextion library.

J)
De nexLoop(nex_listen_list) wordt niet bij iedere loop() uitgevoerd, en dat is wel nodig. Die kijkt namelijk of je op het display op een knop hebt gedrukt. Het zit nu binnen de if-statement van de temperatuur.

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Temperatuur instellen.

Berichtdoor benvo » 21 Mei 2017, 12:46

Dit is een heel nuttig antwoord want het is idd. de bedoeling dat ik zelf leer kijken én om mijn fouten te zien. Dank daarvoor dus!
Even het rijtje af.

1A: Tekst van de libray blijft zwart, dus fout (?), in deze situatie: #include <Nextion.h> terwijl hij wel verkleurd, dus juist(?) als ik dit doe #include "Nextion.h". Het valt op dat dit bij meer librarys zo is.
1B: fout dus gecorrigeerd.
1C: Nu TxPin genaamd.
1D:Dus een tijdelijke testtoewijzing. float maxTemp=29; //maximum temperatuur
float minTemp=22; //minimum temperatuur
1E:gecorrigeerd.
1F:gecorrigeerd.
1G: De code loopt wel zo te zien en geeft ook een waarschuwing omdat de waarde 0 is? Nu dus, als gezegd, wel een (test-)waarde gezet.
1H: Ik begrijp dit maar weet dus niet hoe dit aan te passen? Moet ik dus naar zoeken.
1I: Dit hebben we eerder besproken. Je hebt me toen gezegd:"Kies voor de Itead Nextion Library dus geen "\xFF\xFF\xFF meer". Dit is een prachtig voorbeeld van een antwoordt dat voor jou glashelder zal zijn maar voor mij accadabra!
Ik bedoel dit; de Itead library wordt aangesproken omdat er boven #include<Nextion.h> staat? En ergens in de Itead instruction set wordt aangegeven dat er zo afgesloten moet worden? Misschien wil je mij uitleggen wat je bedoelt? Temeer omdat dit probleem ook speelt bij de klok die ik zo (zelfs vaker) afsluit en die ook niet goed werkt als ik het weghaal.

Ook Nico riep dit al (en zal zonder twijfel gelijk hebben) en meent(waarschijnlijk) dat ik dit niet weg wil halen hetgeen natuurlijk niet het geval is. Ik ken en snap gewoon het alternatief niet.

Dank je wel voor je reactie!

Groet,
Ben.

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Temperatuur instellen.

Berichtdoor benvo » 21 Mei 2017, 14:07

benvo schreef:Dit is een heel nuttig antwoord want het is idd. de bedoeling dat ik zelf leer kijken én om mijn fouten te zien. Dank daarvoor dus!
Even het rijtje af.

1A: Tekst van de libray blijft zwart, dus fout (?), in deze situatie: #include <Nextion.h> terwijl hij wel verkleurd, dus juist(?) als ik dit doe #include "Nextion.h". Het valt op dat dit bij meer librarys zo is.
1B: fout dus gecorrigeerd.
1C: Nu TxPin genaamd.
1D:Dus een tijdelijke testtoewijzing. float maxTemp=29; //maximum temperatuur
float minTemp=22; //minimum temperatuur
1E:gecorrigeerd.
1F:gecorrigeerd.
1G: De code loopt wel zo te zien en geeft ook een waarschuwing omdat de waarde 0 is? Nu dus, als gezegd, wel een (test-)waarde gezet.
1H: Ik begrijp dit maar weet dus niet hoe dit aan te passen? Moet ik dus naar zoeken.
1I: Dit hebben we eerder besproken. Je hebt me toen gezegd:"Kies voor de Itead Nextion Library dus geen "\xFF\xFF\xFF meer". Dit is een prachtig voorbeeld van een antwoordt dat voor jou glashelder zal zijn maar voor mij accadabra!
Ik bedoel dit; de Itead library wordt aangesproken omdat er boven #include<Nextion.h> staat? En ergens in de Itead instruction set wordt aangegeven dat er zo afgesloten moet worden? Misschien wil je mij uitleggen wat je bedoelt? Temeer omdat dit probleem ook speelt bij de klok die ik zo (zelfs vaker) afsluit en die ook niet goed werkt als ik het weghaal.

Ook Nico riep dit al (en zal zonder twijfel gelijk hebben) en meent(waarschijnlijk) dat ik dit niet weg wil halen hetgeen natuurlijk niet het geval is. Ik ken en snap gewoon het alternatief niet.

Dank je wel voor je reactie!

Groet,
Ben.



cpp code
[code

#include "Nextion.h" //zodra zo: <Nextion.h> ingevoerd wordt de tekst zwart
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> // Zit al in de Arduino IDE



// Data aansluiting is aangesloten op pin 7 on the Arduino.
#define ONE_WIRE_BUS 7

// Legt een oneWire aan om te communiceren met elk oneWire apparaat.
OneWire oneWire(ONE_WIRE_BUS);

// Verbind onze oneWire referentie aan Dallas Temperature.
DallasTemperature sensors(&oneWire);

NexGauge pointer = NexGauge(0, 5, "z4"); //Zet de indentificatie van de meter in NexGauge pointer

NexPicture p0 = NexPicture(0, 8, "p0"); //Zet de indentificatie van het plaatje in NexPicture p0

const int TxPin = 16; //Tx Pin 16
int setPic = LOW; //Low of High geeft de keuze van het plaatje
unsigned long previousMillis = 0; //Houdt de voorgaande tijd vast
const long interval = 1000; //interval tijd van één seconde

float maxTemp = 29; //maximum temperatuur
float minTemp = 22; //minimum temperatuur


//Declaratie button objects (page, Id, component naam)

NexButton b14 = NexButton(3, 1, "b14"); //plus maximum temperatuur
NexButton b15 = NexButton(3, 2, "b15"); //min maximum temperatuur
NexButton b16 = NexButton(3, 3, "b16"); //plus minimum temperatuur
NexButton b17 = NexButton(3, 4, "b17"); //min minimum temperatuur

//Declaratie

//Instelling tekstvelden toegestane temperatuur bereik tussen minimum en maximum

NexText t11 = NexText(3, 7, "t11"); //maximum temperatuur in het tekstveld pagina 3
NexText t12 = NexText(3, 8, "t12"); //minimum temperatuur in het tekstveld pagina 3


NexTouch *nex_listen_list[] =
{

&b14,
&b15,
&b16,
&b17,
&t11,
&t12,
NULL
};

//Na het loslaten van de desbetreffende knop zal de tekstwaarde met één wijzigen.
//maar ik weet nog niet of dit kan werken omdat er niets op mijn scherm komt.
void b14PopCallback(void*ptr)
{
maxTemp = maxTemp = 1;
}

void b15PopCallback(void*ptr)
{
maxTemp = maxTemp - 1;
}

void b16PopCallback(void*ptr)
{
minTemp = minTemp + 1;
}

void b17PopCallback(void*ptr)
{
minTemp = minTemp - 1;
}


void setup(void) {

nexInit(); //initialisatie van het Nextion scherm
Wire.begin();


b14.attachPop(b14PopCallback, &b14);
b15.attachPop(b15PopCallback, &b15);
b16.attachPop(b16PopCallback, &b16);
b17.attachPop(b17PopCallback, &b17);





pinMode(TxPin, OUTPUT); //Pin wordt als uitgang gebruikt


sensors.begin(); //initialisatie van de sensors

}

void loop(void) {


sensors.requestTemperatures(); // Vraagt om de temperatuurmeting.
float x = sensors.getTempCByIndex(0); //Zet de verkregen gemeten waarde in x

//Omrekening waarde naar graden voor de temperatuurschaal
// Temperature (linear)
// temperature = 0, angle = -45 degrees
// temperature = 50, angle = +225 degrees.
// range of temperature is 50
// range of angle is 270 (225 + 45)
//float temperature;
float angle = (x / 50.0 * 270.0) - 45.0;
if (angle < 0) //Als de stand lager is dan 0 en dus negatief wordt.
{
angle += 360; //maak een positief aantal graden voor de meter
}
int degrees = int(angle);
pointer.setValue(degrees);
if (degrees = 360)
{
degrees = 0;
}


if (x < minTemp || x > maxTemp) //indien de temperatuur buiten het toegestane bereik valt.

{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{

if (setPic == HIGH)
{
setPic = LOW;
p0.setPic(2);
}
else
{
setPic = HIGH;
p0.setPic(3);
}
previousMillis = currentMillis;
}

Serial2.print("t11.txt=\"");
Serial2.print(maxTemp);


Serial2.print("t12.txt=\"");
Serial2.print(minTemp);
Serial2.print("\"\xFF\xFF\xFF"); //Dit moet dus verdwijnen maar hoe precies? Waarom druk dit gedeelte trouwens niets af?

}
nexLoop(nex_listen_list);
}
][/code]

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

Re: Temperatuur instellen.

Berichtdoor Koepel » 21 Mei 2017, 18:16

A)
Soms blijven includes zwart, soms kleuren variabelen, soms niet. Dat werkt volgens mij nog niet perfect. Niet te veel op letten ;)

F)
Beginnersfoutje. Een enkele '=' in een if-statment:
Code: Alles selecteren
if (degrees = 360)
{
  degrees = 0;
}
Waarom doe dat eigenlijk ? Volgens mij is het handiger om de temperatuur te begrenzen.

H)
Het schrijven van de minimum en maximum temperatuur naar het scherm overlaad de seriële verbinding.
Misschien kun je dat alleen in setup() doen, en dan in die callback functies zodra je de temperatuur anders zet. Het is niet nodig om dat continue te doen, en zelfs niet iedere seconde.

I)
De ITEAD Nextion library maakt voor elk component op het scherm een 'c++' object.
Wanneer je dat object gebruikt, dan gaat de ITEAD Nextion de tekst over de seriële verbinding naar het display sturen.
De 't11' en 't12' zijn objecten. Dat object heeft alleen een .setText() om het te vullen met iets, dus zul je (helaas) zelf de floating point om moeten zetten naar tekst.
dtostrf() : http://www.atmel.com/webdoc/avrlibcreferencemanual/group__avr__stdlib_1ga060c998e77fb5fc0d3168b3ce8771d42.html
Code: Alles selecteren
char buffer[20];
dtostrf( maxTemp, -5, 2, buffer);
t11.setText( buffer);         //   dit is gebruik maken van de ITEAD Nextion library
dtostrf( minTemp, -5, 2, buffer);
t12.setText( buffer);        //   dit is gebruik maken van de ITEAD Nextion library


Het voorbeeld van Nextion gebruikt geen 'float', maar een integer, die moet alsnog omgezet worden: http://docs.iteadstudio.com/ITEADLIB_Arduino_Nextion/_comp_text_8ino-example.html#_a0

Begint het al duidelijk te worden ?

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Temperatuur instellen.

Berichtdoor benvo » 22 Mei 2017, 20:29

Hallo koepel,
Er begint wel "wat" duidelijk te worden...

Zo begrijp ik zo ongeveer, denk ik, wat het CompText example doet.
Eeen aantal dingen kan ik daarvan niet gebruiken; uint16_t len;, uint16_t number; Wat len is weet ik niet, lengte van de gebruikte array? Het andere is een unsigned int voor len en number. Omdat het integers zijn ben ik dat niet nodig.

Zo goed en zo kwaad het ging heb ik dit "vertaald" naar mijn sketch die dan ook niets doet.... :(

In de sketch heb ik telkens achter // opmerkingen en vragen gezet. Het zou fijn zijn als je daar eens naar zou willen kijken? Dan wordt duidelijk of ik het überhaupt snap.

Dank je voor je hulp!

[code2=cpp][/
Code: Alles selecteren

#include "Nextion.h"                        //zodra zo: <Nextion.h> ingevoerd wordt de tekst zwart.
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>                         // Zit al in de Arduino IDE



// Data aansluiting is aangesloten op pin 7 on the Arduino.
#define ONE_WIRE_BUS 7

// Legt een oneWire aan om te communiceren met elk oneWire apparaat.
OneWire oneWire(ONE_WIRE_BUS);

// Verbind onze oneWire referentie aan Dallas Temperature.
DallasTemperature sensors(&oneWire);

NexGauge pointer = NexGauge(0, 5, "z4");                 //Zet de indentificatie van de meter in NexGauge pointer

NexPicture p0 = NexPicture(0, 8, "p0");                     //Zet de indentificatie van het plaatje in NexPicture p0

const int TxPin = 16;                                               //Tx Pin 16
int setPic = LOW;                                                    //Low of High geeft de keuze van het plaatje
unsigned long previousMillis = 0;                             //Houdt de voorgaande tijd vast
const long interval = 1000;                                     //interval tijd van één seconde

float maxTemp = 29;                                             //maximum temperatuur
float minTemp = 22;                                             //minimum temperatuur


//Declaratie button objects (page, Id, component naam)

NexButton b14 = NexButton(3, 1, "b14");             //plus maximum temperatuur
NexButton b15 = NexButton(3, 2, "b15");             //min maximum temperatuur
NexButton b16 = NexButton(3, 3, "b16");            //plus minimum temperatuur
NexButton b17 = NexButton(3, 4, "b17");            //min minimum temperatuur

//Declaratie

//Instelling tekstvelden toegestane temperatuur bereik tussen minimum en maximum

NexText t11 = NexText(3, 7, "t11");                 //maximum temperatuur in het tekstveld pagina 3
NexText t12 = NexText(3, 8, "t12");                 //minimum temperatuur in het tekstveld pagina 3

char buffer[20];                                             //buffergrootte




NexTouch *nex_listen_list[] =
{

  &b14,
  &b15,
  &b16,
  &b17,
  &t11,
  &t12,
  NULL
};

// Dit zet de maximum en minimum beginwaardes op mijn instelblad temperatuur.

void t11PopCallback(void*ptr)
{
  dbSerialPrintln("t11PopCallback");          //wat doet deze opdracht?
  dtostrf(maxTemp, -5, 2, buffer);            //zet de maxTemp float waarde in de buffer -5 is de stringlengte (waarom -?) 2 achter de komma.
  t11.setText(buffer);                              //Zet de waarde die in de buffer staat op tekstveld 11
}
void t12PopCallback(void*ptr)
{
  dbSerialPrintln("t12PopCallback");
  dtostrf(minTemp, -5, 2, buffer);
  t12.setText(buffer);
}

//Na het loslaten van de desbetreffende knop zal de tekstwaarde met één wijzigen.
//maar ik weet nog niet of dit kan werken omdat er niets op mijn scherm komt.
void b14PopCallback(void*ptr)
{
  dbSerialPrintln("b14PopCallback");                //wat doet deze opdracht?
  memset(buffer, 0, sizeof(buffer));                 //Hier wordt de bufferwaarde in het geheugen gezet. 0 zet het in het begin, sizeof geeft de grootte van de buffer in bytes?
  t11.getText(buffer, sizeof(buffer));               //Tekstveld 11 krijgt de buffer tekst
  maxTemp += 1;                                         //na loslaten van de knop wordt er één opgeteld.
  memset(buffer, 0, sizeof(buffer));                //hier wordt de nieuwe waarde opgeslagen
  dtostrf(maxTemp, -5, 2, buffer);                  //Ik vraag me af of wel nodig is. Zet float in een string maar dat hebben we al?
  t11.setText(buffer);                                    //Zou mijn (nieuwe) waarde in tekstveld 11 moeten zetten
}

void b15PopCallback(void*ptr)
{
  dbSerialPrintln("b15PopCallback");
  memset(buffer, 0, sizeof(buffer));
  t11.getText(buffer, sizeof(buffer));
  maxTemp -= 1;
  memset(buffer, 0, sizeof(buffer));
  dtostrf(maxTemp, -5, 2, buffer);
  t11.setText(buffer);
}

void b16PopCallback(void*ptr)
{
  dbSerialPrintln("b16PopCallback");
  memset(buffer, 0, sizeof(buffer));
  t12.getText(buffer, sizeof(buffer));
  minTemp += 1;
  memset(buffer, 0, sizeof(buffer));
  dtostrf(minTemp, -5, 2, buffer);
  t12.setText(buffer);
}

void b17PopCallback(void*ptr)
{
  dbSerialPrintln("b17PopCallback");
  memset(buffer, 0, sizeof(buffer));
  t12.getText(buffer, sizeof(buffer));
  maxTemp -= 1;
  memset(buffer, 0, sizeof(buffer));
  dtostrf(maxTemp, -5, 2, buffer);
  t12.setText(buffer);
}


void setup(void) {

  nexInit();                                        //initialisatie van het Nextion scherm
  Wire.begin();
  t11.attachPop(t11PopCallback, &t11);
  t12.attachPop(t12PopCallback, &t12);
  b14.attachPop(b14PopCallback, &b14);
  b15.attachPop(b15PopCallback, &b15);
  b16.attachPop(b16PopCallback, &b16);
  b17.attachPop(b17PopCallback, &b17);
  dbSerialPrintln("setup done");                      //wat doet deze opdracht?





  pinMode(TxPin, OUTPUT);             //Pin wordt als uitgang gebruikt


  sensors.begin();                     //initialisatie van de sensors

}

void loop(void) {


  sensors.requestTemperatures();         // Vraagt om de temperatuurmeting.
  float x = sensors.getTempCByIndex(0);  //Zet de verkregen gemeten waarde in x

  //Omrekening waarde naar graden voor de temperatuurschaal
  // Temperature (linear)
  // temperature = 0, angle = -45 degrees
  // temperature = 50, angle = +225 degrees.
  // range of temperature is 50
  // range of angle is 270 (225 + 45)
  //float temperature;
  float angle = (x / 50.0 * 270.0) - 45.0;
  if (angle < 0)      //Als de stand lager is dan 0 en dus negatief wordt.
  {
    angle += 360;    //maak een positief aantal graden voor de meter
  }
  int degrees = int(angle);
  pointer.setValue(degrees);
  if (degrees == 360)
  {
    degrees = 0;
  }


  if (x < minTemp || x > maxTemp)      //indien de temperatuur buiten het toegestane bereik valt.

  {
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval)
    {

      if (setPic == HIGH)
      {
        setPic = LOW;
        p0.setPic(2);
      }
      else
      {
        setPic = HIGH;
        p0.setPic(3);
      }
      previousMillis = currentMillis;
    }



  }
  nexLoop(nex_listen_list);
}

code2]

Groet,
Ben.

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

Re: Temperatuur instellen.

Berichtdoor Koepel » 23 Mei 2017, 08:03

Die -5 is inderdaad niet nodig, dat kan beter 5 zijn. De '-' schuift de tekst naar links als er minder dan 5 tekens zijn. Dat gebruik ik vaak, maar hier is dat niet nodig.
Dus "23.05" zijn 5 tekens (inclusief de punt). Dus de 'width' van 'dtostrf()' kun je op 5 zetten.

De "dbSerialPrintln()" is iets dat in de Nextion library zit om een debug-berichtje naar de seriele poort te sturen. Het is niets anders dan een "Serial.println()". De "db" is een afkorting voor "debug". Dat stuur het gewoon naar de seriële monitor.

Je schrijft de minTemp en maxTemp in een callback routine naar de tekst-componenten 't11' en 't12' op het scherm. Waarom ? Worden die functies eigenlijk wel aangeroepen ?

Ik gaf alleen maar een link naar dat voorbeeld om te laten zien dat met een integer het alsnog omgezet moet worden naar tekst (met itoa). Nu heb je zomaar willekeurige dingen van dat voorbeeld in jouw sketch zitten proppen.

Je kunt wel de tekst van het scherm opvragen, maar dan heb je nog geen 'float' variabele. Dan zou je die tekst naar 'float' moeten omzetten, dan verhogen of verlagen, dan weer omzetten naar tekst en terug naar het scherm schrijven.
Je hebt een globale variabele 'minTemp' en 'maxTemp', die kun je verhogen en verlagen en updaten naar het scherm. Dat lijkt me veel eenvoudiger.

Bijvoorbeeld dit:
Code: Alles selecteren
void b14PopCallback(void*ptr)
{
  dbSerialPrintln("b14PopCallback");                //wat doet deze opdracht?
  memset(buffer, 0, sizeof(buffer));                 //Hier wordt de bufferwaarde in het geheugen gezet. 0 zet het in het begin, sizeof geeft de grootte van de buffer in bytes?
  t11.getText(buffer, sizeof(buffer));               //Tekstveld 11 krijgt de buffer tekst
  maxTemp += 1;                                         //na loslaten van de knop wordt er één opgeteld.
  memset(buffer, 0, sizeof(buffer));                //hier wordt de nieuwe waarde opgeslagen
  dtostrf(maxTemp, -5, 2, buffer);                  //Ik vraag me af of wel nodig is. Zet float in een string maar dat hebben we al?
  t11.setText(buffer);                                    //Zou mijn (nieuwe) waarde in tekstveld 11 moeten zetten
}


kan beter zo:
Code: Alles selecteren
void b14PopCallback(void*ptr)
{
  maxTemp += 1.0;                               // na loslaten van de knop wordt er één opgeteld.
  dtostrf(maxTemp, -5, 2, buffer);         // Gebruik de 'buffer' om het om te zetten naar tekst
  t11.setText(buffer);                            // Schrijft (nieuwe) waarde in tekstveld 11 van het display
}


Dus nu kun je al die callback functies weer aan gaan passen...

Die memset() begrijp ik zelf ook niet. Het vult de 'buffer' met nullen, maar ik vind dat maar raar. Ik heb de .getText() nog niet gebruikt, misschien dat daar een foutje in zit wat met memset() wordt opgelost.
Ik zie het gebruik van memset() ook veel op instructables.com, maar volgens mij wordt het in 90% verkeerd gebruikt en is het helemaal niet nodig.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Temperatuur instellen.

Berichtdoor nicoverduin » 23 Mei 2017, 08:58

Koepel schreef:Die memset() begrijp ik zelf ook niet. Het vult de 'buffer' met nullen, maar ik vind dat maar raar. Ik heb de .getText() nog niet gebruikt, misschien dat daar een foutje in zit wat met memset() wordt opgelost.
Ik zie het gebruik van memset() ook veel op instructables.com, maar volgens mij wordt het in 90% verkeerd gebruikt en is het helemaal niet nodig.

Dat krijg je als ze gaan knippen en plakken zonder te begrijpen waarom ze het doen. memset() is in dit soort gevallen een vrijwel zinloze en overbodige actie.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Temperatuur instellen.

Berichtdoor Koepel » 23 Mei 2017, 09:16

Dan zitten er een heleboel mensen 'memset()' te kopieren, het lijkt wel of ik het steeds vaker zie.

Ik schreef:
Je schrijft de minTemp en maxTemp in een callback routine naar de tekst-componenten 't11' en 't12' op het scherm. Waarom ? Worden die functies eigenlijk wel aangeroepen ?
maar ik neem aan dat de Nextion Editor een callback kan aanroepen bij het initialiseren van een component ? Het is voor mij lastig om dat even na te kijken, omdat ik in linux zit.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Temperatuur instellen.

Berichtdoor nicoverduin » 23 Mei 2017, 09:30

Tekst veld geeft alleen een msg af bij het aanraken en loslaten van een veld. Als je wilt dat een scherm wordt geupdate bij het wisselen van de pagina, moet je dat op pagina nivo doen. Dus als hij nu een tekstveld niet aanraakt (en dan moeten die vinkjes ook nog aanstaan) gebeurt er helemaal niets want die callbacks worden nooit en te nimmer aangeroepen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar Overige Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten