načítání teplot do lcd nextion

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: načítání teplot do lcd nextion

Příspěvek od AstroMiK » 04 bře 2019, 17:30

Teď pro ten displej používám STMduino (modul BluePill). Má 3 nezávislé sériové linky, tak jsem jednu použil na komunikaci jen s displejem.

Neměl by ale být problém místo té linky Serial2, kterou používám já, vytvořit linku SoftwareSerial na obyčejném Arduinu (Uno / Nano).

Takže někam na začátek kódu vložit:

Kód: Vybrat vše

  SoftwareSerial Serial2(pin_rx, pin_tx);   // piny tx a rx podle potreby
A pak do setupu:

Kód: Vybrat vše

Serial2.begin(9600);    // stejne, jako rychlost displeje
A pak by měly fungovat ty příklady, které jsem psal v milulém příspěvku.
(Displej teď u sebe nemám, tak to nemůžu ověřit.)

crgo1977
Příspěvky: 36
Registrován: 20 led 2018, 20:16
Reputation: 0

Re: načítání teplot do lcd nextion

Příspěvek od crgo1977 » 04 bře 2019, 21:40

Zdravím.Díky za radu.
Pokoušel jsem se pozměnit můj kód tak jak bylo psáno.Bohužel mi to nefunguje.Myslím si,že budu mít problém zřejmě v knihovně.Pro Uno totiž neexistuje knihovna pro displeje nextion-je pouze pro MEGA a musí se upravit knihovna v souboru config.h .
Vkládám můj kód.Pokud má někdo displej a uno,prosím o vyzkoušení. Třeba někdo zjistí chybu.
Vyzkoušel jsem již mnoho rad a návodů,které jsem našel na internetu,ale nepochodil jsem.
Možná mám ještě někde chybu,kterou přehlížím.
Každou úpravu nahrávám i do arduina a zkouším i s displejem.

zkoušel jsem jak textový řádek,tak číselné pole.Zde v kódu je poslední pokus - číselné pole.

Kód: Vybrat vše

#include <Nextion.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SoftwareSerial.h>
#include "NexButton.h"
#include "NexText.h"
#include "NexNumber.h"
#include "Arduino.h"

//deklarace komunikace RX TX arduina s displejem - na pinech
#define co1_TX 1
#define co1_RX 0
SoftwareSerial nexSerial (co1_TX, co1_RX);

#define BUS_0 A0
#define BUS_1 A1
#define BUS_2 A2
#define BUS_3 A3
#define BUS_4 A4

OneWire oneWire0(BUS_0); 
OneWire oneWire1(BUS_1); 
OneWire oneWire2(BUS_2); 
OneWire oneWire3(BUS_3);
OneWire oneWire4(BUS_4);

//adresace senzorů dallas DS18b20
DallasTemperature sensors0(&oneWire0);
DallasTemperature sensors1(&oneWire1);
DallasTemperature sensors2(&oneWire2);
DallasTemperature sensors3(&oneWire3);
DallasTemperature sensors4(&oneWire4);

//deklarace objektů v displeji nextion
NexText t0 = NexText (0, 1, "t0");
NexText t1 = NexText (0, 2, "t1");
NexText t2 = NexText (0, 3, "t2");
NexText t3 = NexText(0, 4, "t3");
NexText t4 = NexText(0, 5, "t4");
NexNumber n0 = NexNumber (0, 21, "n0");
NexNumber n1 = NexNumber(0, 22, "n1");
NexNumber n2 = NexNumber(0, 23, "n2");
NexNumber n3 = NexNumber(0, 24, "n3");
NexNumber n4 = NexNumber(0, 25, "n4");
NexButton button0 = NexButton(0, 6, "buton0");
NexButton button1 = NexButton(0, 7, "buton1");
NexButton button2 = NexButton(0, 8, "buton2");
NexButton button3 = NexButton(0, 9, "buton3");
NexButton button4 = NexButton(0, 10, "buton4");

char buffer [100];

NexTouch *nex_listen_list[] =
{
      &t0,
      &t1,
      &t2,
      &t3,
      &t4,
      &n0,
      &n1,
      &n2,
      &n3,
      &n4,
      &button0,
      &button1,
      &button2,
      &button3,
      &button4,
      NULL
};

int tx0;
int tx1;
int tx2;
int tx3;
int tx4;

int Rele0 = 6;
int Rele1 = 7;
int Rele2 = 8;
int Rele3 = 9;
int Rele4 = 10;
int Rele5 = 11;
int Rele6 = 12;
int Rele7 = 13;

int teplota0;
int teplota1;
int teplota2;
int teplota3;
int teplota4;

int val0;
int val1;
int val2;
int val3;
int val4;

void setup(void)
{
pinMode(Rele0,OUTPUT);
pinMode(Rele1,OUTPUT);
pinMode(Rele2,OUTPUT);
pinMode(Rele3,OUTPUT);
pinMode(Rele4,OUTPUT);
pinMode(Rele5,OUTPUT);
pinMode(Rele6,OUTPUT);
pinMode(Rele7,OUTPUT);

  
Serial.begin(9600);
nexSerial.begin(9600);

delay(500);

//connect();


sensors0.begin();
sensors1.begin();
sensors2.begin();
sensors3.begin();
sensors4.begin();

tx0 = 24;
tx1 = 24;
tx2 = 24;
tx3 = 24;
tx4 = 24;

   }

void SerialFFF(void)
   {
    nexSerial.write(255);
    nexSerial.write(255);
    nexSerial.write(255);
   }
void loop(void)
{
  
  sensors0.requestTemperatures();
  sensors1.requestTemperatures();
  sensors2.requestTemperatures();
  sensors3.requestTemperatures();
  sensors4.requestTemperatures();
  
  int teplota0 (sensors0.getTempCByIndex(0));
  int teplota1 (sensors1.getTempCByIndex(0));
  int teplota2 (sensors2.getTempCByIndex(0));
  int teplota3 (sensors3.getTempCByIndex(0));
  int teplota4 (sensors4.getTempCByIndex(0));

  Serial.print("   Teplota 0:  ");
  Serial.print(teplota0);
  Serial.print("   Teplota 1:  ");
  Serial.print(teplota1);
  Serial.print("   Teplota 2:  ");
  Serial.print(teplota2);
  Serial.print("   Teplota 3:  ");
  Serial.print(teplota3);
  Serial.print("   Teplota 4:  ");
  Serial.println(teplota4);

  nexSerial.print("n0.val=");
  nexSerial.print(30);
  SerialFFF();
  
//řízení teploty

val0 = (teplota0); 
if(teplota0 == -127 ){        //teplota větší než nastavená
  Serial.print("       OFF 0"); //zobrazení v seriovém monitoru
  digitalWrite(Rele0, HIGH);      //výstupní pin relé
  digitalWrite(Rele1, HIGH);  
 }
else if(teplota0 >= tx0 ){        //teplota větší než nastavená
  Serial.print("       OFF 0"); //zobrazení v seriovém monitoru
  digitalWrite(Rele0, HIGH);      //výstupní pin relé
  //delay(5000);                     //prodleva
  digitalWrite(Rele1, HIGH);      //výstupní pin relé
 }
else if(teplota0  <= tx0-1 ){       //teplota menší než nastavená
  Serial.print("       ON 0");   //zobrazení v seriovém monitoru
  digitalWrite(Rele0, LOW);      //výstupní pin relé
  //delay(5000);                     //prodleva
  digitalWrite(Rele1, LOW);      //výstupní pin relé  
}

val1 = (teplota1);
if(teplota1 == -127 ){        //teplota větší než nastavená
  Serial.print("               OFF 0"); //zobrazení v seriovém monitoru
  digitalWrite(Rele2, HIGH);      //výstupní pin relé
  digitalWrite(Rele3, HIGH);  
}
else if(teplota1 >= tx1 ){        //teplota větší než nastavená
  Serial.print("               OFF 0"); //zobrazení v seriovém monitoru
  digitalWrite(Rele2, HIGH);      //výstupní pin relé
  //delay(5000);                     //prodleva
  digitalWrite(Rele3, HIGH);      //výstupní pin relé
 }
else if(teplota1  <= tx1-1 ){       //teplota menší než nastavená
  Serial.print("               ON 0");   //zobrazení v seriovém monitoru
  digitalWrite(Rele2, LOW);      //výstupní pin relé
  //delay(5000);                     //prodleva
  digitalWrite(Rele3, LOW);      //výstupní pin relé
}
val2 = (teplota2);
if(teplota2 == -127 ){        //teplota větší než nastavená
  Serial.print("             OFF 0"); //zobrazení v seriovém monitoru
  digitalWrite(Rele4, HIGH);      //výstupní pin relé
  digitalWrite(Rele5, HIGH);  
}
else if(teplota2 >= tx2 ){        //teplota větší než nastavená
  Serial.print("             OFF 0"); //zobrazení v seriovém monitoru
  digitalWrite(Rele4, HIGH);      //výstupní pin relé
  //delay(5000);                     //prodleva
  digitalWrite(Rele5, HIGH);      //výstupní pin relé
 }
else if(teplota2  <= tx2-1 ){       //teplota menší než nastavená
  Serial.print("             ON 0");   //zobrazení v seriovém monitoru
  digitalWrite(Rele4, LOW);      //výstupní pin relé
  //delay(5000);                     //prodleva
  digitalWrite(Rele5, LOW);      //výstupní pin relé
}
val3 = (teplota3);
if(teplota3 == -127 ){        //teplota větší než nastavená
  Serial.print("             OFF 0"); //zobrazení v seriovém monitoru
  digitalWrite(Rele6, HIGH);      //výstupní pin relé
}
else if(teplota3 >= tx3 ){        //teplota větší než nastavená
  Serial.print("             OFF 0"); //zobrazení v seriovém monitoru
  digitalWrite(Rele6, HIGH);      //výstupní pin relé
}
else if(teplota3  <= tx3-1 ){       //teplota menší než nastavená
  Serial.print("             ON 0");   //zobrazení v seriovém monitoru
  digitalWrite(Rele6, LOW);      //výstupní pin relé
}
val4 = (teplota4);
if(teplota4 == -127 ){        //teplota větší než nastavená
  Serial.print("             OFF 0"); //zobrazení v seriovém monitoru
  digitalWrite(Rele7, HIGH);      //výstupní pin relé
}  
else if(teplota4 >= tx4 ){        //teplota větší než nastavená
  Serial.println("             OFF 0"); //zobrazení v seriovém monitoru
  digitalWrite(Rele7, HIGH);      //výstupní pin relé
}
else if(teplota4  <= tx4-1 ){       //teplota menší než nastavená
  Serial.println("             ON 0");   //zobrazení v seriovém monitoru
  digitalWrite(Rele7, LOW);      //výstupní pin relé
}

}

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: načítání teplot do lcd nextion

Příspěvek od AstroMiK » 05 bře 2019, 07:38

Tady je funkční odzkoušený příklad na Arduinu NANO:

Kód: Vybrat vše


// priklad SoftwareSerial:
//    https://www.arduino.cc/en/Tutorial/SoftwareSerialExample
#include <SoftwareSerial.h>
SoftwareSerial nexSerial(10, 11); // RX, TX   (Nextion Tx pripojit na Arduino D10 Rx; Nextion Rx pripojit na Arduinio D11 Tx)


void setup(void)
  {
    nexSerial.begin(9600);
    
    nexSerial.print("t0.txt=\"odpocet\"");
    SerialFFF();

    for (byte i = 10; i > 0; i--)
      {
        nexSerial.print("n0.val=");
        nexSerial.print(i);
        SerialFFF();

        delay(1000);
        
      } 
  }
  
  
  

void SerialFFF(void)
   {
    nexSerial.write(255);
    nexSerial.write(255);
    nexSerial.write(255);
   }


void loop(void)
  {    
  }



Nepoužívá žádné knihovny Nextion.

Na displeji se nachází 2 objekty. Textové pole se jménem 't0' a číselné pole se jménem 'n0'.
Textové pole má nastavený parametr 'txt_maxl' na hodnotu 20
nextide.gif


Jestli ti ani tohle nepůjde, tak bych hledal chybu v těchto věcech:
- Prohozené dráty Tx, Rx
- špatně nastavená komunikační rychlost
- do textového pole se snažíš nacpat delší text, než je hodnota parametru 'txt_maxl'
- vadný displej

crgo1977
Příspěvky: 36
Registrován: 20 led 2018, 20:16
Reputation: 0

Re: načítání teplot do lcd nextion

Příspěvek od crgo1977 » 05 bře 2019, 12:16

Díky za pomoc.Tvůj příkload odzkouším.
Displej asi vadný nebude,když se s displejem propojím po seriové lince přes editor,jsem schopný to textového pole číslo poslat. Dráty kontroluju pokaždé když se s tím hraju a pokouším se to zprovoznit. Jak jsem již psal,je možné že dělám chybu v tom,že používám knihovnu.
Jak odzkouším,dám vědět.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: načítání teplot do lcd nextion

Příspěvek od AstroMiK » 05 bře 2019, 18:36

... Mimochodem, teď koukám na ten tvůj program, a trochu mě překvapila ta definice pinů pro SoftwareSerial.
Nemůže být problém v tom, že se snažíš vytvořit "virtuální" sériovou linku na úplně stejných pinech, jako je na Arduinu UNO původní "hardwérová" linka?

Kód: Vybrat vše

//deklarace komunikace RX TX arduina s displejem - na pinech
#define co1_TX 1
#define co1_RX 0
SoftwareSerial nexSerial (co1_TX, co1_RX);

crgo1977
Příspěvky: 36
Registrován: 20 led 2018, 20:16
Reputation: 0

Re: načítání teplot do lcd nextion

Příspěvek od crgo1977 » 05 bře 2019, 18:56

Zdravím,
tak jsem odzkoušel prográmek sem vložený. Funguje úplně skvěle. Jen jsem definoval piny které mám v mém programu.Tedy TX=1 a RX=0.
Jako další jsem to překopíroval do mého programu.Bohužel to nefungovalo. Ale pravděpodobně už vím kde bych mohl mít problém - Snímače teploty mi komunikují na 9600,ikdyž je mám nadefinovány 1 snímaš na jeden vstup.pin, a displej mám nastavený taktéž na 9600. Zkusím změnit komunikační rychlost - jestli se mi nehádají.
Díky za pomoc.Možná mi to ukázalo,kde bych mohl mít chybu.
Pokusím se o úpravu,odzkouším a dám vědět.

crgo1977
Příspěvky: 36
Registrován: 20 led 2018, 20:16
Reputation: 0

Re: načítání teplot do lcd nextion

Příspěvek od crgo1977 » 05 bře 2019, 21:34

Zdravím,
tak zkouším a zkouším,problém stejný. Vložený projekt funguje perfektně,po přenesení do mého projektu jsem v koncích. Změna rychlosti komunikace mi nepomohla. Displej si "hraje" na mrtvého brouka a nic se nezobrazí.
Nepochopil jsem otázku a vytváření virtuálního portu.Myslel jsem,že UNO má pouze jeden serial port a to na pinech 0 a 1 (jak jsem psal výše).
Ještě mne napadá,ale tím si vůbec nejsem jistý-nemohl by být problém i v tom,že mám při zkoušení připojené arduino přes kabel do USB v PC? Tím že si zobrazuji hodnoty v seriovém monitoru? Nemohl bych tím zasekat komunikaci s displejem?
Vím moc otázek,žádná odpověď. Třeba by někdo věděl jak to je.
Díky za rady a tipy.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: načítání teplot do lcd nextion

Příspěvek od pavel1tu » 05 bře 2019, 22:29

Knihovna "SoftwareSerial" vytváří druhý "virtuální" port pro komunikaci,
protože tento CPU Arduina umí jen jeden. Ta knihovna pak neustále "přepíná" mezi porty a máš vlastně 2.

Jedním máš připojený display, druhým "Serial monitor" a nahráváš pomocí něj.

Mám tu na stole malý Nextion, nezkoušel jsem přímo Tvůj kod,
mne normálně funguje knihovna pro Nextion a vyzkoušel jsem i tu verzi od AstroMika, to mi nefungovalo, ale já trubka tam nechal "n0" a přitom to mám pojmenované jinak - pak to v pohodě fungovalo ...
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

crgo1977
Příspěvky: 36
Registrován: 20 led 2018, 20:16
Reputation: 0

Re: načítání teplot do lcd nextion

Příspěvek od crgo1977 » 05 bře 2019, 23:04

Takže pokud jsem pochopil poslední příspěvek,pak bych mohl mít problém v tom,že tím jak jsem připojený k PC můžu blokovat komunikaci s displejem.
Ikdyž použiju jiné napájení pak mi knihovna bude přepínat mezi komunikací čidel a komunikací s displejem.
Chápu to správně.
Bylo by možné použít můj kód ( vyzkoušet )? Prozatím mi jde o to,aby se mi zobrazovaly teploty z čidel ( myslel jsem si,že to budu posílat do textového pole ),do budoucna bych chtěl ještě dodělat nastavování teploty - v současné době to mám napevno nastaveno jako tx0 až tx4. Toto bych chtěl změnit na nastavování z číselného pole.
Díky za ibformaci,každopádně mě to posouvá dál do tajů programování arduina.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: načítání teplot do lcd nextion

Příspěvek od AstroMiK » 06 bře 2019, 06:43

Změň si piny v SoftwareSerial a pak na ty piny připoj displej.
Jestli správně počítám, tak bys měl mít volné třeba piny 3 a 4.

Takže uprav kód na:

Kód: Vybrat vše

//deklarace komunikace RX TX arduina s displejem - na pinech
#define co1_TX 3
#define co1_RX 4
A displej pak připoj takto:
Displej Tx pripojit na Arduino D4 (co1_RX)
Displej Rx pripojit na Arduino D3 (co1_Tx)

Pak už se ti ty komunikace nebudou navzájem ovlivňovat.

----
Problém je v tom, že do displeje posíláš příkazy, kterým nerozumí:
Serial.print(" Teplota 0: ");

A pak ještě do toho občas pošleš kód, kterému by sice měl rozumět ("n0.val=25"#FF#FF#FF), ale protože už má zaplněný přijímací buffer neznámými řetězci, tak v tom ani ten známý příkaz nedokáže rozeznat a vykonat.

----
Ještě bys mohl vyzkoušet (ale to je jen pro zajímavost a asi to fungovat nebude) před každým příkazem, který je určený pro displej, spustit podprogram SerialFFF().

Tím by si displej měl přečíst data ve svém přijímacím bufferu (má tam nesmyslné texty, které jsi mu posílal a kterým nerozumí). Pokusí se ty texty rozenat, ale vynadá ti, že těm textům nerozumí. Další přijatá data už začne zpracovávat s prázdným bufferem a těm by rozumět měl.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů