W końcu znalazłem chwilę i ... napotkałem na problem. Arduino połączone mam z wyświetlaczem Nextion (
http://elty.pl/pl/p/Nextion-2.8-TFT-320x...4T028/1624). Problem mam z komunikacją pomiędzy wyświetlaczem a Arduino i zapisem do EEPROM.
Kod:
/*******************************************************************************
********************************************************************************
**********( STEROWNIK PRZEZNACZONY DO OBSŁUGI PRZYCZEP KEMPINGOWYCH )***********
*******************( POMYSŁ I WYKONANIE: SEBASTIAN SZYMCZYK )*******************
**********************( EMAIL: SEBASTIAN@SZYMCZYK.INFO )************************
********************************************************************************
*******************************************************************************/
/*-----( BIBLIOTEKI )-----*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS18B20.h>
#include <OneWire.h>
#include <Keypad.h>
#include <Keypad_I2C.h>
#include <EEPROM.h>
#include <Nextion.h>
#include <SoftwareSerial.h>
/*-----( Deklaracje stałych )-----*/
int TZW1; //Temperatura Załączenia Wiatraka nr 1
int TZW2; //Temperatura Załączenia Wiatraka nr 2
int TZW3; //Temperatura Załączenia Wiatraka nr 3
int TZW4; //Temperatura Załączenia Wiatraka nr 4
/*-----( Deklaracje obiektów )-----*/
#define Wiatrak1 4 //Pin Arduino sterowania wiatrakiem nr 1
#define Wiatrak2 5 //Pin Arduino sterowania wiatrakiem nr 2
#define Wiatrak3 6 //Pin Arduino sterowania wiatrakiem nr 3
#define Wiatrak4 7 //Pin Arduino sterowania wiatrakiem nr 4
#define ONEWIRE_PIN 8 //Pin Arduino magistrali OneWire
#define SENSORS_NUM 3 //Ilość termometrów podłączonych do OneWire
//Definicja adresów termometrów
const byte address[SENSORS_NUM][8] PROGMEM = {
0x28, 0xFF, 0x62, 0x45, 0x72, 0x15, 0x3, 0xEA,
0x28, 0xFF, 0x2A, 0xFE, 0x71, 0x15, 0x3, 0xDC,
0x28, 0xFF, 0x75, 0x50, 0x72, 0x15, 0x3, 0x7E,
};
OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);
SoftwareSerial nextion(2, 3);// Podłączenie Nextion TX do pinu 2 i RX oo pinu 3 Arduino
Nextion myNextion(nextion, 9600); //komunikacja z wyświetlaczem na porcie szeregowym @9600bps
/*-----( Deklaracje zmiennych )-----*/
int OffButtonVar = 1; //zmienna wyłączenia / włączenia ekranu LCD
int UpDownButtonVar = 1;
float Lodowka = 0.00; //Zmienna temperatury w lodówce
char LodowkaStr[6];
float Zamrazalnik = 0.00; //Zmienna temperatury w zamrażalniku
char ZamrazalnikStr[6];
float Zewnatrz = 0.00; //Zmienna temperatury zewnętrznej
float Wewnatrz = 0.00; //Zmienna temperatury wewnętrznej
float Wiatraki = 00.00; //Zmienna temperatury z tyłu lodówki
char WiatrakiStr[6];
int readValueFromEEPROM; //Zmienna odczytu z EEPROM
int i = 0;
void setup() /*----( Konfiguracja )----*/
{
delay(1000);
//Odczyt z EEPROM wartości załączenia wiatraków. Jeżeli w EEPROM jest 0
//to przyjmują one wartości domyślne, jeżeli w EEPROM wartości są inne niż 0
//to zmienne przyjmują wartości z EEPROM. Wartości temperatur zapisane są
//pod adresami od 0 - 3.
Serial.begin(9600);
myNextion.init();
while(!Serial);
if (EEPROM.read(0) != 0) {TZW1=EEPROM.read(0);} else {TZW1=18;}
if (EEPROM.read(1) != 0) {TZW2=EEPROM.read(1);} else {TZW2=20;}
if (EEPROM.read(2) != 0) {TZW3=EEPROM.read(2);} else {TZW3=22;}
if (EEPROM.read(3) != 0) {TZW4=EEPROM.read(3);} else {TZW4=24;}
/*TZW1=16;
TZW2=16;
TZW3=16;
TZW4=16;*/
//Wysłanie wartości załączenia wiatraków do wyświetlacza
myNextion.setComponentValue("MenuWiatraki.n0",TZW1);
myNextion.setComponentValue("MenuWiatraki.n1",TZW2);
myNextion.setComponentValue("MenuWiatraki.n2",TZW3);
myNextion.setComponentValue("MenuWiatraki.n3",TZW4);
//rozpoczęcie odczytu z termometrów
sensors.begin();
sensors.request();
pinMode(Wiatrak1, OUTPUT); //Sterowanie wiatrakiem nr 1
pinMode(Wiatrak2, OUTPUT); //Sterowanie wiatrakiem nr 2
pinMode(Wiatrak3, OUTPUT); //Sterowanie wiatrakiem nr 3
pinMode(Wiatrak4, OUTPUT); //Sterowanie wiatrakiem nr 4
}/*--(end setup )---*/
void loop() /*----( LOOP: RUNS CONSTANTLY )----*/
{
int valueTZW1;
//nasłuch informacji z wyświetlacza Nextion o zmianie ustawienia wartości temperatury załączenia wiatraków
String message = myNextion.listen();
if (message != "") //jeżeli wiadomość nadeszła
{
valueTZW1 = myNextion.getComponentValue("MenuWiatraki.n0");//pobranie z wyświetlacza wartości załączenia wiatraka nr 1
if (TZW1 != valueTZW1) //jeżeli wartość pobrana jest różna niż ta zapisana w EEPROM
{
TZW1 = valueTZW1; //to zmień zmienną załączenia wiatraka na tą z wyświetlacza
EEPROM.update(0, TZW1); // i zapisz ją do EEPROM
} // jeżeli wartości z wyświetlacza i EEPROM są równe, nie rób nic
int valueTZW2 = myNextion.getComponentValue("MenuWiatraki.n1");
if (TZW2 != valueTZW2)
{
TZW2 = valueTZW2;
EEPROM.update(1, TZW2);
}
int valueTZW3 = myNextion.getComponentValue("MenuWiatraki.n2");
if (TZW3 != valueTZW3)
{
TZW3 = valueTZW3;
EEPROM.update(2, TZW3);
}
int valueTZW4 = myNextion.getComponentValue("MenuWiatraki.n3");
if (TZW4 != valueTZW4)
{
TZW4 = valueTZW4;
EEPROM.update(3, TZW4);
}
}
// wyświetlenie aktualnych temperatur na wyświetlaczu
i++;
if (sensors.available())
{
Wiatraki = sensors.readTemperature(FA(address[0]));
dtostrf(Wiatraki,7, 2, WiatrakiStr);
myNextion.setComponentText("Wiatraki.Twia",WiatrakiStr);
Zamrazalnik = sensors.readTemperature(FA(address[1]));
dtostrf(Zamrazalnik,7, 2, ZamrazalnikStr);
myNextion.setComponentText("Wiatraki.Tzam",ZamrazalnikStr);
Lodowka = sensors.readTemperature(FA(address[2]));
dtostrf(Lodowka,7, 2, LodowkaStr);
myNextion.setComponentText("Wiatraki.Tlod",LodowkaStr);
sensors.request();
}
//obsługa wiatraka 1
if (Wiatraki > TZW1) // jeżeli temperatura za lodówką jest większa niż próg włączenia wiatraka
{
digitalWrite(Wiatrak1, HIGH); //uruchom wiatrak
myNextion.sendCommand("Wiatraki.tm1.en=1"); // na wyświetlaczu uruchom zegar animacji kręcącego się wiatraka
}
else //jeżeli temperatura spadła poniżej zadanej
{
digitalWrite(Wiatrak1, LOW); // zatrzymaj wiatrak
myNextion.sendCommand("Wiatraki.tm1.en=0"); // na wyświetlaczu zatrzymaj zegar animacji kręcącego się wiatraka
myNextion.sendCommand("Wiatraki.W1.pic=24"); // ustaw ikonę na zatrzymany wiatrak
}
//obsługa wiatraka 2
if (Wiatraki > TZW2)
{
digitalWrite(Wiatrak2, HIGH);
myNextion.sendCommand("Wiatraki.tm2.en=1");
}
else
{
digitalWrite(Wiatrak2, LOW);
myNextion.sendCommand("Wiatraki.tm2.en=0");
myNextion.sendCommand("Wiatraki.W2.pic=24");
}
//obsługa wiatraka 3
if (Wiatraki > TZW3)
{
digitalWrite(Wiatrak3, HIGH);
myNextion.sendCommand("Wiatraki.tm3.en=1");
}
else
{
digitalWrite(Wiatrak3, LOW);
myNextion.sendCommand("Wiatraki.tm3.en=0");
myNextion.sendCommand("Wiatraki.W3.pic=24");
}
//obsługa wiatraka 4
if (Wiatraki > TZW4)
{
digitalWrite(Wiatrak4, HIGH);
}
else
{
digitalWrite(Wiatrak4, LOW);
}
}/* --(end main loop )-- */
void ekran()//Wyświetlanie ekranów od 1 do IloscEkranów
{
}
/* ( THE END ) */
Jak to ma działać w założeniu - uruchamiam, sprawdzane jest w EEPROMIE, czy są ustawione temperatury załączenia wiatraków:
Kod:
if (EEPROM.read(0) != 0) {TZW1=EEPROM.read(0);} else {TZW1=18;}
pod zmienną TZW1 (TZW2, TZW3, TZW4) podstawiam wartość tej temperatury.
Następnie:
Kod:
myNextion.setComponentValue("MenuWiatraki.n0",TZW1);
wysyłam tą wartość do wyświetlacza, i na nim wyświetlam. Dotąd działa dobrze. Na wyświetlaczu mam menu, w którym mogę tą temperaturę zmienić, po zmianie jej wysyłam z wyświetlacza do Arduino informację o tym, że dokonano zmian. W Arduino sprawdzam wtedy, czy temperatury odczytana i zadana różnią się.
Kod:
String message = myNextion.listen();
if (message != "") //jeżeli wiadomość nadeszła
{
valueTZW1 = myNextion.getComponentValue("MenuWiatraki.n0");//pobranie z wyświetlacza wartości załączenia wiatraka nr 1
if (TZW1 != valueTZW1) //jeżeli wartość pobrana jest różna niż ta zapisana w EEPROM
{
TZW1 = valueTZW1; //to zmień zmienną załączenia wiatraka na tą z wyświetlacza
EEPROM.update(0, TZW1); // i zapisz ją do EEPROM
} // jeżeli wartości z wyświetlacza i EEPROM są równe, nie rób nic
No i w tym momencie zaczynają się dziać dziwne rzeczy. Jeżeli nic nie zmienię, to wszystko jest OK. Jeżeli zmienię temperaturę z np. 18 na 19, to na wyświetlaczu dostaję w różnych przypadkach wartość 255, czyli maksymalną co może pomieścić EEPROM. Nie dzieje się tak za każdym razem. Pozostałe rzeczy działąją.
Ma ktoś z Was pomysł, co z tym zrobić ?