je suis en train (depuis hier soir)d'essayer de faire un petit prog evolutif qui fasse tout ça
avec menu de parametrage sur le LCD, eenregistrement des réglages en EEPROM, etc etc
voilà où j'en suis, il ne manque pas grand chose, je termine ça ce soir :
/*
chauffage air Jeremy
*/
//Broches de la carte arduino utilisées :
//pins afficheur : GND, 5V, A4, A5 (i2c)
//pin d'entrée pour le bouton : pin-->bouton-->GND
#define PIN_BOUTON 8
//pins de lecture des capteurs DHT11,
// VCC-->5V, GND-->GND, DATA-->:
#define PIN_DHT11_SALON 2
#define PIN_DHT11_MANON 4
#define PIN_DHT11_LUKE 7
#define PIN_DHT11_NOUS 8
//pins de sorties
#define PIN_SERVO_MANON 3
#define PIN_SERVO_LUKE 5
#define PIN_SERVO_NOUS 6
#define PIN_RELAIS_V1 12
#define PIN_RELAIS_V2 13
//nombre de zones de chauffage à piloter
#define NBR_ZONES 4
//attribution des zones
#define MANON 0
#define LUKE 1
#define NOUS 2
#define SALON 3
// Librairie pour simplifier les appels à print()
// https://github.com/kachok/arduino-libraries/tree/master/Streaming
//#include <Streaming.h>
// Gestion des capteurs de température DHT11
#include <SimpleDHT.h>
SimpleDHT11 dht;
const byte pinDHT[NBR_ZONES] = {PIN_DHT11_MANON, PIN_DHT11_LUKE, PIN_DHT11_NOUS, PIN_DHT11_SALON };
byte temperature[NBR_ZONES], humidite[NBR_ZONES];
#define DHT_READ_ERR 250 //valeur de temperature en cas d'erreur de lecture sonde
#define DELAY_DHT_READ 1100 // délai de 1,1s (1100ms) d'attente entre deux lectures de temperature pour être < à 1Hz (une fois/s)
//Gestion des servomoteurs
#include <Servo.h>
Servo servo[NBR_ZONES - 1];
const byte pinServo[NBR_ZONES - 1] = {PIN_SERVO_MANON, PIN_SERVO_LUKE, PIN_SERVO_NOUS };
// Librairie EEPROM pour sauvegarde des consignes
#include <EEPROM.h>
const float clefVerif = 3538.3113; //pourquoi cette valeur ? tapez-la sur une calculatrice et regardez l'écran à l'envers... ok c'est nul... :D :D
// adresses d'enregistrement des données en EEPROM
#define EEPROM_BASE_ADR 0
#define EEPROM_PARAM_ADR EEPROM_BASE_ADR + sizeof(clefVerif)
// valeurs par defaut
#define PARAM_DEFAUT_CONSIGNE_T 19
#define PARAM_DEFAUT_CONSIGNE_H 50
#define PARAM_DEFAUT_HYSTERESIS_T 1
#define PARAM_DEFAUT_HYSTERESIS_H 10
#define PARAM_DEFAUT_FERME 0 //angle fermeture servo
#define PARAM_DEFAUT_OUVRE 90 //angle ouverture servo
// structures pour enregistrer les consignes et parametres
// __attribute ((packed)) force le compilateur à conserver l'ordre des champs
struct __attribute__ ((packed)) PARAM_ZONE_t {
byte ferme;
byte ouvre;
byte consigneT;
byte consigneH;
};
struct __attribute__ ((packed)) {
PARAM_ZONE_t zone[NBR_ZONES];
byte hysteresisT;
byte hysteresisH;
} parametres;
void sauverParametres() {
EEPROM.put(EEPROM_PARAM_ADR, parametres);
}
void chargerParametres() {
float clef = 0;
EEPROM.get(EEPROM_BASE_ADR, clef);
if (clef != clefVerif) {
for (int i = 0; i < NBR_ZONES; i++) {
parametres.zone[i].ferme = PARAM_DEFAUT_FERME;
parametres.zone[i].ouvre = PARAM_DEFAUT_OUVRE;
parametres.zone[i].consigneT = PARAM_DEFAUT_CONSIGNE_T;
parametres.zone[i].consigneH = PARAM_DEFAUT_CONSIGNE_H;
}
parametres.zone[SALON].consigneT = PARAM_DEFAUT_CONSIGNE_T + 4;
parametres.hysteresisT = PARAM_DEFAUT_HYSTERESIS_T;
parametres.hysteresisH = PARAM_DEFAUT_HYSTERESIS_H;
sauverParametres();
EEPROM.put(EEPROM_BASE_ADR, clefVerif);
} else
EEPROM.get(EEPROM_PARAM_ADR, parametres);
}
// Librairies pour afficheur LCD i2c
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Adresse et taille de l'afficheur
#define LCD_ADR 0x27
#define LCD_NBR_C 16
#define LCD_NBR_L 2
LiquidCrystal_I2C lcd(LCD_ADR, LCD_NBR_C, LCD_NBR_L);
void printT(byte aZone) {
if (temperature[aZone] == DHT_READ_ERR)
lcd.print("--");
else {
if (temperature[aZone] < 10)
lcd.print("0");
lcd.print(temperature[aZone]);
}
}
void printH(byte aZone) {
if (temperature[aZone] == DHT_READ_ERR)
lcd.print("--");
else {
if (humidite[aZone] < 10)
lcd.print("0");
lcd.print(humidite[aZone]);
}
}
// Librairie pour faciliter l'utilisation des machines à états
// http://forum.arduino.cc/index.php?topic=525092
#include <yasm.h>
#include <btn.h>
YASM menu, regul, lectureDHT;
BTN bouton;
#include <avr/wdt.h> //watchdog timer
#define DELAY_MENU_BACK 600E3 //10 minutes
#define DELAY_MENU_EXIT_PARAM 40E3 //40 seconds
#define DELAY_MENU_REFRESH 1500
void setup(void)
{
Serial.begin(9600);
wdt_enable(WDTO_4S); //4 seconds watchdog
lcd.init();
lcd.backlight();
lcd.clear();
lcd.print(F("Demarrage..."));
chargerParametres();
//parametrage des broches utilisées
pinMode(PIN_RELAIS_V1, OUTPUT);
pinMode(PIN_RELAIS_V2, OUTPUT);
pinMode(PIN_BOUTON, INPUT_PULLUP); //on active la résistance de tirage à Vcc interne
for (int i = 0; i < NBR_ZONES - 1; i++) {
//on associe chaque servo avec sa broche, et on le ferme
servo[i].attach(pinServo[i]);
servo[i].write(parametres.zone[i].ferme);
}
menu.next(menu_pageT);
lectureDHT.next(lectureDHT_lire);
regul.next(regul_attente);
}
void loop(void)
{
wdt_reset(); //RAZ du chronometre du watchdog
//lecture de l'état du bouton
// ici on utilise "!" car le bouton est entre la pin et GND, la valeur lue quand il est appuyé est donc LOW, et donc il faut l'inverser pour avoir HIGH car la librairie bnt.h attends un HIGH quand le bouton est appuyé
bouton.update(!digitalRead(PIN_BOUTON));
lectureDHT.run();
bouton.update(!digitalRead(PIN_BOUTON)); //pour améliorer la réactivité au cas ou la lecture des DHT soit lente
regul.run();
menu.run();
}
////////////////////////lectureDHT state machine///////////////////////////////////
void lectureDHT_lire() {
int i = lectureDHT.runCount();
if (i == NBR_ZONES)
lectureDHT.next(lectureDHT_attend);
if (dht.read(pinDHT[i], &temperature[i], &humidite[i], NULL) != SimpleDHTErrSuccess) {
humidite[i] = temperature[i] = DHT_READ_ERR;
}
}
void lectureDHT_attend() {
if (lectureDHT.elapsed(DELAY_DHT_READ))
lectureDHT.next(lectureDHT_lire);
}
//////////////////////////menu state machine////////////////////////////////////
char Pos, Page;
void menu_pageT() {
if (menu.isFirstRun()) {
lcd.clear();
// 1234567890123456
lcd.print(F("S:--° 0 M:--° F"));
lcd.setCursor(0, 1);
lcd.print(F("L:--° F N:--° F"));
}
if (menu.periodic(DELAY_MENU_REFRESH)) {
lcd.setCursor(3, 0); printT(SALON);
lcd.setCursor(12, 0); printT(MANON);
lcd.setCursor(3, 1); printT(LUKE);
lcd.setCursor(12, 1); printT(NOUS);
}
if (bouton.state(BTN_CLICK))
menu.next(menu_pageH);
if (bouton.state(BTN_LONGCLICK))
menu.next(menu_param);
}
void menu_pageH() {
}
void menu_param() {
}
////////////////////////regul state machine///////////////////////////////////////
void regul_attente() {
}