Je suis finalement arrivé à afficher les données quand je le veux et déclencher une action.
Mon projet prend fin, mais je vois déjà des améliorations possibles.
Mon code actuel:
#include <LiquidCrystal.h> //on définit la librairie LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // on definit les broches du LCD
int lcd_key = 0;
int lcd_key1 =0;
int adc_key_in = 0;
int adc_key_in1 = 0;
int choix = 0;
int choix1 = 0;
int laser = 12;
int capteurlaser;
int capteurson;
int relais = 11;
int etat_btn;
int seuillaser = 50;
int seuilson = 50;
int momentlaser = 0;
int momentson = 0;
int momentaction = 0;
unsigned long last_affichage;
void software_Reset()
{
asm volatile (" jmp 0");
}
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
#define Haut 6
#define Bas 7
#define btnRIGHT1 10
#define btnUP1 11
#define btnDOWN1 12
#define btnLEFT1 13
#define btnSELECT1 14
#define btnNONE1 15
int lecturelaser()
{
while (momentlaser == 1)
{
if ( millis() - last_affichage > 1000) {
capteurlaser = analogRead(A1);
Serial.println (capteurlaser);
lcd.setCursor (7,0);
lcd.print (capteurlaser) ;
lcd.setCursor (0,0);
lcd.print("Laser:");
lcd.setCursor (0,1);
lcd.print("Seuil:");
lcd.setCursor (7,1);
lcd.print(seuillaser);
last_affichage = millis();
if (capteurlaser <400)
{
lcd.clear();
lcd.print ("Photo ok");
digitalWrite(relais, HIGH);
delay(1000);
digitalWrite(relais, LOW);
delay(3500);
software_Reset();
}
}
}
}
int lectureson()
{
while (momentson == 1)
{
if ( millis() - last_affichage > 1000) {
capteurson = analogRead(A1);
Serial.println (capteurson);
lcd.setCursor (7,0);
lcd.print (capteurson) ;
lcd.setCursor (0,0);
lcd.print("Son:");
lcd.setCursor (0,1);
lcd.print("Seuil:");
lcd.setCursor (7,1);
lcd.print(seuilson);
last_affichage = millis();
if (capteurson >50)
{
lcd.clear();
lcd.print ("Photo ok");
digitalWrite(relais, HIGH);
delay(1000);
digitalWrite(relais, LOW);
delay(3500);
software_Reset();
}
}
}
}
int lecturecapteurs()
{
while (momentaction == 1)
{
if ( millis() - last_affichage > 1000) {
capteurlaser = analogRead(A1);
Serial.println (capteurlaser);
lcd.setCursor (7,0);
lcd.print (capteurlaser) ;
capteurson = analogRead(A2);
Serial.println (capteurson);
lcd.setCursor (7,1);
lcd.print (capteurson) ;
last_affichage = millis();
}
}
}
int read_LCD_buttons()
{
adc_key_in = analogRead(0);
if (adc_key_in > 1000) return btnNONE;
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
}
int read_LCD_buttons1()
{
adc_key_in1 = analogRead(0);
if (adc_key_in1 > 1000) return btnNONE1;
if (adc_key_in1 < 50) return btnRIGHT1;
if (adc_key_in1 < 195) return btnUP1;
if (adc_key_in1 < 380) return btnDOWN1;
if (adc_key_in1 < 555) return btnLEFT1;
if (adc_key_in1 < 790) return btnSELECT1;
}
// On définit ce qui sera fait par "calibrage"
int calibrage()
{
lcd.clear();
momentaction = 1;
lcd.setCursor (0,0);
lcd.print ("Laser:"),
lcd.setCursor (0,1);
lcd.print ("Son:");
}
// On définit ce qui sera fait par "fonctionson"
int fonctionson()
{
lcd.clear();
momentson = 1;
lectureson();
if (capteurson >50)
{
digitalWrite(relais, HIGH);
delay(1000);
digitalWrite(relais, LOW);
software_Reset();
}
}
// On définit ce qui sera fait par "fonctionlaser"
int fonctionlaser()
{
lcd.clear();
momentlaser = 1;
lecturelaser();
}
// On définit ce qui sera fait par "Action"
int Action()
{
switch(choix) {
case 9:
{
fonctionson();
break;
}
case 10:
{
fonctionlaser();
break;
}
}
}
// On définit ce qui sera fait par "menubis"
int menubis()
{
lcd.clear();
lcd.setCursor (2,0);
lcd.print ("Son");
lcd.setCursor (2,1);
lcd.print ("Laser");
while (choix1 ==5)
{
lcd_key1 = read_LCD_buttons1() ;
switch (lcd_key1) {
case btnSELECT1:
{
Action();
break;
}
case btnUP1:
{
digitalWrite(laser, LOW);
lcd.clear();
lcd.setCursor (2,0);
lcd.print ("Son");
lcd.setCursor (2,1);
lcd.print ("Laser");
choix= 9;
Serial.println(choix);
lcd.setCursor (0,0);
lcd.print ((char)126);
lcd.setCursor (0,1);
lcd.print (' ');
break;
}
case btnDOWN1:
{
digitalWrite(laser, LOW);
lcd.clear() ;
lcd.setCursor (2,0);
lcd.print ("Son");
lcd.setCursor (2,1);
lcd.print ("Laser");
choix= 10;
Serial.println(choix);
lcd.setCursor (0,1);
lcd.print ((char)126);
lcd.setCursor (0,0);
lcd.print (' ');
break;
}
};
}
}
// On définit ce qui sera fait par "Action1"
int Action1()
{
switch(choix1) {
case 4:
{
calibrage();
break;
}
case 5:
{
menubis();
break;
}
}
}
// On définit ce qui sera fait par "GestionMenu"
void GestionMenu()
{
lcd_key = read_LCD_buttons() ;
switch (lcd_key) {
case btnSELECT:
{
Action1();
break;
}
case btnUP:
{
digitalWrite(laser, LOW);
lcd.clear();
lcd.setCursor (2,0);
lcd.print ("Calibrage");
lcd.setCursor (2,1);
lcd.print ("Lancement");
choix1= 4;
Serial.println(choix1);
lcd.setCursor (0,0);
lcd.print ((char)126);
lcd.setCursor (0,1);
lcd.print (' ');
break;
}
case btnDOWN:
{
digitalWrite(laser, LOW);
lcd.clear() ;
lcd.setCursor (2,0);
lcd.print ("Calibrage");
lcd.setCursor (2,1);
lcd.print ("Lancement");
choix1= 5;
Serial.println(choix1);
lcd.setCursor (0,1);
lcd.print ((char)126);
lcd.setCursor (0,0);
lcd.print (' ');
break;
}
};
}
void setup()
{
pinMode(laser, OUTPUT);
pinMode(relais, OUTPUT);
int capteurlaser = A1;
int caplaser = analogRead(capteurlaser);
int capteurson = A2;
int capson = analogRead(capteurson);
Serial.begin(115200);
lcd.begin(16, 2);
lcd.setCursor (2,0);
lcd.print ("Calibrage");
lcd.setCursor (2,1);
lcd.print ("Lancement");
}
void loop()
{
if ( millis() - last_affichage > 1000) {
lecturecapteurs();
lecturelaser();
lectureson();
last_affichage = millis();
}
GestionMenu();
}
/*
Premier menu: calibrage --> calibrage()
lancement --> son --> fonction son()
laser --> fonctionlaser()
lecturecapteurs(), lecturelaser() et lectureson() servent à afficher la mesure des capteurs pendant le processus.
*/