Re bonsoir,
J'ai dormi un peu, mais pas suffisamment que pour avoir l'esprit suffisamment vif. Voici le programme que j'ai écris jusqu'à présent, sur base de la rtc sur le canal 7 du tca.
[code]
#include <EEPROM.h> // Pour extension à venir
#include "RTClib.h"
#include <OneWire.h>
#include <DallasTemperature.h>
RTC_DS1307 rtc;
#include <SSD1306Ascii.h>
#include <SSD1306AsciiAvrI2c.h>
#include <Wire.h>
// Attachement écran0 avec la librairie
SSD1306AsciiAvrI2c ecran0;
// Attachement écran1 avec la librairie
SSD1306AsciiAvrI2c ecran1;
// Création d'un objet pour l'adresse du module TCA9548A
#define TCAADDR 0x70
char textDisplayOne[] = "Afficheur 1";
char textDisplayTwo[] = "Afficheur 2";
int pot = A1; // Acquisition d'une valeur de potentiomètre sur A1
int valeur_pot;
int consigne; // Pour test avec pot en guise de consigne
float newtemp = 0.0;
float tempC;
bool chauffe;
int memo_temp[144];
int cpt_memo_temp = 0;
byte cpti;
byte cptj;
byte cptk;
byte cptl;
bool premier_cycle = true;
// Pour affichage du jour de la semaine
char *JOUR[7] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
//
int HH[7][4];
int MM[7][4];
bool mode_marche = true ; // Auto = true, Manu = False
bool prog_spec = true; // 1 prog par jour = true, le même programme tous les jours = false
int jour_derogation = 0; // Si > 0 dérogation pendant x jours, sinon programme normal
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
// 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);
void setup() {
Wire.begin();
Serial.begin(115200);
// Lance le communication I2C avec le module RTC et
// attend que la connection soit operationelle
TCA9548A(7);
while (! rtc.begin()) {
Serial.println("Attente du module RTC...");
delay(1000);
}
sensors.begin();
// Mise a jour de l'horloge du module RTC si elle n'a pas
// ete reglee au prealable
if (! rtc.isrunning()) {
// La date et l'heure de la compilation de ce croquis
// est utilisee pour mettre a jour l'horloge
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Pour ajuster en manu, ex: 01 Janvier 2021 00h00
// rtc.adjust(DateTime(2021, 1, 1, 0, 0));
Serial.println("Horloge du module RTC mise a jour");
}
acquisition_temperature(); // appel fonction
Serial.print(tempC);
Serial.println(" Celsius");
/* Ecriture par défaut du contenu mémoires pour les programmes sur 7 jours
A remplacer par la lecture EEPROM
HH[0..7][0] = 06 MM[0..7][0] = 30
HH[0..7][1] = 12 MM[0..7][1] = 00
HH[0..7][2] = 15 MM[0..7][2] = 00
HH[0..7][3] = 22 MM[0..7][3] = 30
*/
for (cpti = 0; cpti <= 6; cpti ++)
{
HH[cpti][0] = 06;
MM[cpti][0] = 30;
HH[cpti][1] = 12;
MM[cpti][1] = 00;
HH[cpti][2] = 15;
MM[cpti][2] = 00;
HH[cpti][3] = 22;
MM[cpti][3] = 30;
}
// Initialisation canal 0 TCA pour écran 0
TCA9548A(0);
ecran0.begin(&Adafruit128x32, 0x3C);
ecran0.clear();
ecran0.setFont(System5x7);
Serial.println(("Initialize 0"));
// Initialisation canal 1 TCA pour écran 1
TCA9548A(1);
ecran1.begin(&Adafruit128x32, 0x3C);
ecran1.clear();
ecran1.setFont(System5x7);
Serial.println(("Initialize 1"));
}
void loop() {
oled0();
oled1();
/* Vérification du contenu mémoires pour les programmes sur 7 jours
ex:
Contrôle température pour Dimanche de 06:30 à 12:00 et de 15:00 à 22:30
HH[0..7][0] = 06 MM[0..7][0] = 30
HH[0..7][1] = 12 MM[0..7][1] = 00
HH[0..7][2] = 15 MM[0..7][2] = 00
HH[0..7][3] = 22 MM[0..7][3] = 30
*/
if (premier_cycle == true)
{
for (cpti = 0; cpti <= 6; cpti ++)
{
Serial.println();
Serial.print(JOUR[cpti]);
for (cptj = 0; cptj <= 3; cptj ++)
{
Serial.print(" ");
if (HH[cpti][cptj] <= 10) Serial.print("0");
Serial.print(HH[cpti][cptj]);
Serial.print(":");
if (MM[cpti][cptj] <= 10) Serial.print("0");
Serial.print(MM[cpti][cptj]);
Serial.print(" ");
}
}
Serial.println("");
}
chauffage();
lecture_heure();
delay(5000);
valeur_pot = analogRead(pot);
consigne = map(valeur_pot, 0, 1023, 15, 45);
Serial.print("Consigne: ");
Serial.print(consigne);
Serial.print(" C");
Serial.print(",Mesure: ");
Serial.print(tempC);
Serial.print(",Demande de chauffage: ");
Serial.println(chauffe);
acquisition_temperature(); // appel fonction
// Mémorisation temp toutes les 10 minutes
if (abs(newtemp - millis()) >= 600000)
{
memo_temp[cpt_memo_temp] = tempC;
newtemp = millis();
acquisition_temperature();
cpt_memo_temp ++;
if (cpt_memo_temp >= 144)
{
cpt_memo_temp = 0;
}
}
premier_cycle = false;
}
// Lecture de date et heure depuis le module RTC
void lecture_heure (void) {
TCA9548A(7);
Serial.print("Lire l'heure\n");
// Lecture de l'heure depuis le module RTC
DateTime now = rtc.now();
// Affiche l'heure courante retournee par le module RTC
Serial.print("Il est ");
if (now.hour() <= 9) Serial.print("0");
Serial.print(now.hour());
Serial.print(":");
if (now.minute() <= 9) Serial.print("0");
Serial.print(now.minute());
Serial.print(":");
if (now.second() <= 9) Serial.print("0");
Serial.print(now.second());
Serial.print(" ");
Serial.print(JOUR[now.dayOfTheWeek()]);
Serial.print(" ");
if (now.day() <= 9) Serial.print("0");
Serial.print(now.day());
Serial.print("/");
if (now.month() <= 9) Serial.print("0");
Serial.print(now.month());
Serial.print("/");
Serial.print(now.year());
Serial.println(" ");
}
void acquisition_temperature(void) {
sensors.requestTemperatures(); // Send the command to get temperatures
tempC = sensors.getTempCByIndex(0);
}
void chauffage(void) {
// Comparaison consigne / mesure
// Si comparaison +, pas de chauffe
// Si comparaison - de 2 degrés, chauffe
if (int(tempC) >= consigne)
{
chauffe = false;
} else {
if (int(tempC) <= (consigne - 2))
{
chauffe = true;
}
}
}
void TCA9548A(uint8_t bus)
{
Wire.beginTransmission(TCAADDR); //TCA9548A address is 0x70
Wire.write(1 << bus); // send byte to select bus
Serial.print("Boucle TCA, Bus: ");
Serial.println(bus);
Wire.endTransmission();
}
void oled0() {
TCA9548A(0);
ecran0.clear();
ecran0.set1X();
ecran0.setCursor(15, 0);
ecran0.print(tempC);
ecran0.print(" C");
ecran0.setCursor(0, 2);
ecran0.print(textDisplayOne);
Serial.println(("Ecrire sur écran 1"));
delay(1000);
ecran0.clear();
}
void oled1() {
TCA9548A(1);
ecran1.clear();
ecran1.set1X();
ecran1.setCursor(0, 0);
ecran1.print(textDisplayTwo);
Serial.println(("Ecrire sur écran 2"));
delay(1000);
ecran1.clear();
}
[/code]
Et, la sortie du moniteur série (les premières secondes).
22:37:22.837 -> Boucle TCA, Bus: 7
22:37:23.540 -> 23.81 Celsius
22:37:23.540 -> Boucle TCA, Bus: 0
22:37:23.587 -> Initialize 0
22:37:23.587 -> Boucle TCA, Bus: 1
22:37:23.634 -> Initialize 1
22:37:23.634 -> Boucle TCA, Bus: 0
22:37:23.634 -> Ecrire sur écran 1
22:37:24.665 -> Boucle TCA, Bus: 1
22:37:24.712 -> Ecrire sur écran 2
22:37:25.696 ->
22:37:25.696 -> Dimanche 06:30 12:00 15:00 22:30
22:37:25.696 -> Lundi 06:30 12:00 15:00 22:30
22:37:25.696 -> Mardi 06:30 12:00 15:00 22:30
22:37:25.696 -> Mercredi 06:30 12:00 15:00 22:30
22:37:25.743 -> Jeudi 06:30 12:00 15:00 22:30
22:37:25.743 -> Vendredi 06:30 12:00 15:00 22:30
22:37:25.743 -> Samedi 06:30 12:00 15:00 22:30
22:37:25.743 -> Boucle TCA, Bus: 7
22:37:25.743 -> Lire l'heure
22:37:25.743 -> Il est 165:165:45 Dimanche 165/165/2165
22:37:30.710 -> Consigne: 24 C,Mesure: 23.81,Demande de chauffage: 0
22:37:31.366 -> Boucle TCA, Bus: 0
22:37:31.413 -> Ecrire sur écran 1
22:37:32.444 -> Boucle TCA, Bus: 1
22:37:32.444 -> Ecrire sur écran 2
22:37:33.475 -> Boucle TCA, Bus: 7
22:37:33.475 -> Lire l'heure
22:37:33.475 -> Il est 165:165:45 Dimanche 165/165/2165
22:37:38.490 -> Consigne: 24 C,Mesure: 23.81,Demande de chauffage: 0
22:37:39.146 -> Boucle TCA, Bus: 0
22:37:39.146 -> Ecrire sur écran 1
22:37:40.158 -> Boucle TCA, Bus: 1
22:37:40.204 -> Ecrire sur écran 2
22:37:41.235 -> Boucle TCA, Bus: 7
22:37:41.235 -> Lire l'heure
22:37:41.235 -> Il est 165:165:45 Dimanche 165/165/2165
Je suis certain de mal faire quelques chose, ou d'avoir mal compris le fonctionnement du tca (??)
Bonne soirée.