#define CLK 3 #define DT 4 #define SW 5 #define BUZZ 6 #define RELAIS 2 #define RELAIS1 7 #define CAPOT 8 int counter = 0; int state; int Laststate; int menuID = 1; int menuChange = 0; int leave = 0; int minutes = 1; int timeSelect = 1; int seconds10 = 0; int seconds1 = 0; unsigned long startMillis; #include #include #include #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup(){ pinMode(RELAIS, OUTPUT); pinMode(RELAIS1, OUTPUT); pinMode(CLK,INPUT); pinMode(DT,INPUT); pinMode(SW,INPUT_PULLUP); pinMode(BUZZ, OUTPUT); pinMode(CAPOT, INPUT_PULLUP); Serial.begin(9600); Laststate = digitalRead(CLK); digitalWrite(RELAIS, LOW); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)){ Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F(" MENU ")); display.setTextSize(1); display.println(F("")); display.println(F("-> Relais 1 Manuel")); display.println(F("")); display.println(F(" Relais 1 Timer")); display.println(F("")); display.println(F(" Relais 2 Direct")); display.display(); } void loop(){ state = digitalRead(CLK); if(state != Laststate){ if(digitalRead(DT) != state){ counter++; } else{ counter--; } } if(digitalRead(SW) != 1){ counter = 0; tone(BUZZ, 3000, 50); } Laststate = state; if(counter == 2){ counter = 0; menuID++; menuChange = 1; } if(counter == -2) { counter = 0; menuID--; menuChange = 1; } if(digitalRead(SW) != 1) { tone(BUZZ, 3000, 50); menuChange = 1; switch(menuID) { case 1: menuID = 11; break; case 2: menuID = 21; break; case 3: menuID = 31; break; case 11: menuID = 101; break; case 12: menuID = 1; break; case 21: menuID = 210; break; case 22: menuID = 220; break; case 23: menuID = 1; break; // menu info direction case 31: menuID = 102; break; // duree tempo case 210: menuID = 21; timeSelect = 1; break; case 211: menuID = 21; timeSelect = 2; break; case 212: menuID = 21; timeSelect = 3; break; } delay(250); } if(menuID == 0 || menuID == 4 || menuID == 10 || menuID == 13 || menuID == 20 || menuID == 24 ||menuID == 31 || menuID == 213 || menuID == 209 ){ switch(menuID){ case 0: menuID = 3; break; case 4: menuID = 1; break; case 10: menuID = 12; break; case 13: menuID = 11; break; case 20: menuID = 23; break; case 24: menuID = 21; break; case 30: menuID = 31; break; case 31: menuID = 102; break; case 32: menuID = 31; break; case 213: menuID = 210; break; case 209: menuID = 212; break; } menuChange = 1; } if(menuChange == 1){ switch(menuID){ case 1: menu1(); menuChange = 0; break; case 2: menu2(); menuChange = 0; break; case 3: menu3(); menuChange = 0; break; case 11: menu11(); menuChange = 0; break; case 101: if(digitalRead(CAPOT) == 0){ digitalWrite(RELAIS, HIGH); Serial.println("RELAIS ON"); while(leave == 0 && digitalRead(CAPOT) == 0) { menu101(); if(digitalRead(SW) != 1){ leave = 1; } else if(digitalRead(CAPOT) != 0){ leave = 1; errorMessage; } } } else{ errorMessage(); } tone(BUZZ, 900, 1000); digitalWrite(RELAIS, LOW); Serial.println("RELAIS OFF"); leave = 0; menuID = 11; menuChange = 1; delay(500); break; case 102: if(digitalRead(CAPOT) == 0){ digitalWrite(RELAIS1, HIGH); Serial.println("RELAIS N-2 ON"); while(leave == 0 && digitalRead(CAPOT) == 0) { menu102(); if(digitalRead(SW) != 1){ leave = 1; } else if(digitalRead(CAPOT) != 0){ leave = 1; errorMessage; } } } else{ errorMessage(); } tone(BUZZ, 800, 1000); digitalWrite(RELAIS1, LOW); Serial.println("RELAIS N-2 OFF"); leave = 0; menuID = 1; menuChange = 1; delay(500); break; case 12: menu12(); menuChange = 0; break; case 21: menu21(); menuChange = 0; break; case 220: minutes = timeSelect; seconds10 = 0; seconds1 = 0; if(digitalRead(CAPOT) == 0){ digitalWrite(RELAIS, HIGH); Serial.println("RELAIS ON"); while(leave == 0 && digitalRead(CAPOT) == 0) { display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F("Attention")); display.setTextSize(1); display.println(F("Relais active")); display.setCursor(0,34); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); display.println(F(" Temps restant: ")); display.setTextColor(SSD1306_WHITE); display.setCursor(14,43); display.setTextSize(3); display.print(F(" ")); display.print(minutes); display.print(F(":")); display.print(seconds10); display.print(seconds1); display.display(); if(minutes == 0 && seconds10 == 0 && seconds1 == 0) { leave = 1; } if(seconds1 == 0) { seconds1 = 9; seconds10--; } else { seconds1--; } if(seconds10 == -1) { seconds10 = 5; minutes--; } if(digitalRead(CAPOT) != 0){ leave = 1; errorMessage(); } startMillis = millis(); while(millis() <= startMillis + 1000 && leave == 0) { if(digitalRead(SW) != 1) { leave = 1; } } } } else{ errorMessage(); } tone(BUZZ, 3000, 1000); digitalWrite(RELAIS, LOW); Serial.println("RELAIS OFF"); leave = 0; menuID = 21; menuChange = 1; delay(500); break; case 22: menu22(); menuChange = 0; break; case 23: menu23(); menuChange = 0; break; case 31: menu31(); menuChange = 0; break; case 210: menu210(); menuChange = 0; break; case 211: menu211(); menuChange = 0; break; case 212: menu212(); menuChange = 0; break; } } } void menu1() { display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F(" MENU")); display.setTextSize(1); display.println(F("")); display.println(F("o=> Relais 1 Manuel")); display.println(F("")); display.println(F(" Relais 1 Timer")); display.println(F("")); display.println(F(" Relais 2 Direct")); display.display(); } void menu2() { display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F(" MENU")); display.setTextSize(1); display.println(F("")); display.println(F(" Relais 1 Manuel")); display.println(F("")); display.println(F("o=> Relais 1 Timer")); display.println(F("")); display.println(F(" Relais 2 Direct")); display.display(); } void menu3(){ display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F(" MENU")); display.setTextSize(1); display.println(F("")); display.println(F(" Relais 1 Manuel")); display.println(F("")); display.println(F(" Relais 1 Timer")); display.println(F("")); display.println(F("o=> Relais 2 Direct")); display.display(); } void menu11() { display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F(" MANUEL")); display.setTextSize(1); display.println(F("Presser bouton pour temporisation")); display.println(F("")); display.setTextSize(2); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); display.print(F(" OK ")); display.setTextColor(SSD1306_WHITE); display.println(F(" Menu")); display.display(); } void menu12() { display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F(" MANUEL")); display.setTextSize(1); display.println(F("Presser bouton pour ")); display.println(F("")); display.println(F("")); display.setTextSize(2); display.print(F("- - ")); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); display.println(F(" MENU")); display.display(); } void menu21() { display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F(" TIMER")); display.setTextSize(1); display.println(F(" ")); /*display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);*/ display.println(" SELECTION"); display.println(F("")); display.setTextSize(1); display.print(timeSelect); display.setTextSize(1); display.println(F(" Minute(s)")); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.println(F("")); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); display.print(F("Modifier")); display.setTextColor(SSD1306_WHITE); display.print(F(" Valider")); display.display(); } void menu22() { display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F(" TIMER")); display.setTextSize(1); display.println(F(" ")); display.print(timeSelect); display.println(" minute(s)"); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.println(F("")); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); display.print(F(" OK")); display.setTextColor(SSD1306_WHITE); display.print(F(" Menu")); display.display(); } void menu23() { display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F(" TIMER")); display.setTextSize(1); display.println(F(" ")); display.print(timeSelect); display.println(" minute(s)"); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.println(F("")); display.print(F(" Ok ")); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); display.print(F("Menu")); display.display(); } void menu31(){ /* display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println("ATTENTION"); display.println(""); display.setTextSize(1); display.print("UV-C DANGER"); display.display(); */ display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F(" ATTENTION")); display.setTextSize(1); display.println(F("")); display.println(F(" RELAIS Numero 2")); display.setTextSize(1); display.println(F("")); display.print(F(" ")); display.setCursor(24,42); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text display.println(F("Validation")); display.display(); } void menu101(){ display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F(" ATTENTION")); display.setTextSize(1); display.println(F(" Relais active")); display.setTextSize(2); display.println(F("")); display.print(F(" ")); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text display.println(F(" Pause ")); display.display(); } void menu102(){ display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(2,0); display.println(F(" ATTENTION")); display.setTextSize(1); display.println(F("")); display.println(F(" Relais 2 utilise")); display.setTextSize(2); display.println(F("")); display.print(F("")); display.setCursor(2,42); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text display.println(F("Stop->Menu")); display.display(); } void menu210(){ display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F("SELECTION")); display.setTextSize(1); display.println(F(" ")); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); display.println(" 1 minute"); display.setTextColor(SSD1306_WHITE); display.println(" 2 minutes"); display.println(" 3 minutes"); display.display(); } void menu211(){ display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F("SELECTION")); display.setTextSize(1); display.println(F(" ")); display.setTextColor(SSD1306_WHITE); display.println(" 1 minute"); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); display.println(" 2 minutes"); display.setTextColor(SSD1306_WHITE); display.println(" 3 minutes"); display.display(); } void menu212(){ display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F("SELECTION")); display.setTextSize(1); display.println(F(" ")); display.setTextColor(SSD1306_WHITE); display.println(" 1 minute"); display.println(" 2 minutes"); display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); display.println(" 3 minutes"); display.display(); } void errorMessage(){ display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println("SECURITE"); display.println("CAPOT"); display.display(); delay(2000); }