Bonjour, a tous
Me revoilà , avec un nouveau projet , contenant une machine à état, que je maitrise pas trop mal maintenant grace à vous.
J'ai un souci dans mon programme.
Je veux allumer un moteur de circulation épisodiquement pour contrôler si la temperature a changer ,dans un phase du programme ou normalement il est a l'arrêt pour que l'eau se réchauffe
du genre 5min d'arrêt puis 1mm de fonctionnement , et la si la temperature a changer soit je passe dans l'état suivant soit , je suis toujours dans le meme état et il faut donc refaire la meme action
je sais , ou plutôt je pense que vous allez me dire utilise la fonction millis, c'est ce que j'ai essayé de bidouiller dans tous les sens , mais je me perd.
voici mon programme.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature.
const byte relay = 7 ; // déclaration de la broche relay = 7
const byte rouge = 4 ; // déclaration de la broche led ROUGE
const byte vert = 5 ; // déclaration de la broche led VERTE
const byte bleu = 6 ; // déclaration de la broche led BLEU
float temp; // creation de la variable decimal "temp"
unsigned long previousaMillis = 0 ; // variable pour stocker la mise a jour de millis()
unsigned long intervalA = 20000UL; // variable pour pour creer un interval de temps A
float temps_mise_en_attente_pompe = 0; // variable pour stocker le temps de mise en attente de la pompe
const unsigned long rougeinterval = 200UL ; // contantes pour stocker la durée d'un clignotement
const unsigned long bleuinterval = 200UL ; //
unsigned long rougetimer = 0 ; // variables pour stocker la valeur timer
unsigned long bleutimer = 0 ; //
int rougeState = LOW ; // variables pour stocker l'etat courant du State de leds
int bleuState = LOW ; //
//////////////////////////////////// enumeration des differents etats ////////////////////////////////////////////////////////
enum
{
commuication_temperature, // case 0 demande de temperature au capteur
controle_temperature_basse, // case 1 si la temperature est inferieur a 30
controle_temperature_mediane, // case 2 si la temperature est comprise entre 30 et 50
controle_temperature_haute, // case 3 si la temperature est superieur a 50
fin
} etat = commuication_temperature; // mise a l'etat initialisation pour le départ
///////////////////////////////// Partie du programme qui ne sera éxécuté qu'une seule fois ////////////////////////////////////////
void setup() {
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
display.clearDisplay(); // Clear the buffer.
sensors.begin(); // Start up the library
Serial.begin(9600); // demare le moniteur serie
pinMode(relay, OUTPUT); // declaration de la broche 7 en SORTIE
digitalWrite(relay,HIGH); // mise a l'etat HAUT de la broche 7 " POMPE branché sur NO et donc non active"
pinMode(rouge, OUTPUT); // declaration de la broche 4 en SORTIE
pinMode(vert, OUTPUT); // declaration de la broche 5 en SORTIE
pinMode(bleu, OUTPUT); // declaration de la broche 6 en SORTIE
digitalWrite(rouge,HIGH); // mise a l'etat HAUT de la broche ' " Led rouge eteinte"
digitalWrite(vert,HIGH); // mise a l'etat HAUT de la broche ' " Led verte eteinte"
digitalWrite(bleu,HIGH); // mise a l'etat HAUT de la broche ' " Led bleu eteinte"
rougetimer = millis() ; //
bleutimer = millis() ; //
// initialisation des millis des timers led
rougetimer = millis() ; //
bleutimer = millis() ; //
///////////////////////////////////// en tete de l'ecran OLED ////////////////////////////////////////////////////////
display.clearDisplay(); // clear previous buffered data
display.setTextColor(WHITE); // ecris en blanc
display.setCursor(0,0); // commence a ecrire a cet endroit sur OLED
display.setTextSize(1); // ecris de cette taille la sur OLED
display.println("Controle Temperature"); // ecris a la ligne " Moteur" sur OLED
display.setCursor(20,9); // commence a ecrire a cet endroit sur OLED
display.setTextSize(1); // ecris de cette taille la sur OLED
display.println("Rechauffeur By"); // ecris a la ligne " Temperature" sur OLED
display.setCursor(45,18); // commence a ecrire a cet endroit sur OLED
display.setTextSize(2); // ecris de cette taille la sur OLED
display.println("SEB"); // ecris a la ligne " Temperature" sur OLED
display.display(); // Mets l'afffichage a jour sur OLED
delay(1000);
display.clearDisplay(); // clear previous buffered data
}
/////////////////////////////////////////////// BOUCLE PRINCIPALE ////////////////////////////////////////////////////////////
je sais que j'ai utilisé un delay de 5000 , le programme fonctionne a peu près bien comme cela , mais ca ne plait pas , c'est bloquant et j'utilise une machine a état justement pour avoir un programme , qui vérifie tout en permanence.
si une bonne âme peux me venir en aide.
merci d'avance.