• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 1 głosów - średnia: 5
  • 1
  • 2
  • 3
  • 4
  • 5
Sterownik dla domu ... mobilnego :)
#3
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ć ?
 
Odpowiedź
  


Wiadomości w tym wątku
Sterownik dla domu ... mobilnego :) - przez Seba222 - 27-01-2016, 06:53
RE: Sterownik dla domu ... mobilnego :) - przez Seba222 - 11-03-2016, 13:19

Skocz do:


Przeglądający: 1 gości