une résistance chauffante commandée par relais chauffera le bain pour l'amener a sa T° de consigne
après il me reste de entrées / sorties pour faire le café

/*
JoboLike serait :
constitué à partir d'un bac et contiendrait un système à bain régulé, pas de thermostat, mais des capteur de T°,
résistance chauffante et brassage du bain marie pour homogénéiser la T° (une pompe d'aquarium par exemple).
un moteur à courant continu pour l'agitation avec inversions de la cuve (une Jobo serie 1500 avec son aimant bien sur)
il faut trouver celui avec les bons rpm.
un afficheur Lcd permettant de régler la T° de consigne, les Temps de dev (avec alarme à la fin)
le brochage suit le schéma du CompTraLED
*/
//-----------------------------------------------------------
// insertion des librairies
//-----------------------------------------------------------
#include <LiquidCrystal_I2C.h>
#include <math.h>
#include <Wire.h>
#include <Encoder.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 4
//#define TEMPERATURE_PRECISION 9
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
DeviceAddress th1;
//------------------------------------------------------------
// initialize the library with the numbers of the interface pins
Encoder myEnc(3,2 );
int MemoEnc = 4;
// pour certain afficheur c'est 0x3F d'autres 0x27 ...
const int I2C_ADDR = 0x27; // cette variable est aussi utilisée plus bas pour afficher l'addresse du LCD
const int BACKLIGHT_PIN = 3;
const int En_pin = 2;
const int Rw_pin = 1;
const int Rs_pin = 0;
const int D4_pin = 4;
const int D5_pin = 5;
const int D6_pin = 6;
const int D7_pin = 7;
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin,BACKLIGHT_PIN,POSITIVE);
//-----------------------------------------------------------
// déclaration des variables de broches
//-----------------------------------------------------------
//const int bpNoir = 1; //bouton noir
// 2
// 3
// 4
const int bpRouge = 5; //bouton rouge
const int Buzer = 6;
const int valide = 7; // bouton de l'encodeur
// 8
const int avant = 9; // constantes de broches du moteur
const int arriere = 10; // constantes de broches du moteur
// 11
// 12 T° ok
// 11 chauffage
const int valDivis = 171;
//-----------------------------------------------------------
// déclaration des variables de programme
//-----------------------------------------------------------
float Tbac = 0;
int initData = 255;
char MyChar;
int memoChar;
int vitMot = 90;
int intCol = 0;
int intRang = 0;
int minute = 0;
int seconde = 0;
float temperature = 0;
int MemoAdrr = 0;
unsigned long tempsRot = 0;
boolean tempOK = false;
boolean rotHorraire = true;
unsigned long tempsDev;
int valAna;
int valComo = 0;
int intDecal;
long tempsInit;
//memorisationde la valeur de myEnc en position 4
int intMyEnc4;
int intMyEncDev; //memorisation valeur de myEnc
float fltTempH; // T° arret chauffage
float fltTempB; // T° depart chauffage
//-----------------------------------------------------------
// initialisations
//-----------------------------------------------------------
void setup(){
// Start up the library DallasTemperature
pinMode(Buzer, OUTPUT);
analogWrite(Buzer, 10);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(avant, OUTPUT);
pinMode(arriere, OUTPUT);
analogWrite(avant,0);
analogWrite(arriere, 0);
sensors.begin();
sensors.getAddress(th1, 0);
sensors.setResolution(th1, 12);
lcd.begin(16, 2);
lcd.print("Easy Process");
lcd.setCursor(0,1);
lcd.print("V1.0");
delay(5);
analogWrite(Buzer,0);
delay(1500);
lcd.clear();
lcd.print(" bl.ack.design ");
lcd.setCursor(0,1);
lcd.print(" @orange.fr ");
delay(3000);
lcd.clear();
// lcd.print("Td:38.4 T.i:");
pinMode(bpRouge, INPUT);
digitalWrite(bpRouge, HIGH);
//bp validation de l'encodeur rotatif
pinMode(valide, INPUT);
digitalWrite(valide, HIGH);
// pinMode(bpVert, INPUT);
// digitalWrite(bpVert, HIGH);
// pinMode(bpBleu, INPUT);
// digitalWrite(bpBleu, HIGH);
//myEnc.write(1512);//37.8°C
myEnc.write(800);//20°C
}
//-----------------------------------------------------------
// Boucle principale
//-----------------------------------------------------------
void loop() {
// etat du commutateur 6 positions
valAna = analogRead(0);
delay(300);
if (valAna > 0 && valAna < 200) {
valComo = 5;
}
if (valAna > 200 && valAna < 400) {
valComo = 4;
}
if (valAna > 400 && valAna < 600) {
valComo = 3;
}
if (valAna > 600 && valAna < 750) {
valComo = 2;
}
if (valAna > 750 && valAna < 900) {
valComo = 1;
}
if (valAna > 1000 ) {
valComo = 0;
}
switch (valComo) {
// traitement C41
case 0:
if (initData != 0){
initData = 0;
lcd.clear();
lcd.print("reinitialisation");
digitalWrite(12, LOW);
//digitalWrite(13, LOW);
analogWrite(11, 0);
}
break;
case 1: // traitement C41
if (initData != 1) {
initData = 1;
lcd.clear();
lcd.print("traitement C41");
digitalWrite(12, LOW);
//digitalWrite(13, LOW);
analogWrite(11, 0);
temperature = 38;
minute = 3;
seconde = 15;
fltTempH = 0.2;
fltTempB = 0.2;
}
//lcd.clear();
C41();
break;
case 2:// traitement E6
if (initData != 2) {
initData = 2;
lcd.clear();
digitalWrite(12, LOW);
//digitalWrite(13, LOW);
analogWrite(11, 0);
lcd.print("traitement E6");
temperature = 38;
minute = 6;
seconde = 30;
fltTempH = 0.2;
fltTempB = 0.2;
}
delay(2000);
lcd.clear();
E6();
break;
case 3: // choix traitement N&B
if (initData != 3) {
initData = 3;
myEnc.write(EEPROM.read(1023));
digitalWrite(12, LOW);
//digitalWrite(13, LOW);
analogWrite(11, 0);
lcd.clear();
fltTempH = 0.5;
fltTempB = 0.5;
affMemo();
}
foncData();
break;
case 4:
if (initData != 4) {
initData = 4;
intMyEnc4 = myEnc.read();
myEnc.write(0);
tempsInit = (long (minute * 60) + seconde) * 1000;
//myEnc.write(0);
}
foncPrinc();
break;
case 5:
if (initData != 5) {
initData = 5;
tempOK = true;
}
foncProg();
break;
}
}
// fonction principale traitement N&B (attente lancement dev)
// position 4 du commutateur
void foncPrinc() {
float memoTemperature;
//float tempsInitBase;
regulTemp();
affTempBase();
//tempsInit = (long (minute * 60) + seconde) * 1000;
if (myEnc.read() != 0) {
memoTemperature = temperature;
temperature = temperature + (myEnc.read()/4);
myEnc.write(0);
tempsInit = exp((temperature - memoTemperature) *-0.081) * tempsInit;
}
if (digitalRead(bpRouge) == LOW ) {
//tempsInit = (long (minute * 60) + seconde) * 1000;
tempsDev = tempsInit + millis();
sequenceDev();
// stoper la rotation
analogWrite(avant, 0);
analogWrite(arriere, 0);
// attendre pour bain d'arret
lcd.clear();
lcd.print("bain d'arret");
analogWrite(Buzer, 150);
while (digitalRead(bpRouge) == HIGH ) {
regulTemp();
}
delay(200);
analogWrite(Buzer, 0);
tempsDev = 30000 + millis();
sequenceDev();
analogWrite(avant, 0);
analogWrite(arriere, 0);
lcd.clear();
lcd.print("Fixateur");
analogWrite(Buzer, 150);
while (digitalRead(bpRouge) == HIGH ) {
regulTemp();
}
delay(200);
analogWrite(Buzer, 0);
tempsDev = 300000 + millis();
sequenceDev();
analogWrite(avant, 0);
analogWrite(arriere, 0);
// attendre pour fixateur
// fin de traitement
analogWrite(Buzer, 0);
}
}
// lancement de la séquence de developpement
void sequenceDev(){
rotHorraire = false;
analogWrite(avant, 0);
delay(50);
intMyEncDev = myEnc.read();
myEnc.write(vitMot);
//analogWrite(arriere, 255);
analogWrite(arriere, 200);
delay(80);
analogWrite(arriere, vitMot);
while (millis() < tempsDev) {
if (millis() > tempsDev - 5000) {
analogWrite(Buzer, 25);
}
// action moteur
if (tempsRot == 0) {
tempsRot = millis() + 1500;
}
if (myEnc.read() > 255){
myEnc.write(255);
}
if (myEnc.read() < 25){
myEnc.write(25);
}
vitMot = myEnc.read();
if (millis() > tempsRot) {
switch (rotHorraire) {
case false:
analogWrite(arriere, 0);
delay(250);
analogWrite(avant, 200);
delay(80);
analogWrite(avant, vitMot);
rotHorraire = true;
tempsRot = millis() + 1500;
// faire tourner dans le sens horraire
break;
case true:
rotHorraire = false;
analogWrite(avant, 0);
delay(250);
analogWrite(arriere, 200);
delay(80);
analogWrite(arriere, vitMot);
tempsRot = millis() + 1500;
// faire tourner dans le sens anti-horraire
break;
}
}
if (myEnc.read() > 255){
myEnc.write(255);
}
if (myEnc.read() < 25){
myEnc.write(25);
}
vitMot = myEnc.read();
regulTemp();
affLCD();
}
myEnc.write(intMyEncDev);
}
//
// controle et regulation de la Temperature
void regulTemp() {
// acquisition T°
sensors.requestTemperatures(); // Send the command to get temperatures
Tbac = sensors.getTempCByIndex(0);// - 0.5;
//float Tbac = sensors.getTempC(0);// - 0.5;
// if (Tbac != MemoTbac) {
// MemoTbac = Tbac;
// }
// recherche de la T° de consigne
if ((Tbac + fltTempB) < temperature){
// enclenchement chauffage
//digitalWrite(13, HIGH);
analogWrite(11, 255);
if ((Tbac + (fltTempB / 2)) > temperature){
digitalWrite(12, HIGH);
}
else {
digitalWrite(12, LOW);
}
}
else {
if ((Tbac - fltTempH) > temperature){
digitalWrite(12, LOW);
lcd.setCursor(0,1);
}
else {
// arret chauffage
//digitalWrite(13, LOW);
analogWrite(11, 0);
digitalWrite(12, HIGH);
tempOK = true;
}
// stop Chauffage
}
// /// fin régulation T°
//affLCD();
if (float(Tbac - (fltTempH * 1.5)) > float(temperature)){
//digitalWrite(13, LOW);
analogWrite(11, 0);
}
}
// enregistrement des données de fonctionnement
void foncData() {
if (digitalRead(valide) == LOW) {
EEPROM.write(1023, MemoEnc);
lcd.clear();
lcd.print("choix process");
lcd.setCursor(0,1);
lcd.print("par defaut");
delay(1000);
lcd.clear();
affMemo();
}
if (MemoEnc != myEnc.read()){
MemoEnc = myEnc.read();
intDecal = (MemoEnc / 4) * 19;
lcd.clear();
affMemo();
}
}
// affichage de la mémoire
void affMemo(){
if (myEnc.read() > 200){
myEnc.write(0);
}
if (myEnc.read() < 0){
myEnc.write(200);
}
for (int i = intDecal; i < intDecal + 16; i++){
MyChar = EEPROM.read(i);
lcd.print(MyChar);
}
lcd.setCursor(0,1);
lcd.print(EEPROM.read(intDecal + 16));
minute = EEPROM.read(intDecal + 16);
lcd.print(".");
lcd.print(EEPROM.read(intDecal + 17));
seconde = EEPROM.read(intDecal + 17);
lcd.print("mn a ");
lcd.print(EEPROM.read(intDecal + 18));
temperature = EEPROM.read(intDecal + 18);
MyChar = 223;
lcd.print(MyChar);
lcd.print("C.");
}
// traitement C41
void C41(){
boolean boolLavage = true;
valAna = analogRead(0);
while (valAna > 750 && valAna < 900){
regulTemp();
valAna = analogRead(0);
if (digitalRead(bpRouge) == LOW ) {
tempsDev = long (long (long (minute * 60) + seconde) * 1000) + long (millis());
// revelateur chromogene
sequenceDev();
// lavage
//lcd.clear();
while (digitalRead(bpRouge) == HIGH ){
if (boolLavage == true) {
boolLavage = false;
lcd.setCursor(0,0);
lcd.print("attente pour");
lcd.setCursor(0,1);
lcd.print("lavage film");
}
}
tempsDev = millis() + 180000;
sequenceDev();
while (digitalRead(bpRouge) == HIGH ){
if (boolLavage == true) {
boolLavage = false;
lcd.setCursor(0,0);
lcd.print("attente pour");
lcd.setCursor(0,1);
lcd.print("Blanchiment Fix");
}
}
tempsDev = millis() + 180000;
sequenceDev();
//
}
}
}
// fin C41----------------------------------------------------------------------------------
// traitement E6
void E6(){
valAna = analogRead(0);
while (valAna > 600 && valAna < 750){
regulTemp();
valAna = analogRead(0);
}
}
// fonction de programation des Temps et T° pour le N&B
void foncProg() {
int valCursorH = 0;
int valCursorV = 0;
char myChar = 0;
int myDecal = intDecal;
int myMn = -1;
int mySec = -1;
int myTemp = -1;
valAna = analogRead(0);
lcd.blink();
while (valAna > 0 && valAna < 200){
if (tempOK == true){
lcd.setCursor(0,0);
lcd.print("programation");
lcd.setCursor(0,1);
lcd.print("Temperature/Temps");
delay(1000);
lcd.clear();
tempOK = false;
affMemo();
myEnc.write(EEPROM.read(myDecal) * 4);
}
valAna = analogRead(0);
lcd.setCursor(valCursorH,valCursorV);
if (myDecal < intDecal + 16) {
if (myChar != myEnc.read()/4){
myChar = myEnc.read()/4;
lcd.print(myChar);
}
//}
//myEnc.write(EEPROM.read(myDecal) * 4);
if (digitalRead(valide) == LOW) {
//lcd.clear();
delay(300);
myChar = myEnc.read()/4;
//if (intDecal < 16) {
if (myChar != EEPROM.read(myDecal)){
EEPROM.write(myDecal, myChar);
}
myDecal++;
valCursorH++;
myEnc.write(EEPROM.read(myDecal) * 4);
delay(300);
//}
}
}
if (digitalRead(bpRouge) == LOW) {
lcd.clear();
//myDecal = intDecal + 16;
//valCursorH = 0;
//valCursorV = 0;
delay(300);
lcd.print("reglage mn :");
myMn = EEPROM.read(intDecal + 16);
mySec = EEPROM.read(intDecal + 17);
myTemp = EEPROM.read(intDecal + 18);
lcd.setCursor(12,0);
lcd.print(myMn);
lcd.setCursor(0,1);
lcd.print("secondes :");
lcd.print(mySec);
myEnc.write(myMn * 4);
lcd.setCursor(12,0);
while (digitalRead(bpRouge) == HIGH)
{
if (myMn != myEnc.read()/4) {
lcd.setCursor(12,0);
myMn = myEnc.read()/4;
lcd.print(" ");
lcd.setCursor(12,0);
lcd.print(myMn);
}
delay(300);
}
if (myMn != EEPROM.read(intDecal + 16)){
EEPROM.write(intDecal + 16,myMn);
delay(300);
}
delay(500);
myEnc.write(mySec * 4);
lcd.setCursor(12,1);
while (digitalRead(bpRouge) == HIGH)
{
if (mySec != myEnc.read()/4) {
lcd.setCursor(12,1);
mySec = myEnc.read()/4;
lcd.print(" ");
lcd.setCursor(12,1);
lcd.print(mySec);
}
delay(300);
}
if (mySec != EEPROM.read(intDecal + 17)){
EEPROM.write(intDecal + 17,mySec);
delay(300);
}
valAna = analogRead(0);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Rgl.temperature");
lcd.setCursor(3,1);
lcd.print(char(223));
lcd.print("C.");
lcd.setCursor(0,1);
myEnc.write(myTemp * 4);
delay(500);
while (digitalRead(bpRouge) == HIGH)
{
if (myTemp != myEnc.read()/4) {
lcd.setCursor(0,1);
myTemp = myEnc.read()/4;
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(myTemp);
}
}
if (myTemp != EEPROM.read(intDecal + 18)){
EEPROM.write(intDecal + 18,myTemp);
delay(300);
}
valAna = analogRead(0);
}
}
lcd.noBlink();
}
void affTempBase(){
//char tampon[25];
lcd.setCursor(0,0);
//lcd.print(minute);
lcd.print(tempsInit / 60000);
lcd.print(".");
//lcd.print(seconde);
lcd.print((tempsInit % 60000)/1000);
lcd.print("mn ");
lcd.setCursor(0,1);
//sprintf(tampon,"%f8.2",Tbac);
//lcd.print(tampon);
lcd.print(Tbac);
lcd.print("->");
lcd.print(temperature);
lcd.print(char(223));
lcd.print("C. ");
}
//
void affLCD() {
//char tampon[25];
//lcd.clear();
int tempsRest;
tempsRest = (tempsDev - millis()) / 1000;
lcd.setCursor(0,0);
lcd.print(tempsRest / 60);
lcd.print(".");
lcd.print(tempsRest % 60);
lcd.print("mn ");
lcd.setCursor(0,1);
//sprintf(tampon,"%f8.2",Tbac);
//lcd.print(tampon);
lcd.print(Tbac);
lcd.print("->");
lcd.print(temperature);
lcd.print(char(223));
lcd.print("C. ");
}