#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 4);
int upButton = 9;
int downButton = 8;
int selectButton = 7;
int menu = 1;
int mode = 1;
int temp = 1;
int humi = 1;
int motor = 1;
//Variable pour le temps de clinotement du curseur
unsigned long curseurPM = 0;
unsigned long curseurCM = 0;
//Menu principal
String menu1 = "Mode";
String menu2 = "Temperatur";
String menu3 = "Humidity";
String menu4 = "Motor turn time";
//Sous-Menu Mode
String smode = "Mode";
String mode1 = "Chauf. Oeuf Poule";
String mode2 = "Chauf. Oeuf canard";
String mode3 = "Chauf. Oeuf caille";
//Sous-Menu temperature
String stemp = "Temperatur";
String temp1 = "Temperatur";
String temp2 = "Temperatur min";
String temp3 = "Temperatur max";
//Sous-Menu humidity
String shumi = "Humidity";
String humi1 = "Humidity";
String humi2 = "Humidity min";
String humi3 = "Humidity max";
//Sous-Menu Motor turn time
String smotor = "Motor config";
String motor1 = "Manuel";
String Motor2 = "Automatic";
String Motor3 = "Motor Turn time";
byte select[] = {
B11000,
B11100,
B11110,
B11111,
B11110,
B11100,
B11000,
B00000
};
byte space[] = {
B01000,
B01100,
B01110,
B01111,
B01110,
B01100,
B01000,
B00000
};
void setup() {
lcd.begin(20, 4);
lcd.backlight();
lcd.createChar(0, select);
lcd.createChar(1, space);
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(selectButton, INPUT_PULLUP);
pinMode(13, OUTPUT);
updateTemp();
}
void loop() {
menuTemp();
}
// affichage du menu principal
void menuPrincipal(){
if (!digitalRead(downButton)){
menu++;
if (menu >= 5){
menu = 4;
}
updateMenu();
while (!digitalRead(downButton));
}
if (!digitalRead(upButton)){
menu--;
if (menu <= 0){
menu = 1;
}
updateMenu();
while(!digitalRead(upButton));
}
if (!digitalRead(selectButton)){
executeAction();
//updateMenu();
while (!digitalRead(selectButton));
}
}
// affichage du menu mode
void menuMode(){
if (!digitalRead(downButton)){
mode++;
if (mode >= 4){
mode = 3;
}
updateMode();
while (!digitalRead(downButton));
}
if (!digitalRead(upButton)){
mode--;
if (mode <= 0){
mode = 1;
}
updateMode();
while(!digitalRead(upButton));
}
if (!digitalRead(selectButton)){
executeAction();
updateMode();
while (!digitalRead(selectButton));
}
}
// affichage du menu temperatur
void menuTemp(){
if (!digitalRead(downButton)){
temp++;
if (temp >= 4){
temp = 3;
}
updateTemp();
while (!digitalRead(downButton));
}
if (!digitalRead(upButton)){
temp--;
if (temp <= 0){
temp = 1;
}
updateTemp();
while(!digitalRead(upButton));
}
if (!digitalRead(selectButton)){
executeAction();
updateTemp();
while (!digitalRead(selectButton));
}
}
//actualise le menu principal lorsque les boutons de direction sont appuyés
void updateMenu() {
switch (menu) {
case 1:
afficheMenu();
afficheCurseur(menu-1);
break;
case 2:
afficheMenu();
afficheCurseur(menu-1);
break;
case 3:
afficheMenu();
afficheCurseur(menu-1);
break;
case 4:
afficheMenu();
afficheCurseur(menu-1);
break;
}
}
//actualise le menu Mode lorsque les boutons de direction sont appuyés
void updateMode() {
switch (mode) {
case 1:
afficheMode();
afficheCurseur(mode);
break;
case 2:
afficheMode();
afficheCurseur(mode);
break;
case 3:
afficheMode();
afficheCurseur(mode);
break;
}
}
//actualise le menu Temp lorsque les boutons de direction sont appuyés
void updateTemp() {
switch (temp) {
case 1:
afficheTemp();
afficheCurseur(temp);
break;
case 2:
afficheTemp();
afficheCurseur(temp);
break;
case 3:
afficheTemp();
afficheCurseur(temp);
break;
}
}
void executeAction() {
switch (menu) {
case 1:
action1();
break;
case 2:
action2();
break;
case 3:
action3();
break;
case 4:
action4();
break;
}
}
void action1() {
lcd.clear();
lcd.print(">Executing #1");
delay(1500);
}
void action2() {
lcd.clear();
lcd.print(">Executing #2");
delay(1500);
}
void action3() {
lcd.clear();
lcd.print(">Executing #3");
delay(1500);
}
void action4() {
lcd.clear();
lcd.print(">Executing #4");
delay(1500);
}
// Affichage des elements du menu principal
void afficheMenu(){
lcd.clear();
lcd.setCursor(2, 0);
lcd.print(menu1);
lcd.setCursor(2, 1);
lcd.print(menu2);
lcd.setCursor(2, 2);
lcd.print(menu3);
lcd.setCursor(2, 3);
lcd.print(menu4);
}
// Affichage des elements du menu mode
void afficheMode(){
lcd.clear();
lcd.setCursor(2, 0);
lcd.print(smode);
lcd.setCursor(2, 1);
lcd.print(mode1);
lcd.setCursor(2, 2);
lcd.print(mode2);
lcd.setCursor(2, 3);
lcd.print(mode3);
}
// Affichage des elements du menu Temp
void afficheTemp(){
lcd.clear();
lcd.setCursor(2, 0);
lcd.print(stemp);
lcd.setCursor(2, 1);
lcd.print(temp1);
lcd.setCursor(2, 2);
lcd.print(temp2);
lcd.setCursor(2, 3);
lcd.print(temp3);
}
// affichage du cursseur a une positon donnée
void afficheCurseur(int pos){
lcd.setCursor(0, pos);
lcd.write(select);
}
/*
// clinotement du curseur a une postion et une frequence donnée
void blinkCurseur(int pos, float interval){
curseurCM = millis();
if (curseurCM - curseurPM >= interval){
lcd.setCursor(0, pos);
lcd.write(31);
curseurPM = curseurCM;
digitalWrite(13, LOW);
}
else
{
lcd.setCursor(0, pos);
lcd.write(select);
digitalWrite(13, HIGH);
}
}
*/