Nextion CompText voorbeeld

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

Re: Nextion CompText voorbeeld

Berichtdoor nicoverduin » 18 Feb 2017, 07:24

Altijd handig...... je logica op 2 plekken......
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Advertisement

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

Re: Nextion CompText voorbeeld

Berichtdoor nicoverduin » 18 Feb 2017, 10:02

Ik heb net ff dit programmatje gemaakt met grotendeels jouw code (en gelijk versimpeld)
cpp code
#include "Nextion.h"
//#include <DallasTemperature.h>
#define ONE_WIRE_BUS 22
//OneWire oneWire(ONE_WIRE_BUS);
//DallasTemperature sensors(&oneWire);

SoftwareSerial HMISerial(9,10);

void b0PopCallback(void *ptr);
void b1PopCallback(void *ptr);


NexText b0 = NexText (0, 1, "b0");
NexButton b1 = NexButton (0, 2, "b1");
NexButton t0 = NexButton (0, 3, "t0");
NexText temperature = NexText (0, 4, "t1");

char buffer[100] = { 0 };

NexTouch *nex_listen_list[] = { &b0, &b1, NULL };

float setTemperature = 25.0;
uint32_t timer;

/*
* Button0 component pop callback function.
* In this example,the value of the text component will plus one every time when button0 is released.
*/
void b0PopCallback(void *ptr) {

setTemperature += 1.0;
dtostrf(setTemperature, 4,1, buffer);
t0.setText(buffer);
}

/*
* Button1 component pop callback function.
* In this example,the value of the text component will minus one every time when button1 is released.
*/
void b1PopCallback(void *ptr) {
setTemperature -= 1.0;
dtostrf(setTemperature, 4,1, buffer);
t0.setText(buffer);}

void setup(void) {
Serial.begin(9600);
// sensors.begin(); /* Set the baudrate which is for debug and communicate with Nextion screen. */
nexInit();

/* Register the pop event callback functions */
b0.attachPop(b0PopCallback);
b1.attachPop(b1PopCallback);

dtostrf(setTemperature, 4,1, buffer);
t0.setText(buffer);

timer = millis();
}

void loop(void) {
//
// een keer per seconde updaten
//
if (millis() - timer > 1000) {
// sensors.requestTemperatures();
float temperatuur = 24.6;
dtostrf(temperatuur, 4, 1, buffer);
temperature.setText(buffer);
timer = millis();
}
nexLoop(nex_listen_list);
}


Ik heb geen dallas sensor dus dat moet je zelf ff testen.

Werkt als een tierelier
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 118
Geregistreerd: 28 Dec 2014, 23:20
Woonplaats: Bilzen BE

Re: Nextion CompText voorbeeld

Berichtdoor Dries » 19 Feb 2017, 14:25

Dit werkt Nico, super! Ik heb een led toegevoegd die aangaat als de setTemperature lager is dan de waarde van de sensor.
Altijd prettig als je vanaf een goede basis kunt starten, ik dacht initieel om van een voorbeeld te vertrekken van Nextion zelf....
nog een vraagje, wat is de functie van die delay in de loop? ik weet wat een delay doet maar waarom is deze nodig?
nogmaals bedankt voor de hulp

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

Re: Nextion CompText voorbeeld

Berichtdoor nicoverduin » 19 Feb 2017, 15:08

Omdat je anders je serial gaat overloaden met dezelfde info wat een beetje zinloos is. 1 x per seconde lijkt mij voldoende....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 118
Geregistreerd: 28 Dec 2014, 23:20
Woonplaats: Bilzen BE

Re: Nextion CompText voorbeeld

Berichtdoor Dries » 19 Feb 2017, 15:17

ok makes sense :mrgreen:

Berichten: 118
Geregistreerd: 28 Dec 2014, 23:20
Woonplaats: Bilzen BE

Re: Nextion CompText voorbeeld

Berichtdoor Dries » 26 Feb 2017, 00:31

Nu loop ik op een volgende probleemje aan, ik heb twee tekstvelden toegevoegd om de tijd te tonen van de RTC, de knoppen reageren niet goed bij het indrukken, ik moet verschiilende keren drukken om de waarde te kunnen verhogen of verlagen, de knoppen lijken niet goed te reageren.
de Code:
#include "Nextion.h"
#include <DallasTemperature.h>
#include <Wire.h>
#include "RTClib.h"
SoftwareSerial HMISerial(9,10);
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

NexText b0 = NexText (0, 2, "b0");
NexButton b1 = NexButton (0, 3, "b1");
NexButton t0 = NexButton (0, 1, "t0");
NexText temperature = NexText (0, 4, "t1");
NexText uur = NexText(0, 8, "t4");
NexText minuten = NexText(0, 10, "t6");

char buffer[100] = { 0 };

RTC_DS1307 RTC;
DateTime CurrentTime;

int thermostaat = 13;
int voeding = 3;
float setTemperature = 25.0;
uint32_t timer;
uint32_t number = 0;

NexTouch *nex_listen_list[] = { &b0, &b1, NULL };

void b0PopCallback(void *ptr) {

setTemperature += 0.5;
dtostrf(setTemperature, 4,1, buffer);
t0.setText(buffer);
}

void b1PopCallback(void *ptr) {
setTemperature -= 0.5;
dtostrf(setTemperature, 4,1, buffer);
t0.setText(buffer);
}




void temperatuur() {

sensors.requestTemperatures();
float temperatuur = sensors.getTempCByIndex(0);
dtostrf(temperatuur, 4, 1, buffer);
temperature.setText(buffer);
//Serial.println(sensors.getTempCByIndex(0));
if (temperatuur < setTemperature) {
digitalWrite(thermostaat, HIGH);
}
else {
digitalWrite(thermostaat, LOW);
}


}

void tijd() {
number = CurrentTime.hour();
memset(buffer, 0, sizeof(buffer));
itoa(number, buffer, 10);
uur.setText(buffer);

number = CurrentTime.minute();
memset(buffer, 0, sizeof(buffer));
itoa(number, buffer, 10);
minuten.setText(buffer);
}

void setup(void) {
Serial.begin(9600);
nexInit();
b0.attachPop(b0PopCallback);
b1.attachPop(b1PopCallback);
Wire.begin();
RTC.begin();
sensors.begin();
pinMode(voeding, HIGH);
pinMode(thermostaat, HIGH);
digitalWrite(voeding, HIGH);

dtostrf(setTemperature, 4,1, buffer);
t0.setText(buffer);

timer = millis();
}

void loop(void) {
CurrentTime = RTC.now();
if (millis() - timer > 1000) {
temperatuur();


timer = millis();
}


nexLoop(nex_listen_list);
tijd();
}

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

Re: Nextion CompText voorbeeld

Berichtdoor nicoverduin » 26 Feb 2017, 00:47

Je bent continu bezig de tijd op het scherm te zetten dus is er geen tijd bijna om de knoppen te verwerken
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 118
Geregistreerd: 28 Dec 2014, 23:20
Woonplaats: Bilzen BE

Re: Nextion CompText voorbeeld

Berichtdoor Dries » 26 Feb 2017, 14:03

Klopt Nico, ik heb het veranderd en dit werkt perfect. het laatste stukje van de puzzel. ik heb een dimmer programma van GitHub geplukt destijds en dit programma werkt nu al een paar jaar perfect hier. nu heb ik getracht dit programma in deze code toe te voegen met het resultaat dat het scherm geen waardes meer weergeeft maar dat de knoppen wel werken en het dimmer gedeelte ook.Dus er verschijnt niets op t0, t1, t4 en t6, maar het programma werkt wel (het is moeilijk uit te leggen).

de dimmercode:
cpp code
#include <Wire.h>
#include "RTClib.h"
#include "ChannelManager.h"

const int MaxChannels = 1;
const int MaxPoints = 10;
RTC_DS1307 RTC;
DateTime CurrentTime;

Channel Channels[MaxChannels];
Point Points[MaxChannels][MaxPoints];

void InitializeChannels(int channels) {
int channelNo = 0;
int pin = 13;
Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]);
Channels[channelNo].AddPoint(6, 0, 0);
Channels[channelNo].AddPoint(10, 0, 255);
Channels[channelNo].AddPoint(10, 30, 190);
Channels[channelNo].AddPoint(21, 30, 190);
Channels[channelNo].AddPoint(22, 0, 255);
Channels[channelNo].AddPoint(23, 59, 0);
}


long lastUpdateTime = 0;

void UpdateLights(DateTime currentTime)
{
long now = Seconds(currentTime.hour(), currentTime.minute(), currentTime.second());
if(now != lastUpdateTime)
{
for(int channel = 0; channel < MaxChannels; channel++)
{
analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now));
}
}
lastUpdateTime = now;
}

long Seconds(int hours, int minutes, int seconds) {
return ((long)hours * 60 * 60) + (minutes * 60) + seconds ;
}

void setup() {

InitializeChannels(MaxChannels);
Wire.begin();
RTC.begin();
}


void loop() {
CurrentTime = RTC.now();
UpdateLights(CurrentTime);
}




mijn code nu:
cpp code
#include "Nextion.h"
#include <DallasTemperature.h>
#include <Wire.h>
#include "RTClib.h"
#include "ChannelManager.h"
SoftwareSerial HMISerial(9,10);
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

NexText b0 = NexText (0, 2, "b0");
NexButton b1 = NexButton (0, 3, "b1");
NexButton t0 = NexButton (0, 1, "t0");
NexText temperature = NexText (0, 4, "t1");
NexText uur = NexText(0, 8, "t4");
NexText minuten = NexText(0, 10, "t6");

char buffer[100] = { 0 };

RTC_DS1307 RTC;
DateTime CurrentTime;
const int MaxChannels = 1;
const int MaxPoints = 10;
int thermostaat = 13;
int voeding = 3;
float setTemperature = 25.0;
uint32_t timer;
uint32_t number = 0;
Channel Channels[MaxChannels];
Point Points[MaxChannels][MaxPoints];
NexTouch *nex_listen_list[] = { &b0, &b1, NULL };

void b0PopCallback(void *ptr) {

setTemperature += 0.5;
dtostrf(setTemperature, 4,1, buffer);
t0.setText(buffer);
}

void b1PopCallback(void *ptr) {
setTemperature -= 0.5;
dtostrf(setTemperature, 4,1, buffer);
t0.setText(buffer);
}

void InitializeChannels(int channels) {


// Channel 0:
int channelNo = 0; // Currently editing channel 0
int pin = 11; // Channel 0 uses pin 10
Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]); // Initialize channel and choose FadeMode
Channels[channelNo].AddPoint(6, 0, 0); // Add Point (can also use decimal values ranging from 0 to 1 if you prefer)
Channels[channelNo].AddPoint(10, 0, 255);
Channels[channelNo].AddPoint(10, 30, 190);
Channels[channelNo].AddPoint(21, 30, 190);
Channels[channelNo].AddPoint(22, 0, 255);
Channels[channelNo].AddPoint(23, 59, 0);

}

long lastUpdateTime = 0;


void UpdateLights(DateTime currentTime)
{
long now = Seconds(currentTime.hour(), currentTime.minute(), currentTime.second());
if(now != lastUpdateTime)
{
for(int channel = 0; channel < MaxChannels; channel++)
{
analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now));
}
}
lastUpdateTime = now;
}

long Seconds(int hours, int minutes, int seconds) {
return ((long)hours * 60 * 60) + (minutes * 60) + seconds ;
}
void temperatuur() {

sensors.requestTemperatures();
float temperatuur = sensors.getTempCByIndex(0);
dtostrf(temperatuur, 4, 1, buffer);
temperature.setText(buffer);
Serial.println(sensors.getTempCByIndex(0));
if (temperatuur < setTemperature) {
digitalWrite(thermostaat, HIGH);
}
else {
digitalWrite(thermostaat, LOW);
}
}

void tijd() {
number = CurrentTime.hour();
memset(buffer, 0, sizeof(buffer));
itoa(number, buffer, 10);
uur.setText(buffer);

number = CurrentTime.minute();
memset(buffer, 0, sizeof(buffer));
itoa(number, buffer, 10);
minuten.setText(buffer);
}

void setup(void) {
Serial.begin(9600);
nexInit();
b0.attachPop(b0PopCallback);
b1.attachPop(b1PopCallback);
InitializeChannels(MaxChannels);
Wire.begin();
RTC.begin();
sensors.begin();
pinMode(voeding, HIGH);
pinMode(thermostaat, HIGH);
digitalWrite(voeding, HIGH);
dtostrf(setTemperature, 4,1, buffer);
t0.setText(buffer);

timer = millis();
}

void loop(void) {

if (millis() - timer > 1000) {
CurrentTime = RTC.now();
UpdateLights(CurrentTime);
temperatuur();
tijd();

timer = millis();
}


nexLoop(nex_listen_list);

}


nu moet ik wel zeggen dat ik nog weinig geheugen beschikbaar heb op de Uno, misschien dat het daarmee te maken heeft, anders moet ik de MEGA terug aankoppelen.

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

Re: Nextion CompText voorbeeld

Berichtdoor nicoverduin » 26 Feb 2017, 15:12

Weinig geheugen is een relatief begrip..... Hoeveel is belangrijker....

Daarnaast kun je tijd() vervangen door dit:
cpp code
void tijd() {
char tijdBuffer[6]; // lokale buffer om de tijd in een char array te zetten hh:mm
uint8_t uren = CurrentTime.hour(); // ophalen tijd
uint8_t minuten = CurrentTime.hour();
sprintf(tijdBuffer, "%d:%02d", uren, minuten);
uur.setText(buffer); // alles komt nu in uren hh:mm dus je zult dat op je nextion scherm moeten aanpassen
}


char buffer[100] mag in de vuilnisbak. Die gebruik je alleen voor de tijd en die wordt niet meer gebruikt.... weer 100 bytes vrij....

Het kan sowieso geen kwaad om eens te kijken of je een variabele Globaal of alleen lokaal gebruikt. Als het niet globaal nodig is, dan moet je dat niet doen. Lokale variabelen worden weer vrij gegeven waardoor je met meerdere functies hetzelfde RAM geheugen gebruikt.

dus:

cpp code
char buffer[100] = { 0 };                                  // kan de vuilnisbak in. gebruik je niet meer

RTC_DS1307 RTC;
DateTime CurrentTime; // wordt alleen in de loop gebruikt dus naar de loop verplaatsen
const int MaxChannels = 1;
const int MaxPoints = 10;
int thermostaat = 13; // is een pinummer dus maak er const int van enz. scheelt 2 bytes
int voeding = 3; // idem weer 2 bytes
float setTemperature = 25.0;
uint32_t timer;
uint32_t number = 0; // zowel uren als minuten passen in een uint8_t. Dus dat scheelt 3 bytes. daarnaast had het lokaal gekunt. in dit geval kan het de vuilnisbak in
Channel Channels[MaxChannels]; // geen idee hoe groot Channel is
Point Points[MaxChannels][MaxPoints];
NexTouch *nex_listen_list[] = { &b0, &b1, NULL };


En gebruik nu eens de <CTRL-T> functie om je code te fatsoeneren..... Slordige code zegt iets over de auteur.....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 118
Geregistreerd: 28 Dec 2014, 23:20
Woonplaats: Bilzen BE

Re: Nextion CompText voorbeeld

Berichtdoor Dries » 27 Feb 2017, 10:04

Als ik de char buffer[100] = { 0 } weg laat, vliegt ie in de stress want deze wordt voor de knopjes gebruikt en om de temperatuur te laten tonen. Of ben ik mis?

VorigeVolgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten