28-12-2020, 14:58
(Ten post był ostatnio modyfikowany: 28-12-2020, 23:23 przez Robson Kerman.)
(28-12-2020, 13:21)Himura Kenshin napisał(a): Daj jakiś przykład prostego menu.Chcesz przykład prostego menu. Nie mam "pod ręką" prostego menu. Musiałbym go napisać a do tego zbudować makietę aby sprawdzić czy działa. Mogę zawsze zrobić jakiegoś babola i może nie zadziałać tak jak chcę. Jak robię coś, to od razu muszę sprawdzać czy to działa.
Wybacz, ale Twój kod pokazuje, że nie masz podstaw i nie rozumiesz co piszesz w kodzie.
Poniżej masz kod gdzie występują elementy menu. Jest to sterownik a właściwie stacja meteo (jej jedna część).
Do ustawienia jest temperatura zadana temperatury w pomieszczeniu oraz poziom PMów do wyłączenia rekuperatora jak przekroczy zadaną wartość zapylenie na zewnątrz.
Kod:
/* Uwaga
* Podczas pierwszego wgrywania oprogramowania do mikrokontrolera
* odkomentój zaznaczone linie w setup.
* Potem wgraj ponownie oprogramowanie z zakomentowanymi liniami.
* Uchroni to przed nieprawidłowym działaniem programu,
* związane jest to z nieprawidłowym odczytem wartości z pamięci.
* Prawidłowe wstępne wpisanie danych umożliwia poprawne działanie
* programu.
* Dla dociekliwych
* Dziewiczy procesor ma w pamięci zapisane same FF co powoduje
* błędny odczyt zmiennej float z pamięci.
* *
*/
#define PMG A2
#define PMD A3
#define TwG 3
#define TwD 2
#define SterTw 4
#define Rx1 A0
#define Tx1 A1
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4); // ustawienie wyświetlacza adres 0x3F
//LiquidCrystal_I2C lcd(0x27,20,4); // ustawienie wyświetlacza adres 0x27
//----------------------------------------------------------
//Do czujnika ciśnienia, temperatury i wilgotności wewnętrznej
#include <Adafruit_BME280.h>
//#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
//-------------------------------------------------------------------------
// Programowy UART
#include <SoftwareSerial.h>
SoftwareSerial S1(Rx1, Tx1);//Serial nazywa się S1 RX, TX
int licznik = 0;
int FiltrZad = 5 ;
unsigned int PMZad = 100 ;
float TwZad = 20 ;
int FiltrZadZap ;
unsigned int PMZadZap ;
float TwZadZap ;
int miganie = LOW ;
int filtry = 0;
int przycisk = 0; //zmienna informująca o trybie przycisków
int AddresPMZadZap = 0;
int AddresTwZadZap = 10;
int AddresFiltrZadZap = 20;
byte stopien[8] = //generowanie znaku stopnia na wyswietlaczu
{
B01100,
B10010,
B10010,
B01100,
B00000,
B00000,
B00000,
B00000
};
byte mig[8] = //generowanie znaku migania na wyswietlaczu
{
B11111,
B11111,
B11111,
B11111,
B11111,
B00000,
B00000,
B00000
};
unsigned long ZapCzasOdczytuCzuj ;
unsigned long CzasDoZap ;
float CisAtm ;
float WilgWew ;
float TempWew ;
//Daklaracja struktur (łatwo się je wysyła i odbiera przez UART przez zamianę w string)
//Struktura danych do wysłania
struct Nadawanie{
unsigned int PMZad = 300 ;
} DaneDoWyslania;
//Struktura danych odebranych
struct Odbior{
byte SterRek = 1 ;
int stan ;
float PmZew ;
float PmWew ;
float WilgZew ;
float TempZew ;
} DaneOdebrane;
char StringOdebrany[sizeof(DaneOdebrane)]; //Deklaracja stringa odebranego
char StringDoNadania[sizeof(DaneDoWyslania)]; //Deklaracja stringa do nadania
void setup()
{
//-----------------------------------------------------------
// do czujnika ciśnienia
bme.begin(); //uruchomienie czujnika
//------------------------------------------------------------
pinMode(PMG, INPUT_PULLUP);
pinMode(PMD, INPUT_PULLUP);
pinMode(TwG, INPUT_PULLUP);
pinMode(TwD, INPUT_PULLUP);
pinMode(SterTw, OUTPUT );
lcd.init();
lcd.backlight();
lcd.createChar(0, stopien);//kreowanie znaku stopnia na lcd
lcd.createChar(1, mig);
lcd.clear(); // zerowanie wyświetlacza
//**********************************************************************
//**********************************************************************
// sprawdzamy co jest w pamięci FiltrZadZap
EEPROM.get(AddresFiltrZadZap, FiltrZadZap); //Odczyt z pamięci
// wyświetlamy to na wyświetlaczu
lcd.setCursor(0, 0);
lcd.print("Info filtry ");
lcd.print(FiltrZadZap);
delay (3000);
lcd.setCursor(11, 0);
lcd.print(" ");
delay (1000);
if (FiltrZadZap > 20 || FiltrZadZap <0) // Pierwsze uruchomienie procesora może mieć zapisaną większą wartość
{
FiltrZadZap = 5;
EEPROM.put(AddresFiltrZadZap, FiltrZadZap); // jeśli wartość jest większa od 20 to wpisz do pomięci wartość 5
}
EEPROM.get(AddresFiltrZadZap, FiltrZadZap); // Odczyt z pamięci
// Ponownie wyświetlamy to na wyświetlaczu
lcd.setCursor(0, 0);
lcd.print("Info filtry ");
lcd.print(FiltrZadZap);
delay (1000);
FiltrZad = FiltrZadZap;
//*******************************************************************
//Poniższą linijkę odkomentój przy pierwszym wgrywaniu oprogramowania
//PMZadZap = 10000; EEPROM.put(AddresPMZadZap, PMZadZap);
//*******************************************************************
//Sprawdzamy co jest w pamięci PMZadZap
EEPROM.get(AddresPMZadZap, PMZadZap); //Odczyt z pamięci
// wyświetlamy to na wyświetlaczu
lcd.setCursor(0, 1);
lcd.print("PM Zadane ");
lcd.print(PMZadZap);
lcd.print(" %");
delay (3000);
lcd.setCursor(10, 1);
lcd.print(" ");
delay (1000);
if (PMZadZap > 1000 || PMZadZap <20) // Pierwsze uruchomienie procesora może mieć zapisaną większą wartość
{
PMZadZap = 100;
EEPROM.put(AddresPMZadZap, PMZadZap); // jeśli wartość jest większa od 1000 to wpisz do pomięci wartość 100
}
EEPROM.get(AddresPMZadZap, PMZadZap); // Odczyt z pamięci
// Ponownie wyświetlamy to na wyświetlaczu
lcd.setCursor(0, 1);
lcd.print("PM Zadane ");
lcd.print(PMZadZap);
lcd.print(" %");
delay (1000);
PMZad = PMZadZap;
//************************************************************************
//Poniższą linijkę odkomentój przy pierwszym wgrywaniu oprogramowania
//TwZadZap = 85.5; EEPROM.put(AddresTwZadZap, TwZadZap);
//************************************************************************
//Sprawdzamy co jest w pamięci TwZadZap
EEPROM.get(AddresTwZadZap, TwZadZap); //Odczyt z pamięci
// wyświetlamy to na wyświetlaczu
lcd.setCursor(0, 2);
lcd.print("Tw Zadana ");
lcd.print(TwZadZap,1);
lcd.write (0);
lcd.print("C");
delay (3000);
lcd.setCursor(10, 2);
lcd.print(" ");
delay (1000);
if (TwZadZap > 30 || TwZadZap <10) // Pierwsze uruchomienie procesora może mieć zapisaną większą wartość
{
TwZadZap = 20;
EEPROM.put(AddresTwZadZap, TwZadZap); // jeśli wartość jest większa od 30 to wpisz do pomięci wartość 20
}
EEPROM.get(AddresTwZadZap, TwZadZap);
// Ponownie wyświetlamy to na wyświetlaczu
lcd.setCursor(0, 2);
lcd.print("Tw Zadana ");
lcd.print(TwZadZap,1);
lcd.write (0);
lcd.print("C");
TwZad = TwZadZap;
delay (5000); //Czekamy dla poczytania
lcd.clear(); // zerowanie wyświetlacza
S1.begin (9600);
}
void loop()
{
if ( millis() < CzasDoZap )
{
CzasDoZap = 0;
}
if ( millis() < ZapCzasOdczytuCzuj )
{
ZapCzasOdczytuCzuj = 0;
}
if(S1.available()>0)
{
delay (100);
if(S1.available()==sizeof(DaneOdebrane))
{
readserial_S1 ();
DaneDoWyslania.PMZad = PMZad ;
writeserial_S1();
sprawdzFiltry ();
miganie = !miganie ;
wyswietlacz ();
}
else
{
while (S1.available()> 0)
{
int czyszczenie = S1.read();
}
}
}
odczytaj_czujniki ();
if (przycisk == 0)
{
Przyciski ();
}
if (przycisk == 1)
{
UstawFiltry ();
}
if (przycisk == 2)
{
UstawPMZad ();
}
if (przycisk == 3)
{
UstawTwZad ();
}
}
void readserial_S1 ()
{
S1.readBytes(StringOdebrany,sizeof(DaneOdebrane));
memcpy(&DaneOdebrane,StringOdebrany,sizeof(DaneOdebrane));
}
void writeserial_S1()
{
memcpy(StringDoNadania,&DaneDoWyslania,sizeof(DaneDoWyslania));
S1.write(StringDoNadania,sizeof(DaneDoWyslania));
}
void Przyciski ()
{
if ( (digitalRead(PMG) == LOW) || (digitalRead(PMD) == LOW) || (digitalRead(TwG) == LOW) || (digitalRead(TwD) == LOW ) )
{
delay (500);
if ( (digitalRead(PMG) == LOW) && (digitalRead(TwD) == LOW) )
{
przycisk = 1;
CzasDoZap = millis ();
return;
}
if ( (digitalRead(PMG) == LOW) || (digitalRead(PMD) == LOW) )
{
przycisk = 2;
CzasDoZap = millis ();
return;
}
if ( (digitalRead(TwG) == LOW) || (digitalRead(TwD) == LOW) )
{
przycisk = 3;
CzasDoZap = millis ();
return;
}
}
}
void UstawPMZad ()
{
if ( (digitalRead(PMG) == LOW) && (PMZad < 1000) && (licznik > 0 ) )
{
PMZad = PMZad + 10 ;
CzasDoZap = millis ();
}
if ( (digitalRead(PMD) == LOW) && (PMZad > 20)&& (licznik > 0 ) )
{
PMZad = PMZad - 10 ;
CzasDoZap = millis ();
}
if ( (digitalRead(PMG) == HIGH) && (digitalRead(PMD) == HIGH) )
{
licznik = licznik + 1;
}
lcd.setCursor(3, 1);
lcd.print(" ");
lcd.setCursor(3, 1);
lcd.print("z");
lcd.setCursor(4, 1);
lcd.print(PMZad);
lcd.print("%");
delay (500);
if ( (digitalRead(PMG) == HIGH) && (digitalRead(PMD) == HIGH) && (( millis() - CzasDoZap ) >= 5000UL ))
{
licznik = 0;
przycisk = 0;
if ( PMZad != PMZadZap )
{
EEPROM.put(AddresPMZadZap, PMZad); //Zapis do pamięci
lcd.setCursor(3, 1);
lcd.print(" ");
delay (500);
EEPROM.get(AddresPMZadZap, PMZadZap); // Odczyt z pamięci
lcd.setCursor(4, 1);
lcd.print(PMZadZap);
lcd.print("%");
delay (1000);
}
}
}
void UstawTwZad ()
{
if ( (digitalRead(TwG) == LOW) && (TwZad < 30) && (licznik > 0 ) )
{
TwZad = TwZad + 0.5 ;
CzasDoZap = millis ();
}
if ( (digitalRead(TwD) == LOW) && (TwZad > 10)&& (licznik > 0 ) )
{
TwZad = TwZad - 0.5 ;
CzasDoZap = millis ();
}
if (( (digitalRead(TwG) == HIGH) && (digitalRead(TwD) == HIGH) ))
{
licznik = licznik + 1;
}
lcd.setCursor(12, 3);
lcd.print(" ");
lcd.setCursor(12, 3);
lcd.print("z");
lcd.setCursor(13, 3);
lcd.print(TwZad , 1);
lcd.write (0);
lcd.print("C");
delay (500);
if (( (digitalRead(TwG) == HIGH) && (digitalRead(TwD) == HIGH) )&& (( millis() - CzasDoZap ) >= 5000UL ))
{
licznik = 0;
przycisk = 0;
if ( TwZad != TwZadZap )
{
EEPROM.put(AddresTwZadZap, TwZad); //Zapis do pamięci
lcd.setCursor(13, 3);
lcd.print(" ");
delay (500);
EEPROM.get(AddresTwZadZap, TwZadZap); // Odczyt z pamięci
lcd.setCursor(13, 3);
lcd.print(TwZadZap , 1);
lcd.write (0);
lcd.print("C");
delay (1000);
}
}
}
void UstawFiltry ()
{
if ( (digitalRead(TwG) == LOW) && (FiltrZad < 20) && (licznik > 0 ) )
{
FiltrZad = FiltrZad + 1 ;
CzasDoZap = millis ();
}
if ( (digitalRead(PMD) == LOW) && (FiltrZad > 0)&& (licznik > 0 ) )
{
FiltrZad = FiltrZad - 1 ;
CzasDoZap = millis ();
}
if (( (digitalRead(TwD) == HIGH) && (digitalRead(PMG) == HIGH) ))
{
licznik = licznik + 1;
}
lcd.setCursor(0, 0);
lcd.print("Ust. info filtra ");
lcd.setCursor(17, 0);
lcd.print(FiltrZad);
delay (500);
if (( (digitalRead(TwD) == HIGH) && (digitalRead(PMG) == HIGH) )&& (( millis() - CzasDoZap ) >= 5000UL ))
{
licznik = 0;
przycisk = 0;
if ( FiltrZad != FiltrZadZap )
{
EEPROM.put(AddresFiltrZadZap, FiltrZad); //Zapis do pamięci
delay (500);
EEPROM.get(AddresFiltrZadZap, FiltrZadZap); // Odczyt z pamięci
delay (1000);
}
}
}
void SterTempWew ()
{
if (TempWew < (TwZad - 0.2) )
{
digitalWrite(SterTw, HIGH);
lcd.setCursor(9, 3);
lcd.print("#");
}
if (TempWew > (TwZad + 0.2) )
{
digitalWrite(SterTw, LOW);
lcd.setCursor(9, 3);
lcd.print(" ");
}
}
void sprawdzFiltry ()
{
if (DaneOdebrane.PmWew * FiltrZad > DaneOdebrane.PmZew && DaneOdebrane.PmWew > 20 && FiltrZad >0)
{
filtry = 1;
}
else
{
filtry = 0;
}
}
void wyswietlacz ()
{
if (przycisk == 0 )
{
// 1 linijka
if ( filtry == 0 ||(filtry == 1 && miganie == LOW ))
{
lcd.setCursor(0, 0);
lcd.print("Pa ");
lcd.setCursor(3, 0);
lcd.print(CisAtm,0);
lcd.print("hPa");
lcd.setCursor(10, 0);
lcd.print("REK ");
if (DaneOdebrane.SterRek == 1)
{
lcd.print("START");
}
if (DaneOdebrane.SterRek == 0)
{
lcd.print("STOP ");
}
}
if (filtry == 1 && miganie == HIGH )
{
lcd.setCursor(0, 0);
lcd.print(" SPRAWDZ FILTRY ");
}
lcd.setCursor(19, 0); //Ustawienie kursora
if (miganie == LOW )
{
lcd.write (1);
}
if (miganie == HIGH )
{
lcd.print(" ");
}
// 2 linijka
lcd.setCursor(0, 1);
lcd.print("PMz ");
lcd.setCursor(4, 1);
lcd.print(DaneOdebrane.PmZew,0);
lcd.print("%");
lcd.setCursor(10, 1);
lcd.print("PMn ");
lcd.setCursor(14, 1);
lcd.print(DaneOdebrane.PmWew,0);
lcd.print("%");
lcd.setCursor(19, 1);
if (DaneOdebrane.stan == 0)
{
lcd.print("W");
}
if (DaneOdebrane.stan == 2)
{
lcd.print("P");
}
if (DaneOdebrane.stan == 4)
{
lcd.print("S");
}
// 3 linijka
lcd.setCursor(0, 2);
lcd.print("Wz ");
lcd.setCursor(3, 2);
lcd.print(DaneOdebrane.WilgZew, 0);
lcd.print("%");
lcd.setCursor(10, 2);
lcd.print("Tz ");
lcd.setCursor(13, 2);
lcd.print(DaneOdebrane.TempZew, 1 );
lcd.write (0);
lcd.print("C");
// 4 linijka
lcd.setCursor(0, 3);
lcd.print("Ww ");
lcd.setCursor(3, 3);
lcd.print(WilgWew, 0);
lcd.print("%");
lcd.setCursor(10, 3);
lcd.print("Tw ");
lcd.setCursor(13, 3);
lcd.print(TempWew, 1 );
lcd.write (0);
lcd.print("C");
}
}
void odczytaj_czujniki ()
{
if ( millis() - ZapCzasOdczytuCzuj >= 30000UL )
{
bme.begin();
ZapCzasOdczytuCzuj = millis();
TempWew = bme.readTemperature();
WilgWew = bme.readHumidity();
CisAtm = (bme.readPressure() / 100.0F);
SterTempWew ();
}
}