• 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 :)
#1
Witam.

Od dłuższego czasu prowadzę własny mały projekt mający na celu stworzenie czegoś na kształt "komputera pokładowego" do obsługi przyczepy kempingowej lub kampera. Na dzień dzisiejszy projekt działa, ale do jego pełnej zakładanej funkcjonalności jeszcze daleko, bo czym dalej jestem, tym więcej funkcji przydało by się zaimplementować.

Na dzień dzisiejszy założenia wyjściowe są następujące:

- odczyt temperatury z 5 czujników (działa)
- w zależności od temperatury jednego z czujników uruchamia od 1 - 3 wiatraków 12V (działa)
- w zależności od temperatury innego czujnika uruchamia inne dowolne urządzenie 12V (wiatrak) 
- pokazywanie odczytanych temperatur na wyświetlaczu 4x20 (działa)
- odczyt poziomu wody w zbiornikach i wyświetlenie na wyświetlaczu (działa "na krótko"), alarm przy zapełnieniu się jednego ze zbiorników, alarm przy braku wody w drugim zbiorniku, przy braku wody odcięcie zasilania na pompkę pompującą wodę (nie działa)
- pomiar ilości gazu w butli gazowej (nie działa i uważam z bardzo trudne do wykonania)
- zapis i odczyt parametrów / ustawień na karcie SD (nie działa)
- menu obsługujące konfigurację parametrów (menu działa, ale poza głównym programem - trzeba do ładnie skleić )
- pierdoły typu zegarek, datownik, alarm czasowy itp... (do zajęcia się na końcu, jak już wszystko inne będzie działać)

Mam nadzieję, że przy Waszej pomocy uda się doprowadzić cały projekt do końca. Opis postępów, schematy, kody i inne dotyczące projektu udostępniam również na forum karawaningowym - ma to być otwarty projekt dla wszystkich lubiących ten rodzaj turystyki.

Zapytam jak kiedyś Towarzysz Edward Gierek: POMOŻECIE?
 
Odpowiedź
#2
Witam co do twojego problemu z butlą gazową to możesz to rozwiązać wieszając butlę na uchwycie (kantarku).
Zważysz pustą butlę , pełną butlę a zmiana różnicy to twoja ilość gazu.
 
Odpowiedź
#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ź
  


Skocz do:


Przeglądający: 1 gości