Le voici :
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // Broche de données du bus oneWire connécté sur la broche 2
#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)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
unsigned long tempsdebutouvre = 0;
unsigned long tempsdebutferme = 0;
OneWire oneWire_DS18B20(ONE_WIRE_BUS);// Créer une instance d'objet oneWire pour communiquer avec tous les périphériques OneWire
//OneWire oneWire(ONE_WIRE_BUS); // Instanciation de l'objet ‘oneWire’
DallasTemperature sensors(&oneWire_DS18B20);//Transmettre notre référence oneWire au
//capteur de température Dallas
#define Trans 8
float T;
const byte FinCourseHaut = 4; // bouton pin 4
const byte LedHaut = 5;
const byte LedBas = 6;
const byte Buzzer = 7;
const byte MotOuvre = 8; // moteur ouverture
const byte MotFerme = 9; // moteur fermeture
const byte FinCourseBas = 10; // bouton pin 2 !!!!
//int MotOuvre = 8; // moteur ouverture
//int MotFerme = 9; // moteur fermeture
//int fin_coursebas = 10; // bouton pin 2 !!!!
//int fin_coursehaut = 4; // bouton pin 4
//int ledbas = 6;
//int ledhaut = 5;
int EtatCapteurBas = LOW; // etat du capteur bas
int EtatCapteurHaut = LOW; // etat du capteur haut
//int buzzer = 7;
int EtatMoteur = 0; // 0=MoteurArret, 1= MoteurFerme,2= MoteurOuvre
boolean toit_ferme ;
boolean toit_ouvert;
boolean toit_milieu_course;
enum : byte {Fermer, EnOuverture, Ouvert, EnFermeture} EtatToit;
switch (EtatToit) {
case Fermer:
if ((T > 28) && EtatCapteurBas == HIGH && EtatCapteurHaut == LOW)
{
tempsdebutouvre = millis();
digitalWrite(MotOuvre, HIGH); // le moteur est actionné en ouverture
}
EtatToit = EnOuverture; //c'est le nouvel état du toit qui devient EnOuverture
break;
case EnOuverture:
if ( EtatCapteurBas == LOW && EtatCapteurHaut == HIGH) //||(digitalRead(MotOuvre == HIGH) && (millis() - tempsdebutouvre >= 20000))
{
digitalWrite(MotOuvre, LOW); // le moteur est arreté en ouverture
}
EtatToit = Ouvert;
break;
case Ouvert:
if ((T < 25) && EtatCapteurBas == LOW && EtatCapteurHaut == HIGH)
{
tempsdebutferme = millis();
digitalWrite(MotFerme, HIGH); // le moteur est actionné en fermeture
}
EtatToit = EnFermeture;
break;
case EnFermeture:
if ((T < 25) && ( EtatCapteurBas == HIGH && EtatCapteurHaut == LOW)) //|| (digitalRead(MotFerme == HIGH) && (millis() - tempsdebutferme >= 20000))))
{
digitalWrite(MotFerme, LOW); // le moteur est arreté en fermeture
}
EtatToit = Fermer;
break;
}
void mettreFermer()
{
digitalWrite(MotFerme,LOW);
digitalWrite(MotOuvre,LOW);
digitalRead(EtatCapteurBas,HIGH);
digitalRead(EtatCapteurHaut,LOW);
EtatToit=FERMER;
}
void setup() {
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
delay(2000);
Serial.begin(9600);//Connection série à 9600 baud
sensors.begin(); //Initialiser le capteur DS18B20
pinMode(MotOuvre, OUTPUT);
pinMode(MotFerme, OUTPUT);
pinMode(FinCourseBas, INPUT);
pinMode(FinCourseHaut, INPUT);
pinMode(LedBas, OUTPUT);
pinMode(LedHaut, OUTPUT);
pinMode(Buzzer, OUTPUT);
// conditions initiales
mettreFermer();
}
void loop() { //boucle principale
/*5-Mesure de température avec le capteur DS18B20*/
sensors.requestTemperatures(); // Demande de mesure de température
/*6-Affichage des mesures de température */
Serial.print("temperature DS18b20: ");
Serial.print(sensors.getTempCByIndex(0)); //Afficher la température mesurée par DS18B20,
//vous pouvez avoir plus d'un capteur sur le même bus. 0 se réfère au premier capteur
//(DS18B20) sur le bus
Serial.println(" °C");
Serial.println(" ");
delay(1000);
getTemp(); //Apelle de la fonction ‘getTemp’ mesurer la température
AfficherTlcd(); //Apelle de la fonction ‘AfficherTlcd’ pour afficher la température sur le LCD
EtatCapteurBas = digitalRead(FinCourseBas);
EtatCapteurHaut = digitalRead(FinCourseHaut);
delay (400);
//---------------------------------------------------// VERIF de l'état du Toit
// verif si toit fermé
/*if (EtatCapteurBas == HIGH && EtatCapteurHaut == LOW)
{ toit_ferme = true;
digitalWrite(LedBas, HIGH);
} // le toit est fermé
else {
digitalWrite(LedBas, LOW);
toit_ferme = false;
}
// Vérif si toit ouvert
if (EtatCapteurHaut == HIGH && EtatCapteurBas == LOW)
{ toit_ouvert = true;
digitalWrite(LedHaut, HIGH);
} // le toit est ouvert
else {
digitalWrite(LedHaut, LOW);
toit_ouvert = false;
}
// si le toit se trouve à mi-course
if (EtatCapteurHaut == LOW && EtatCapteurBas == LOW)
{ toit_milieu_course = true;
digitalWrite (Buzzer, HIGH); // buzzer en route
delay (1000);
digitalWrite (Buzzer, LOW);
delay (10);
}
*/
/* if (( EtatCapteurBas == LOW && EtatCapteurHaut == HIGH)||(digitalRead(MotOuvre == HIGH) && (millis() - tempsdebutouvre >= 20000)))
{
digitalWrite(MotOuvre,LOW);
}
*/
}
/* //____________________________________________________// ACTIONNEMENT DU MOTEUR en Ouverture ou en Fermeture
// SI il fait FROID et le toit est ouvert
if ((T <= 25) && EtatCapteurBas == LOW && EtatCapteurHaut == HIGH)
{
digitalWrite(MotFerme, HIGH); // le moteur est actionné en fermeture
tempsdebutferme = 0;
}
// Arret Fermeture avec capteur bas
if ((T <= 25) && (( EtatCapteurBas == HIGH && EtatCapteurHaut == LOW) || (digitalRead(MotFerme == HIGH) && (( millis() - tempsdebutferme) >= 20000))))
{
digitalWrite(MotFerme, LOW); // le moteur est arreté en fermeture
digitalWrite(MotOuvre,LOW); // le moteur est arrêté en Ouverture
}
// SI il fait CHAUD et le toit est fermé
if ((T > 28) && EtatCapteurHaut == LOW && EtatCapteurBas == HIGH)
{
digitalWrite(MotOuvre, HIGH); // le moteur est actionné en ouverture
}
// Arret Ouverture avec capteur haut
if ((T > 28) && EtatCapteurHaut == HIGH && EtatCapteurBas == LOW)
{
digitalWrite(MotOuvre, LOW); // le moteur est arreté en ouverture
}
*/
//____________________________________________________ GESTION PROBLEME MOTEUR
// blocage pendant la fermeture
/* if ((MotFerme == HIGH) && (( millis() - tempsdebutferme) >= 20000))
{
digitalWrite(MotFerme, LOW);
}
*/
/*5-Définition de la fonction ‘getTemp’ qui mesure la température */
void getTemp() {
sensors.requestTemperatures(); // Demande de mesure de température
T = sensors.getTempCByIndex(0); //Stocker la valeur de mesure dans la variable ’T’, vous
//pouvez avoir plus d'un capteur sur le même bus. 0 se réfère au premier capteur (DS18B20)
//sur le bus
}
void AfficherTlcd()
{
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0, 5);
// Display static text
display.print(T);
display.print(" ");
display.setTextSize(1);
display.write(167);
display.setTextSize(2);
display.print("C");
display.display();
}
Le switch doit être mis à l'intérieur d'une fonction, ou dans la boucle loop