#include <EEPROM.h>
//-----------------------------------------------
// Définition des Entrée Sorties
//-----------------------------------------------
#define iPinEncClk 2
#define iPinEncDt 3
#define iPinEncSw 7
#define iPinBtnH 6
#define iPinBtnB 8
#define iPinNtcChauffe A0
#define iPinNtcProduit A1
#define oPinChauffe 5
//-----------------------------------------------
// Bibliothèque
//-----------------------------------------------
#include <Encoder.h> //--------------------------
Encoder myEnc(iPinEncClk, iPinEncDt);
//-----------------------------------------------
#include <SmoothThermistor.h> //-----------------
SmoothThermistor smoothThermistorChauffe(A0,ADC_SIZE_10_BIT, 20000, 22000, 3950, 25, 10);
SmoothThermistor smoothThermistorProduit(A1,ADC_SIZE_10_BIT, 20000, 22000, 3950, 25, 10);
//-----------------------------------------------
#include <PID_v1.h> //--------------------------
double Setpoint, Input, Output, InputChauffe;
double Kp=0.1, Ki=0.1, Kd=0;
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
//----------------------------------------------
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#define i2c_Address 0x3c //initialize with the I2C addr 0x3C Typically eBay OLED's
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // QT-PY / XIAO
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Valeurs en EEPROM
// 0-1 = int 19369 si initialisé
// 2-3 = int Température de chauffe High
// 4-5 = int Temperature produit High
// 6-7 = int Température de chauffe Low
// 8-9 = int temperature produit Low
// 10 = shortint deltaTempLow;
// 11 = shortint deltaTempHigh;
int consTempChauffeLow, consTempProduitLow;
int consTempChauffeHigh, consTempProduitHigh;
int valTempChauffe, valTempProduit;
int deltaTempLow;
int deltaTempHigh;
int mesTempChauffe;
int mesTempProduit;
int temp;
int isInit;
unsigned long dimmerTime,oldDimmerTime;
#define tempsAppuiCourt 50
#define tempsAppuiLong 500
unsigned long timeBtnH,timeBtnB,timeBtnSw;
bool flagBtnH, flagHcourt, flagHlong;
bool flagBtnB, flagBcourt, flagBlong;
bool flagBtnSw, flagSwcourt, flagSwlong;
bool flagReglageChauffe, flagReglageProduit;
long oldPosition;
//--------------------------------------------------
// Setup
//--------------------------------------------------
void setup(){
//Serial.begin(115200);
//Serial.println("debut");
smoothThermistorChauffe.useAREF(true);
smoothThermistorProduit.useAREF(true);
EEPROM.get(0, isInit); // Chargement des dernieres valeurs utilisées
if (isInit == 19369) {
EEPROM.get(2, consTempChauffeHigh);
EEPROM.get(4, consTempProduitHigh);
EEPROM.get(6, consTempChauffeLow);
EEPROM.get(8, consTempProduitLow);
EEPROM.get(10,deltaTempLow);
EEPROM.get(10,deltaTempHigh);
}
else { // Séquence d'initialisation pour la premiere mise en route
for (int i = 0 ; i < EEPROM.length() ; i++) { // RAZ EEPROM
EEPROM.write(i, 255);
}
consTempChauffeHigh = 410;
consTempProduitHigh = 320;
EEPROM.put(6, consTempChauffeLow);
EEPROM.put(8, consTempProduitLow);
EEPROM.put(10,deltaTempLow);
EEPROM.put(10,deltaTempHigh);
consTempChauffeHigh = 650;
consTempProduitHigh = 320;
EEPROM.put(2, consTempChauffeHigh);
EEPROM.put(4, consTempProduitHigh);
isInit = 19369; // Validation de l'initialisation
EEPROM.put(0, isInit);
//Serial.println("initialisation");
}
valTempChauffe = consTempChauffeHigh;
valTempProduit = consTempProduitHigh;
display.begin(i2c_Address, true); // Address 0x3C default
display.clearDisplay();
delay(200);
Input = smoothThermistorProduit.temperature() * 10;
Setpoint = valTempProduit;
myPID.SetMode(AUTOMATIC);
//TriacDimmer::begin();
pinMode(oPinChauffe, OUTPUT);
flagBtnH = false;
flagBtnB = false;
flagBtnSw = false;
}
long newPosition = 0;
//-----------------------------------------------------
// Loop
//-----------------------------------------------------
void loop() {
unsigned long oldTime300 = 0, oldTime100 = 0;
newPosition = myEnc.read();
if (millis() > (oldTime300 + 300)){ //Boucle toutes les 300ms
Input = smoothThermistorProduit.temperature() * 10;
InputChauffe = smoothThermistorChauffe.temperature();
myPID.Compute();
afficheTemp(Input, InputChauffe);
afficheConsigne(valTempChauffe, valTempProduit);
oldTime300 = millis();
}
dimmerTherm();
gestionBouton();
gestionEncodeur();
}
//-------------------------------------------------------
// Sous Programmes
//-------------------------------------------------------
void gestionEncodeur(){
if (flagReglageProduit){
newPosition = myEnc.read();
valTempProduit = valTempProduit + ((newPosition - oldPosition)/2);
oldPosition = newPosition;
}
if (flagReglageChauffe){
newPosition = myEnc.read();
valTempChauffe = valTempChauffe + ((newPosition - oldPosition)/2);
oldPosition = newPosition;
}
}
void dimmerTherm() {
dimmerTime=millis();
display.setTextSize(1);
if ((dimmerTime-oldDimmerTime)>=2550) oldDimmerTime=dimmerTime;
display.setCursor(0, 55);
if ((dimmerTime-oldDimmerTime) >= (Output*10)){
digitalWrite(oPinChauffe,false);
display.print(" ");
}
else{
digitalWrite(oPinChauffe,true);
display.print("* ");
}
int temporaire = Output/2.55;
if (temporaire < 10) display.print(" ");
else if (temporaire < 100) display.print(" ");
display.print(temporaire);
display.print("%");
display.display();
}
void afficheTemp (double tempProduit, double tempChauffe) {
int inputEnt;
int inputVir;
//display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SH110X_WHITE,SH110X_BLACK);
display.setCursor(0, 0);
inputEnt = (tempProduit +.05)/10;
inputVir = (tempProduit +.05)-(inputEnt*10);
display.print(inputEnt);
display.print(".");
display.print(inputVir);
display.setCursor(0, 32);
inputEnt = tempChauffe+.05;
inputVir = ((tempChauffe+.05)*10)-(inputEnt*10);
display.print(inputEnt);
display.print(".");
display.print(inputVir);
display.display();
}
void afficheConsigne(double valTempChauffe, double valTempProduit) {// bool adjChauffe,bool adjProduit) {
int inputEnt;
int inputVir;
//display.clearDisplay();
display.setTextSize(2);
if (!flagReglageProduit) display.setTextColor(SH110X_WHITE,SH110X_BLACK);
else display.setTextColor(SH110X_BLACK,SH110X_WHITE);
display.setCursor(64, 0);
inputEnt = (valTempProduit+0.5)/10; //
inputVir = (valTempProduit+.5)-(inputEnt*10);
display.print(inputEnt);
display.print(".");
display.print(inputVir);
display.setCursor(64, 32);
if (!flagReglageChauffe) display.setTextColor(SH110X_WHITE,SH110X_BLACK);
else display.setTextColor(SH110X_BLACK,SH110X_WHITE);
inputEnt = (valTempChauffe+.5)/10;
inputVir = (valTempChauffe+.5)-(inputEnt*10);
display.print(inputEnt);
display.print(".");
display.print(inputVir);
display.display();
}
void gestionBouton() {
if (!digitalRead(iPinBtnH)) { //Appui bouton Haut
if (flagBtnH) {
if ((millis() - timeBtnH > tempsAppuiCourt) and !flagHcourt) {
flagHcourt = true;
}
if ((millis() - timeBtnH > tempsAppuiLong) and !flagHlong) {
flagHcourt = false;
flagHlong = true;
}
} else {
flagBtnH = true;
timeBtnH = millis();
}
} else {
flagBtnH = false;
if (flagHcourt and !flagHlong) {
flagHcourt = false;
flagHlong = false;
boutonHcourt();
}
if (flagHlong) {
flagHlong = false;
flagHcourt = false;
boutonHlong();
}
}
if (!digitalRead(iPinBtnB)) { //Appui bouton Bas
if (flagBtnB) {
if ((millis() - timeBtnB > tempsAppuiCourt) and !flagBcourt) {
flagBcourt = true;
}
if ((millis() - timeBtnB > tempsAppuiLong) and !flagBlong) {
flagBcourt = false;
flagBlong = true;
}
} else {
flagBtnB = true;
timeBtnB = millis();
}
} else {
flagBtnB = false;
if (flagBcourt and !flagBlong) {
flagBcourt = false;
flagBlong = false;
boutonBcourt();
}
if (flagBlong) {
flagBlong = false;
flagBcourt = false;
boutonBlong();
}
}
if (!digitalRead(iPinEncSw)) { //Appui bouton Encodeur
if (flagBtnSw) {
if ((millis() - timeBtnSw > tempsAppuiCourt) and !flagSwcourt) {
flagSwcourt = true;
}
if ((millis() - timeBtnSw > tempsAppuiLong) and !flagSwlong) {
flagSwcourt = false;
flagSwlong = true;
}
} else {
flagBtnSw = true;
timeBtnSw = millis();
}
} else {
flagBtnSw = false;
if (flagSwcourt and !flagSwlong) {
flagSwcourt = false;
flagSwlong = false;
boutonSwcourt();
}
if (flagSwlong) {
flagSwlong = false;
flagSwcourt = false;
boutonSwlong();
}
}
}
void boutonHcourt() {
}
void boutonHlong() {
if (!flagReglageProduit and !flagReglageChauffe){
flagReglageProduit= true;
oldPosition = myEnc.read();
}
}
void boutonBcourt() {
}
void boutonBlong() {
if (!flagReglageProduit and !flagReglageChauffe){
flagReglageChauffe = true;
oldPosition = myEnc.read();
}
}
void boutonSwcourt() {
if (flagReglageProduit){
EEPROM.put(4, valTempProduit);
Setpoint = valTempProduit;
}
if (flagReglageChauffe){
EEPROM.put(2, valTempChauffe);
}
flagReglageChauffe = false;
flagReglageProduit = false;
}
void boutonSwlong() {
if (flagReglageProduit){
EEPROM.put(4, valTempProduit);
Setpoint = valTempProduit;
}
if (flagReglageChauffe){
EEPROM.put(2, valTempChauffe);
}
flagReglageChauffe = false;
flagReglageProduit = false;
}