/*
Funkční -
*/
#include <Adafruit_GFX.h> //knihovna k zapisu na dispay
#include <Adafruit_SSD1306.h> //knihovna k zapisu na dispay
#define SCREEN_WIDTH 128 // OLED display width, in pixels //rozlišení display vodorovně X
#define SCREEN_HEIGHT 64 // OLED display height, in pixels //rozlišení display svisle Y
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
//-1 když není resetovací tlačítko na display, jinak zadat připojené IO na esp
//připojení OLED SCL(GPIO 22), SDA(GPIO 21)
byte LED = 13;
int Tlak_Pin_Val = 0;
int Prumery = 6;
int Tlak_d = 0;
int Tlak_Pin = A0; //čidlo tlaku na pinu
int Rele_Cer_ON[] = {12, 11}; //nastavení pinů pro relé čerpadel Sever a Jih
int Cer_S = 0; //pomocná pro zapnutí čerpadla na S
int Cer_J = 1; //pomocná pro zapnutí čerpadla na J
int Cer = 0; //aktuálně provozované čerpadlo 0-S/1-J
int bezi_Cas_Mh[] = {0, 0}; //motohodiny jednotlivých čer v (s)
byte blokace_zmeny_cer = 0; //pro blokaci další změny čerpadla
int Cas_zmeny_cer = 0; //pro počítání času běhu od změny čerpadla
byte id_zmeny = 0; //pocitadlo zmen čerpadel
int rozdil_MH = 0; //aktuální rozdíl Mh
int rozdil_Mh_limit[] = {-20, 20}; // limit pro rozdíl Mh pro změnu čerpadla
int Tlak = 0; //hodnota tlaku v Barech
int Je_voda = 1; //info, že je voda
int Tlak_min = 20; // min tlak pro zapnutí čerpadla
int Tlak_max = 40; // max tlak pro vypnutí čerpadla
// int Tlak_prov = 30; // provozní tlak (použit pro blokaci další změny čerpadla)
int beh_naprazdno = 15; // počet sekund běhu čer při nízkém tlaku - došla voda
int bezi = 0; //info, že běží čerpadlo
int bezi_Cas = 0; //pomocná pro chod naprázdno
int ID_mereni = 1; //ID měření
int prirustek = 1;
String slovo = "ahoj" ;
/***********************setup*******************************************************/
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(Tlak_Pin, INPUT);
pinMode(Rele_Cer_ON[Cer_S], OUTPUT);
digitalWrite(Rele_Cer_ON[Cer_S], LOW); //HIGH - vypnuto
pinMode(Rele_Cer_ON[Cer_J], OUTPUT);
digitalWrite(Rele_Cer_ON[Cer_J], LOW); //HIGH - vypnuto
// Cer = Cer_S; //nastavení provozního čerpadla S/J
// Tlak_Pin = 0;
delay (1000);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(2000);
display.clearDisplay(); //vymaže display
display.setTextSize(2); //velikost pisma
display.setTextColor(WHITE); //barva pisma
display.setCursor(0, 0); //pozice zacatku textu
display.println("Ahoj jdu merit!"); //odeslaný text
display.display(); //zobrazit text
delay(100);
Serial.print (" BYL PROVEDEN NOVY START ARDUINA ");
}
/***********************funkce******************************************************/
void ZmerTlak() {
Tlak_Pin_Val = analogRead(Tlak_Pin);
// Tlak = Tlak_Pin * 5 / 1023;
// Tlak = map(Tlak_Pin_Val, 0, 4095, 0, 120); //přepočet hodnoty na Tlak v Pa
Tlak = map(Tlak_Pin_Val, 0, 1024, 0, 120); //přepočet hodnoty na Tlak v Pa
Serial.print ("Tlak_Pin: ");
Serial.print (Tlak_Pin_Val);
Serial.print (" Tlak_Pa: ");
Serial.println (Tlak);
}
void MERENI_prumery() { //Zprůměrovaná aktuální hodnota - (z "Prumery" hodnot)
byte i = 0;
// byte n = 3; // počet hodnot do průměru
Tlak = 0;
Tlak_d = 0;
for (i = 0; i < Prumery; i++) {
Tlak_Pin_Val = analogRead(Tlak_Pin);
Tlak_d = map(Tlak_Pin_Val, 0, 4095, 0, 120); //přepočet hodnoty na Tlak v Pa
Tlak += Tlak_d; //uložení sumy nových hodnot teploty
// Serial.print("T1_sani: ");
// Serial.println(T1_sani);
// delay (200) ;
// digitalWrite(LED, LOW);
delay (100);
/* Serial.print ("Tlak_Pin: ");
Serial.print (Tlak_Pin_Val);
Serial.print (" Tlak_Pa: ");
Serial.println (Tlak); */
}
Tlak = Tlak / Prumery ; //Průměrná hodnota z Prumery
Serial.print ("Tlak_Pin: ");
Serial.print (Tlak_Pin_Val);
Serial.print (" Tlak_Pa: ");
Serial.println (Tlak);
//delay (5000);
}
void Spinani_cerp() {
/* if (Tlak < Tlak_min ) { //běh čerpadla od nízkého tlaku
digitalWrite(Rele_Cer_ON[Cer], HIGH); //HIGH - vypnuto
bezi = 1;
bezi_Cas = 0; //vynulování počítadla délky běhu po každém zapnutí
} */
if (Tlak < Tlak_min && bezi == 0 && id_zmeny < 2 ) { //zapnutí stojícího cer od nízkého tlaku (1x)
// digitalWrite(Rele_Cer_ON[Cer], HIGH); //HIGH - vypnuto
bezi = 1;
bezi_Cas = 0; //vynulování počítadla délky běhu po každém zapnutí pro detekci behu naprazdno
Serial.print("start cerpadla: ");
Serial.println(Cer);
Serial.print("bezi_Cas: ");
Serial.println(bezi_Cas);
}
if (bezi == 1){
digitalWrite(Rele_Cer_ON[Cer], HIGH);
bezi_Cas += prirustek; //počítání délky běhu po každém zapnutí
bezi_Cas_Mh[Cer] += prirustek; //počítání motohodin jednotlivých čerpadel
Cas_zmeny_cer += prirustek; //počítání času běhu od změny čerpadla
rozdil_MH = bezi_Cas_Mh[0] - bezi_Cas_Mh[1];
Serial.print("bezi_Cas: ");
Serial.println(bezi_Cas);
/* if (id_zmeny == 0){ //blokace další změny čerpadla
blokace_zmeny_cer = 0; //uvolnění blokace další změny čerpadla
Serial.println("blokace_zmeny_cer: 0");
}
Serial.print ("Cerpadlo: ");
Serial.print (Cer);
Serial.print (" Mh: ");
Serial.println (bezi_Cas_Mh[Cer]);
*/
}
if (Tlak > Tlak_max ) {
// digitalWrite(Rele_Cer_ON[Cer], LOW);
bezi = 0;
id_zmeny = 0;
Serial.println("STOP cerpadla od Tlak_max ");
}
// if (Tlak > Tlak_prov ) {
// id_zmeny = 0;
// }
/* if (bezi == 0){ //
bezi_Cas = 0;
} */
if (Tlak < Tlak_min && bezi_Cas > beh_naprazdno ) { //zjištění běhu bez vody - prázdná nádrž
// digitalWrite(Rele_Cer_ON[Cer], LOW);
Je_voda = 0;
bezi = 0;
Serial.println("** NENI VODA **");
}
if (bezi == 0 ) {
digitalWrite(Rele_Cer_ON[Cer], LOW);
}
// bezi_Cas += prirustek;
}
void prep_cer_voda() {
// if (Je_voda == 0 && id_zmeny == 0){
switch (Cer){
case 0:
Cer = Cer_J;
Serial.println("Zmena cerpadla na Cer_J");
digitalWrite(Rele_Cer_ON[Cer_S], LOW);
break;
case 1:
Cer = Cer_S;
Serial.println("Zmena cerpadla na Cer_S");
digitalWrite(Rele_Cer_ON[Cer_J], LOW);
break;
}
Je_voda = 1;
id_zmeny += 1;
// Cas_zmeny_cer_old = 0;
Cas_zmeny_cer = 0;
blokace_zmeny_cer = 1;
Serial.println("blokace_zmeny_cer: 1");
// }
}
void prep_cer_Mh() {
// if (Je_voda == 0 && id_zmeny == 0){
switch (Cer){
case 0:
Cer = Cer_J;
Serial.println("Zmena cerpadla na Cer_J od Mh");
digitalWrite(Rele_Cer_ON[Cer_S], LOW);
break;
case 1:
Cer = Cer_S;
Serial.println("Zmena cerpadla na Cer_S od Mh");
digitalWrite(Rele_Cer_ON[Cer_J], LOW);
break;
}
id_zmeny = 0;
Cas_zmeny_cer = 0;
bezi_Cas = 0; //vynulování počítadla délky běhu po každém zapnutí pro detekci behu naprazdno
}
void oled_zobraz(){
display.clearDisplay();
display.setCursor(0, 0);
display.print(Tlak_Pin_Val);
display.print(" ");
display.println(Tlak);
display.print(Rele_Cer_ON[Cer]);
display.print(" ");
display.println(Cer);
display.print(id_zmeny);
display.print(" ");
display.println(bezi);
display.display();
display.print(bezi_Cas_Mh[0]);
display.print(" ");
display.print(bezi_Cas_Mh[1]);
display.print(" ");
display.println(rozdil_MH);
display.display();
}
/***********************loop********************************************************/
void loop() {
delay (2000);
ID_mereni += prirustek;
// ZmerTlak();
MERENI_prumery();
oled_zobraz();
if (Je_voda = 1) {
Spinani_cerp();
}
if (Je_voda == 0 && id_zmeny < 2){ //přepnutí čerpadlel když není blokace další změny
prep_cer_voda();
}
if (rozdil_MH < rozdil_Mh_limit[0] || rozdil_MH > rozdil_Mh_limit[1]){ //při rozdílné
if (blokace_zmeny_cer == 0){
display.print("Prejeti od rozdilu Mh ");
prep_cer_Mh();
bezi_Cas_Mh[0] = 0;
bezi_Cas_Mh[1] = 0;
}
}
}