Arduino code voor aansturing Nextion scherm
5 berichten
• Pagina 1 van 1
Arduino code voor aansturing Nextion scherm
Hallo allemaal,
Ik ben helemaal nieuw in Arduino land en al helemaal kwa programmeren.
Ik zoek iemand wie mij zou willen helpen ben bezig met een Geiger Counter Project de counter zelf werkt al de aansturings software vanuit arduino en nextion scherm in grote lijnen alleen wil ik wat specifieke dingen in de code zoals
stel de meting is normaal moet hij iets op het scherm tonen in het groen als de waarden licht verhoogd zijn in het orange en bij gevaarlijke waarden in het rood.
Wij kan en wil mij helpen zit al dagen hoofdpijn te krijgen omdat ik er zelf niet uitkom. Ik woon in Delft
Stuur effe een reactie als je wilt / kunt helpen. Kennis van een Geiger Counter is niet nodig die werkt namelijk al wel heel leerzaam
Groeten
Tom
Ik ben helemaal nieuw in Arduino land en al helemaal kwa programmeren.
Ik zoek iemand wie mij zou willen helpen ben bezig met een Geiger Counter Project de counter zelf werkt al de aansturings software vanuit arduino en nextion scherm in grote lijnen alleen wil ik wat specifieke dingen in de code zoals
stel de meting is normaal moet hij iets op het scherm tonen in het groen als de waarden licht verhoogd zijn in het orange en bij gevaarlijke waarden in het rood.
Wij kan en wil mij helpen zit al dagen hoofdpijn te krijgen omdat ik er zelf niet uitkom. Ik woon in Delft
Stuur effe een reactie als je wilt / kunt helpen. Kennis van een Geiger Counter is niet nodig die werkt namelijk al wel heel leerzaam
Groeten
Tom
Advertisement
Re: Arduino code voor aansturing Nextion scherm
Hallo en welkom op dit forum.
Ik weet niet of er iemand in de buurt van Delft woont (om een Paracetamol te brengen).
Kun je vertellen wat al werkt en wat het probleem is ?
Gebruik je de Nextion-Arduino library ?
Kun je een getal op het scherm laten zien ? Is de kleur het probleem ?
Ik zie dat er een functie "Set_font_color_pco()" is, dat is misschien de kleur voor de tekst.
De term "pco" gebruiken zij voor de voorgrondkleur van de tekst.
Dat is in het RGB565 formaat, of een voorgeprogrammeerde kleur: https://nextion.tech/instruction-set/#s5.
Ik weet niet of er iemand in de buurt van Delft woont (om een Paracetamol te brengen).
Kun je vertellen wat al werkt en wat het probleem is ?
Gebruik je de Nextion-Arduino library ?
Kun je een getal op het scherm laten zien ? Is de kleur het probleem ?
Ik zie dat er een functie "Set_font_color_pco()" is, dat is misschien de kleur voor de tekst.
De term "pco" gebruiken zij voor de voorgrondkleur van de tekst.
Dat is in het RGB565 formaat, of een voorgeprogrammeerde kleur: https://nextion.tech/instruction-set/#s5.
Re: Arduino code voor aansturing Nextion scherm
De Geiger Counter zelf werkt en hij zet ook al data naar het Nextion schem alleen krijg ik het waarschuwings stukje niet aan de praat
Hij moet namelijk afhankelijk van de CPM Counts Per Minute een tekst plaatsen met een achtergrond kleur
Lage waarden onder de 25 CPM Tekst : NORMAL BACKGROUND Kleur: Groen
Boven de 25 onder de 60 CPM Tekst : ELEVATED ACTIVITY Kleur: Orange
Boven de 60 CPM Tekst HIGH RADIATION LEVEL Kleur Rood
Mijn code :
//Begin
//Voor de Arduino Mega
#include "Nextion.h"
//#define nexSerial Serial1 Nextion aansluiten op TX2 (Pin 16)Geel / RX2 (Pin 17)Blauw
#define CONV_FACTOR_J305 0.008120 // GEIGER_TUBE_J305ß counts to uSv/hr multiplier //
char countsBuffer[100] = {0}; // char countsBuffer[tekens] = [0];
char cpmBuffer[100] = {0};
char uSvBuffer[100] = {0};
NexText t0 = NexText(0, 1, "t0"); // NexText t0 = NexText(page, id, "objname");
NexText t1 = NexText(0, 2, "t1");
NexText t2 = NexText(0, 3, "t2");
NexText t3 = NexText(0, 4, "t3");
NexText t4 = NexText(0, 5, "t4");
#define AVG_PERIOD 15000 // CPM-uitvoerperiode in milliseconden, 15000-60000 aanbevolen
#define ONE_MINUTE 60000 // maskeerperiode van monitoring
unsigned long counts; // variabele voor het opnemen van het aantal pulsen van de handset
unsigned long cpm; // variabele voor CPM (aantal decays per minuut)
unsigned int multiplier; // vermenigvuldiger voor het berekenen van CPM
void tube_impulse() { // externe interrupt-handler
counts++; // waar is het aantal pulsen per segment LOG_PERIOD
}
// NexTouch *nex_listen_list[] = //Laat het scherm "luisteren" naar de binnenkomende gegevens
// {
// &t0,
// &t1,
// &t2,
// &t3,
// &t4,
// NULL
// };
void setup() // Presets
{
counts = 0; // reset de pulsteller
cpm = 0; // ongeldige CPM
//nexSerial.begin(9600); // poortsnelheid 9600 nexSerial
nexInit();
Serial.begin(9600); // poortsnelheid 9600 Arduino
multiplier = ONE_MINUTE / AVG_PERIOD; // berekening van de vermenigvuldiger voor het omzetten van pulsen naar CPM
pinMode(19, INPUT); // maak pin 2 input 19
digitalWrite(19, HIGH); // Use internal pullup resistor
attachInterrupt(0, tube_impulse, FALLING); // externe interrupt op pin 2 bij het veranderen van het niveau van 1 naar 0
Serial.println("RadiationD-v1.1 (CAJOE)");
Serial.println("=========================================");
Serial.print("Please stand by for ");
Serial.print(AVG_PERIOD / 1000);
Serial.println(" sec. for first reading...");
Serial.println();
}
void loop() // Lus
{
static unsigned long then;
unsigned long now = millis();
double uSv; // Approx radiation level in microsieverts
if (now - then > AVG_PERIOD) {
then = now;
if (counts) { // i.e., if (counts != 0)
cpm = counts * multiplier;
uSv = cpm * CONV_FACTOR_J305;
} else {
uSv = 0;
}
Serial.print("counts: ");
Serial.print(counts);
sprintf(countsBuffer, "counts: %02u ", counts);
t0.setText(countsBuffer);
Serial.print(" CPM: ");
Serial.print(cpm);
sprintf(cpmBuffer, "cpm: %02u ", cpm);
t1.setText(cpmBuffer);
Serial.print(" uSv/hr: ");
Serial.println(uSv, 4); // Display 4 decimal places
sprintf(uSvBuffer, "uSv: %02u ", uSv);
t2.setText(uSvBuffer);
if (cpm < 25)
{Serial.print ("t4.pco = 31");
t4.setText("NORMAL BACKGROUND");}
else if (cpm > 60)
t4.setText("HIGH RADIATION LEVEL");
else if (cpm > 25)
t4.setText("ELEVATED ACTIVITY");
counts = 0, cpm = 0;
}
delay(100); // TODO: more efficient form of power saving/sleep
}
//Einde
------------------------------------------------------------------------------------------------------------------
Met dit stukje code ben ik nu aan het klooien om het aan de praat te krijgen:
if (cpm < 25)
{Serial.print ("t4.pco = 31");
t4.setText("NORMAL BACKGROUND");}
else if (cpm > 60)
t4.setText("HIGH RADIATION LEVEL");
else if (cpm > 25)
t4.setText("ELEVATED ACTIVITY");
Zoals gezegd heb ik pas een paar dagen programmeer ervaring voorlopig kun je het zoeken, vinden, knippen en plakken ervaring noemen en de geiger counter zelf werkt ook de uitvoer naar het Nextion scherm werkt krijg alleen het waarschuwings systeem niet goed geen goede voorbeelden kunnen vinden hoe ik dat kan schrijven en de kleur werkt niet
Groeten
Tom
Hij moet namelijk afhankelijk van de CPM Counts Per Minute een tekst plaatsen met een achtergrond kleur
Lage waarden onder de 25 CPM Tekst : NORMAL BACKGROUND Kleur: Groen
Boven de 25 onder de 60 CPM Tekst : ELEVATED ACTIVITY Kleur: Orange
Boven de 60 CPM Tekst HIGH RADIATION LEVEL Kleur Rood
Mijn code :
//Begin
//Voor de Arduino Mega
#include "Nextion.h"
//#define nexSerial Serial1 Nextion aansluiten op TX2 (Pin 16)Geel / RX2 (Pin 17)Blauw
#define CONV_FACTOR_J305 0.008120 // GEIGER_TUBE_J305ß counts to uSv/hr multiplier //
char countsBuffer[100] = {0}; // char countsBuffer[tekens] = [0];
char cpmBuffer[100] = {0};
char uSvBuffer[100] = {0};
NexText t0 = NexText(0, 1, "t0"); // NexText t0 = NexText(page, id, "objname");
NexText t1 = NexText(0, 2, "t1");
NexText t2 = NexText(0, 3, "t2");
NexText t3 = NexText(0, 4, "t3");
NexText t4 = NexText(0, 5, "t4");
#define AVG_PERIOD 15000 // CPM-uitvoerperiode in milliseconden, 15000-60000 aanbevolen
#define ONE_MINUTE 60000 // maskeerperiode van monitoring
unsigned long counts; // variabele voor het opnemen van het aantal pulsen van de handset
unsigned long cpm; // variabele voor CPM (aantal decays per minuut)
unsigned int multiplier; // vermenigvuldiger voor het berekenen van CPM
void tube_impulse() { // externe interrupt-handler
counts++; // waar is het aantal pulsen per segment LOG_PERIOD
}
// NexTouch *nex_listen_list[] = //Laat het scherm "luisteren" naar de binnenkomende gegevens
// {
// &t0,
// &t1,
// &t2,
// &t3,
// &t4,
// NULL
// };
void setup() // Presets
{
counts = 0; // reset de pulsteller
cpm = 0; // ongeldige CPM
//nexSerial.begin(9600); // poortsnelheid 9600 nexSerial
nexInit();
Serial.begin(9600); // poortsnelheid 9600 Arduino
multiplier = ONE_MINUTE / AVG_PERIOD; // berekening van de vermenigvuldiger voor het omzetten van pulsen naar CPM
pinMode(19, INPUT); // maak pin 2 input 19
digitalWrite(19, HIGH); // Use internal pullup resistor
attachInterrupt(0, tube_impulse, FALLING); // externe interrupt op pin 2 bij het veranderen van het niveau van 1 naar 0
Serial.println("RadiationD-v1.1 (CAJOE)");
Serial.println("=========================================");
Serial.print("Please stand by for ");
Serial.print(AVG_PERIOD / 1000);
Serial.println(" sec. for first reading...");
Serial.println();
}
void loop() // Lus
{
static unsigned long then;
unsigned long now = millis();
double uSv; // Approx radiation level in microsieverts
if (now - then > AVG_PERIOD) {
then = now;
if (counts) { // i.e., if (counts != 0)
cpm = counts * multiplier;
uSv = cpm * CONV_FACTOR_J305;
} else {
uSv = 0;
}
Serial.print("counts: ");
Serial.print(counts);
sprintf(countsBuffer, "counts: %02u ", counts);
t0.setText(countsBuffer);
Serial.print(" CPM: ");
Serial.print(cpm);
sprintf(cpmBuffer, "cpm: %02u ", cpm);
t1.setText(cpmBuffer);
Serial.print(" uSv/hr: ");
Serial.println(uSv, 4); // Display 4 decimal places
sprintf(uSvBuffer, "uSv: %02u ", uSv);
t2.setText(uSvBuffer);
if (cpm < 25)
{Serial.print ("t4.pco = 31");
t4.setText("NORMAL BACKGROUND");}
else if (cpm > 60)
t4.setText("HIGH RADIATION LEVEL");
else if (cpm > 25)
t4.setText("ELEVATED ACTIVITY");
counts = 0, cpm = 0;
}
delay(100); // TODO: more efficient form of power saving/sleep
}
//Einde
------------------------------------------------------------------------------------------------------------------
Met dit stukje code ben ik nu aan het klooien om het aan de praat te krijgen:
if (cpm < 25)
{Serial.print ("t4.pco = 31");
t4.setText("NORMAL BACKGROUND");}
else if (cpm > 60)
t4.setText("HIGH RADIATION LEVEL");
else if (cpm > 25)
t4.setText("ELEVATED ACTIVITY");
Zoals gezegd heb ik pas een paar dagen programmeer ervaring voorlopig kun je het zoeken, vinden, knippen en plakken ervaring noemen en de geiger counter zelf werkt ook de uitvoer naar het Nextion scherm werkt krijg alleen het waarschuwings systeem niet goed geen goede voorbeelden kunnen vinden hoe ik dat kan schrijven en de kleur werkt niet
Groeten
Tom
Re: Arduino code voor aansturing Nextion scherm
Als je een "t4.setText()" doet, zie je dan die tekst op het scherm ? Als dat werkt dan gaat het wel lukken.
Ik heb een Nextion klokje op mijn tafel staan, maar ik ben van de ITEAD-Arduino library afgestapt. Helaas ben ik vergeten hoe dat ging met de library.
Zouden ze nog steeds RGB565 gebruiken ?
Probeer dan dit eens:
cpp code
Als je een Arduino Mega 2560 board gebruikt, dan is dat heel goed. Dan kun je het Nextion scherm aan een hardware serial port hangen. Wanneer je SoftwareSerial gebruikt, dan kun je problemen verwachten. Gebruik de SoftwareSerial alleen als het echt niet anders kan, en gebruikt het dan nog niet
Deze code die je vond: Serial.print ("t4.pco = 31");
dat is voor als het Nextion scherm verbonden is met "Serial" en je zelf het commando gaat versturen. Wat de Set_font_color_pco() functie doet is niets anders dan dat commando versturen, met nog wat extra code er om heen.
Je gebruikt geen "nexLoop(nex_listen_list);" ? Mag dat zomaar weggelaten worden ? Je kunt nu ook niet op het scherm op iets drukken.
Wanneer het stukje code werkt, en je ziet ook echt de kleur oranje, dan kun je deze functie misschien toevoegen:
Er bestaat een "zeef methode" om iets naar verschillende grootte te sorteren: https://www.arduinoforum.nl/viewtopic.php?f=8&t=3877#p26183.
Dat klinkt met woorden omschreven zo:
Nou, eerst eens even afhandelen wat groter dan 60 is, dan hebben we dat maar gehad.
Als het niet groter dan 60 is, is het dan misschien groter dan 25. De waarde is dan dus tussen de 25 en 60.
Als het zelfs niet groter dan 25 is, dan blijft er niets anders over dan dat het kleiner dan 25 moet zijn.
Wanneer je een sketch op dit forum zet, kun je de sketch dan tussen code-tags plaatsen ?
De knop "Code" heeft de tags: "[ code ]" en "[ / code ]".
De "Select a Syntax" en dan "C++" heeft de tags: "[ code2 = cpp ]" en "[ / code2 ]".
Ik heb een Nextion klokje op mijn tafel staan, maar ik ben van de ITEAD-Arduino library afgestapt. Helaas ben ik vergeten hoe dat ging met de library.
Zouden ze nog steeds RGB565 gebruiken ?
Probeer dan dit eens:
cpp code
#define RGB565_ORANGE 64288
...
if( cpm > 60)
{
t4.Set_font_color_pco( RED);
t4.setText( "HIGH RADIATION LEVEL");
}
else if( cpm > 25) // tussen 25 en 60
{
t4.Set_font_color_pco( RGB565_ORANGE);
t4.setText( "ELEVATED ACTIVITY");
}
else // lager dan 25
{
t4.Set_font_color_pco( GREEN);
t4.setText( "NORMAL BACKGROUND");
}
Als je een Arduino Mega 2560 board gebruikt, dan is dat heel goed. Dan kun je het Nextion scherm aan een hardware serial port hangen. Wanneer je SoftwareSerial gebruikt, dan kun je problemen verwachten. Gebruik de SoftwareSerial alleen als het echt niet anders kan, en gebruikt het dan nog niet
Deze code die je vond: Serial.print ("t4.pco = 31");
dat is voor als het Nextion scherm verbonden is met "Serial" en je zelf het commando gaat versturen. Wat de Set_font_color_pco() functie doet is niets anders dan dat commando versturen, met nog wat extra code er om heen.
Je gebruikt geen "nexLoop(nex_listen_list);" ? Mag dat zomaar weggelaten worden ? Je kunt nu ook niet op het scherm op iets drukken.
Wanneer het stukje code werkt, en je ziet ook echt de kleur oranje, dan kun je deze functie misschien toevoegen:
- Code: Alles selecteren
// ---------------------------------------------
// rgb565 version 2
// ---------------------------------------------
// Convert a hexadecimal rgb value into a rgb565 format.
// To be able to use HTML RGB color format in a Arduino sketch.
//
// When a text is needed, then the result can converted into
// a decimal number as text with a sprintf with %u, or with utoa().
// Great HTML color picker tool:
// https://www.w3schools.com/colors/colors_picker.asp
uint16_t rgb565( const unsigned long rgb)
{
uint16_t R = (rgb >> 16) & 0xFF;
uint16_t G = (rgb >> 8) & 0xFF;
uint16_t B = (rgb ) & 0xFF;
uint16_t ret = (R & 0xF8) << 8; // 5 bits
ret |= (G & 0xFC) << 3; // 6 bits
ret |= (B & 0xF8) >> 3; // 5 bits
return( ret);
}
Er bestaat een "zeef methode" om iets naar verschillende grootte te sorteren: https://www.arduinoforum.nl/viewtopic.php?f=8&t=3877#p26183.
Dat klinkt met woorden omschreven zo:
Nou, eerst eens even afhandelen wat groter dan 60 is, dan hebben we dat maar gehad.
Als het niet groter dan 60 is, is het dan misschien groter dan 25. De waarde is dan dus tussen de 25 en 60.
Als het zelfs niet groter dan 25 is, dan blijft er niets anders over dan dat het kleiner dan 25 moet zijn.
Wanneer je een sketch op dit forum zet, kun je de sketch dan tussen code-tags plaatsen ?
De knop "Code" heeft de tags: "[ code ]" en "[ / code ]".
De "Select a Syntax" en dan "C++" heeft de tags: "[ code2 = cpp ]" en "[ / code2 ]".
5 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 55 gasten