first commit

This commit is contained in:
Jérôme Delacotte
2025-03-06 11:15:32 +01:00
commit 7b30d6e298
5276 changed files with 2108927 additions and 0 deletions

View File

@@ -0,0 +1,795 @@
//#include <MemoryFree.h>
// #include <SPI.h>
#include <Wire.h>
//#include <Adafruit_GFX.h> //sans graphique ca passe
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
//Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO: A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO: 2(SDA), 3(SCL), ...
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define pinILS 2
#define pi 3.14159265359
#define RayonDesBras 0.025 // en mètre de l'anénomètre
unsigned long antiRebonds = 20000; // anti-rebonds anemometres 10 millis-secondes
unsigned long chronoAnemometre = micros(); //et > temps de passage devant aimant (à calculer)
unsigned long millis_old = 0;
unsigned long Minuteriedepart = 0; // valeur de la constante millis
unsigned long Raz_Minuteriedepart = 0; // valeur de la constante millis
unsigned long tempsecoule = 0; // valeur du temps de marche
//unsigned long Minuterie1 = 0; // valeur de la constante millis
//unsigned long Raz_Minuterie1 = 0; // valeur de la constante remise a zero
float delta_temps = 0;
float vitesseVentms = 0;
float vitesseVentkmh = 0;
float NombreTourSec = 0;
float NombreTour = 0;
float FEtalonage = 1;
volatile int nombre_aimant = 0;
/* NB : La fonction d'étalonnage traduit les propriétés aérodynamiques de
l'anémomètre et les frottements qui altèrent le mouvement de rotation de l'anémomètre.
Elle dépend des dimensions et matériaux de l'anémomètre et de sa vitesse de rotation.
Seuls des essais en soufflerie à différents régimes de vent permettent de la déterminer précisément. */
bool etat_ILS = false;
bool etat = 0;
int PinLdrEst = A1; // 4 LdRs capteurs de lumière
int PinLdrOuest = A0;
int PinLdrHaut = A3;
int PinLdrBas = A2;
// A4 réservé oled SDA
// A5 réservé oled SCL
//int Ecart = 10;
//int lum_moyenne = 0;
int delta_O_E = 5;
int delta_H_B = 5;
int jour = 0;
int Cp_N = -20; // valeur de compensation lors de l'alignement variable a chaque install
int Cp_S = 20; // valeur de compensation lors de l'alignement variable a chaque install
int Cp_E = 15; // valeur de compensation lors de l'alignement variable a chaque install
int Cp_O = -15; // valeur de compensation lors de l'alignement variable a chaque install
// 2 moteurs horizontal Est/Ouest et vertical Haut/Bas
//Mot Horizontal
const int Moteur_H = 8; //ENR / ENL
#define EST 9 //RPWM
#define OUEST 10 //LPWM
//Mot Vertical
const int Moteur_V = 7; //ENR / ENL
#define HAUT 6 //RPWM HAUT
#define BAS 5 //LPWM BAs
int variahysteresis = 0;
int lumi = 850; //valeur jour temps couvert
// si couvert agrandir evite de finir a l ouest si les ldr sont mal étalonnées
// fin de course
const int Fdc_N = 3; // broche Rx fin de course Nord
const int Fdc_S = 4; // broche Rx fin de course Sud
const int Fdc_E = 11; // broche Rx fin de course Est
const int Fdc_O = 12; // broche Rx fin de course Ouest
int hysteresis_H = 15; //anti baguottage
int hysteresis_V = 10; //anti baguottage
int nuit = 550; // Valeur en-dessous de laquelle on considère qu'il ne produit plus
// donc retour verifier la valeur mini
boolean memo_Fdc_E = true; // pour memo FDC atteint, sert d"anti rebonds
boolean memo_Fdc_O = true; // pour memo FDC atteint, sert d"anti rebonds
boolean memo_Fdc_S = true; // pour memo FDC atteint, sert d"anti rebonds
boolean memo_Fdc_N = true; // pour memo FDC atteint, sert d"anti rebonds
int variat = 255;
void isr_anemometre() {
if (micros() > chronoAnemometre) {
chronoAnemometre = micros();
nombre_aimant++;
}
}
void setup() { // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
display.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
//Serial.println(freeMemory());
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text sur fond noir
display.display();
delay(3000); // Pause for 3 seconds on a le temps stabilise les valeurs ldr au demarrage
display.clearDisplay();
display.setTextSize(2); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
// display.setCursor(40, 20); // Start at top-left corner
// display.print("MODE MARCHE ");
display.setCursor(15, 25); // Déplacement du curseur en position (0,0), c'est
display.print(F("TRAQUEUR V558 ABT"));
display.display();
delay(3000); // Pause for 3 seconds on a le temps stabilise les valeurs ldr au demarrage
display.clearDisplay();
//
pinMode(LED_BUILTIN, OUTPUT);
pinMode(pinILS, INPUT_PULLUP); //sur D2 donc interruption 0
attachInterrupt(0, isr_anemometre, FALLING); //ils ramène GND sur D2
Serial.begin(115200); // lecture écran
pinMode(PinLdrEst, INPUT); // entrées / sorties Ldrs et moteurs
pinMode(PinLdrOuest, INPUT);
pinMode(PinLdrHaut, INPUT);
pinMode(PinLdrBas, INPUT);
pinMode(Moteur_V, OUTPUT);
pinMode(Moteur_H, OUTPUT);
pinMode(EST, OUTPUT); //EST
pinMode(OUEST, OUTPUT); //OUEST
pinMode(BAS, OUTPUT); //BAS
pinMode(HAUT, OUTPUT); //HAUT
pinMode(Fdc_N, INPUT_PULLUP); // declare la pin du fin de course Nord (3)
pinMode(Fdc_S, INPUT_PULLUP); // declare la pin du fin de course Sud (4)
pinMode(Fdc_E, INPUT_PULLUP); // declare la pin du fin de course Est (11)
pinMode(Fdc_O, INPUT_PULLUP); // declare la pin du fin de course Ouest (12)
}
void loopvent() {
//Periode de temps
// Serial.print(F("La periode de temps du vent est de "));
// Serial.print(delta_temps, 2); //sera toujours == 1
// Serial.println(F(" s."));
//Nombre d'Aimant
// Serial.print(F("Le nombre d'aimants detectes est de ")); //supposons 30 ils/aimants
// Serial.print(nombre_aimant);
// Serial.println(F(" aimants."));
// Nombre de tours
NombreTour = nombre_aimant / 2; //nombre de tours=30/3=10tr/s
//affichage du nombre de tours
// Serial.print(F("Le nombre de tours est de "));
// Serial.print(NombreTour);
// Serial.println(F(" tours/s."));
// convertion periode -> fréquense
NombreTourSec = (NombreTour / delta_temps);
//affichage du nombre de tours/s
// Serial.print(F("Le nombre de tours en 1 sec est de "));
// Serial.print(NombreTourSec);
// Serial.println(F(" tours/s."));
// FEtalonage est initialisée à 1
// vitesse du vent
vitesseVentms = 2 * pi * RayonDesBras * NombreTourSec * FEtalonage; // 2/pi*0.025*10=1.57m/s
vitesseVentkmh = vitesseVentms * 3600 / 1000; // (1.57*3600)/1000=5;562Km/h
// affichage de la vitesse
// Serial.print(F("La vitesse du vent est de "));
// Serial.print(vitesseVentms);
// Serial.print(F(" m/s soit "));
// Serial.print(vitesseVentkmh);
// Serial.println(F(" km/h."));
nombre_aimant = 0;
millis_old = millis(); // remise à 0 du compteur pour capturer la différence de temps au prochain tour
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 20); // Start at top-left corner
display.print(F("MODE MARCHE "));
display.setCursor(0, 0); // Déplacement du curseur en position (0,0), c'est
display.setTextColor(SSD1306_WHITE); // Affichage du texte en "blanc" (avec la couleur principale, en fait, car l'écran monochrome peut être coloré)
display.print(F("vent "));
display.setCursor(35, 0);
display.println(vitesseVentkmh);
display.setCursor(65, 0);
display.println(F("km/h")); //sera toujours == 1
display.setCursor(100, 0);
display.println(hysteresis_V);
display.setCursor(30, 50);
display.print(F("amb"));
// display.setCursor(55, 50);
// display.print(luminosite_actuelle);
display.setCursor(85, 50);
display.println(delta_O_E);
display.setCursor(105, 50);
display.println(delta_H_B);
display.setCursor(0, 8);
display.print(F("FcO "));
display.setCursor(34, 8);
display.print(F("FcE "));
display.setCursor(64, 8);
display.print(F("FcN "));
display.setCursor(95, 8);
display.print(F("FcS "));
display.display(); // Transfert le buffer à l'écran
}
// £££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££
void loop() {
delta_temps = (millis() - millis_old);
// Serial.println(delta_temps, 2);
delta_temps = float(delta_temps / 1000);
// Serial.println(delta_temps, 2);
//delta_temps = float((micros() - micros_old) / 1000000);
if (delta_temps >= 1) //>= et non == car si dépassement on n'appellera jamais loopvent
{ //boucle delta exécutée 1 fois par seconde
loopvent();
}
// µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ init LDR et FDC µµµµµµµµµµµµµµµ
int ValLdrHaut = analogRead(PinLdrHaut);
int ValLdrBas = analogRead(PinLdrBas);
int ValLdrOuest = analogRead(PinLdrOuest);
int ValLdrEst = analogRead(PinLdrEst); // lire et calculer les valeurs
int luminosite_actuelle = ValLdrEst + ValLdrOuest + ValLdrBas; // établit la luminosité ambiante
luminosite_actuelle = luminosite_actuelle / 3;
ValLdrHaut = (ValLdrHaut + Cp_N);
ValLdrBas = (ValLdrBas + Cp_S);
ValLdrOuest = (ValLdrOuest + Cp_O);
ValLdrEst = (ValLdrEst + Cp_E);
int deltaEO = ValLdrEst - ValLdrOuest; // ctrl delta entre Est et Ouest
deltaEO = abs(deltaEO); //utile, positive les valeurs negatives
int deltaHB = ValLdrHaut - ValLdrBas; // ctrl delta entre Haut et Bas
deltaHB = abs(deltaHB);
memo_Fdc_N = digitalRead(Fdc_N); //
memo_Fdc_S = digitalRead(Fdc_S); //
memo_Fdc_O = digitalRead(Fdc_O);
memo_Fdc_E = digitalRead(Fdc_E);
display.clearDisplay();
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text sur fond noir
display.setCursor(0, 0); // Déplacement du curseur en position (0,0),
display.print(F("vent "));
display.setCursor(35, 0);
display.println(vitesseVentkmh);
display.setCursor(65, 0);
display.println(F("km/h")); //sera toujours == 1
display.setCursor(100, 0);
display.println(hysteresis_V);
display.setCursor(0, 20); // Start at x 0/ y 20
display.print(F("H"));
display.println(ValLdrHaut);
display.print(F("B"));
display.println(ValLdrBas);
display.print(F("E"));
display.println(ValLdrEst);
display.print(F("O"));
display.println(ValLdrOuest);
display.println(hysteresis_H);
//display.println(freeMemory());
display.setCursor(40, 20);
display.print(F("MODE MARCHE "));
display.setCursor(30, 50);
display.print(F("amb"));
display.setCursor(55, 50);
display.print(luminosite_actuelle);
display.setCursor(85, 50);
display.println(deltaEO);
display.setCursor(105, 50);
display.println(deltaHB);
display.setCursor(0, 8);
display.print(F("FcO "));
display.print(memo_Fdc_O);
display.setCursor(32, 8);
display.print(F("FcE "));
display.print(memo_Fdc_E);
display.setCursor(64, 8);
display.print(F("FcN "));
display.print(memo_Fdc_N);
display.setCursor(96, 8);
display.print(F("FcS "));
display.print(memo_Fdc_S);
display.display();
// Serial.print(F("fdc N "));
// Serial.println(memo_Fdc_N);
// Serial.print(F("fdc E "));
// Serial.println(memo_Fdc_E);
// Serial.print(F("fdc O "));
// Serial.println(memo_Fdc_O);
// Serial.print(F(" fdc S "));
// Serial.println(memo_Fdc_S);
// Serial.print(F(" delta_EO "));
// Serial.println(deltaEO);
// Serial.print(F(" delta_HB "));
// Serial.println(deltaHB);
// Serial.print(F(" H "));
// Serial.println(ValLdrHaut);
// Serial.print(F(" B "));
// Serial.println(ValLdrBas);
// Serial.print(F(" E "));
// Serial.println(ValLdrEst);
// Serial.print(F(" O "));
// Serial.println(ValLdrOuest);
//Serial.println(reveil);
//Serial.print(F(" tempsecoule "));
// Serial.println(tempsecoule);
// Serial.println(Minuteriedepart);
// Serial.println(Raz_Minuteriedepart);
// Serial.println(freeMemory());
// µµµµµµµµµµµµµµµµµµµµµµµµµµ etat des lieux µµµµµµµµµµµµµµµ
// Serial.print(F(" luminosite_actuelle "));
// Serial.print(luminosite_actuelle);
// Serial.print(F(" "));
//uuuuuuuuu securité courroie ou blocage uuuuuuuuuuuuuuuuuuuuuuu(if luminosite_actuelle < nuit) { //pour le retour
if (luminosite_actuelle < nuit) { //pour le retour
while (tempsecoule > 90000 && (memo_Fdc_E)) {
digitalWrite(Moteur_H, LOW);
display.clearDisplay();
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 30); // Start at top-left corner
display.print("ERREUR MOTEUR "); // le moteur horizontal tourne dans le vide
display.display();
//Serial.print(F(" ERREUR MOTEUR H "));
if ((memo_Fdc_N == HIGH) || (memo_Fdc_E == HIGH)) {
digitalWrite(BAS, LOW); // BAS
delay(50);
analogWrite(HAUT, 200); // HAUT Moteur H tourne vers le HAUT
digitalWrite(Moteur_V, HIGH);
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a 1 seconds
if (tempsecoule > 800000) {
asm volatile("jmp 0x00");
}
}
}
}
if (luminosite_actuelle > nuit) {
if (tempsecoule > 60000 && (deltaEO > hysteresis_H)) {
digitalWrite(EST, LOW);
for (int variat = 100; variat <= 255; variat++) {
delay(50);
digitalWrite(Moteur_H, HIGH);
analogWrite(OUEST, variat);
// tentative de déblocage
//Serial.print(F(" deblocage MOTEUR H "));
// Serial.print(variat);
}
}
if (tempsecoule > 90000 && (deltaEO > hysteresis_H) && ((memo_Fdc_E) || (memo_Fdc_O))) {
digitalWrite(Moteur_H, LOW);
digitalWrite(OUEST, LOW);
digitalWrite(EST, LOW);
display.clearDisplay();
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 30); // Start at top-left corner
display.print("ERREUR MOTEUR "); // le moteur horizontal tourne dans le vide
display.display();
// Serial.print(F(" ERREUR MOTEUR H "));
if ((memo_Fdc_N == HIGH) || (memo_Fdc_E == HIGH)) {
digitalWrite(BAS, LOW); // BAS
delay(50);
analogWrite(HAUT, 200); // HAUT Moteur H tourne vers le HAUT
digitalWrite(Moteur_V, HIGH);
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(3000); // wait for 3 second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(3000); // wait for 3 seconds
if (tempsecoule > 800000) {
digitalWrite(BAS, LOW); // BAS
delay(50);
digitalWrite(HAUT, LOW); // HAUT Moteur H stop
digitalWrite(Moteur_V, LOW);
digitalWrite(Moteur_H, LOW);
digitalWrite(OUEST, LOW);
digitalWrite(EST, LOW);
}
}
}
}
// µµµµµµµµµµµµµµµµµµµµµ Arret sur fin de course µµµµµµµµµµµµµµµ
if (memo_Fdc_E == LOW) {
digitalWrite(Moteur_H, LOW); // EST Moteur H arret
digitalWrite(OUEST, LOW);
digitalWrite(EST, LOW); // A voir mit en repos pour cause de bug
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 30); // Start at top-left corner
display.print("STOP FDC EST "); // EST le moteur vertical est en fdc Est
display.display();
Raz_Minuteriedepart = Minuteriedepart;
tempsecoule = Minuteriedepart - Raz_Minuteriedepart;
// Serial.println(F(" STOP FDC EST"));
}
if (memo_Fdc_O == LOW) {
digitalWrite(Moteur_H, LOW); // EST Moteur H ARRET
digitalWrite(OUEST, LOW);
digitalWrite(EST, LOW); //A voir mit en repos pour cause de bug
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 30); // Start at top-left corner
display.print("STOP Fc OUEST"); // EST le moteur vertical est en fdc ouest
display.display();
Raz_Minuteriedepart = Minuteriedepart;
tempsecoule = Minuteriedepart - Raz_Minuteriedepart;
}
if (memo_Fdc_N == LOW) {
digitalWrite(BAS, LOW);
analogWrite(HAUT, 0);
digitalWrite(Moteur_V, LOW); // EST Moteur V arret
// analogWrite(Moteur_V, LOW);//A voir mit en repos pour cause de bug
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 40); // Start at top-left corner
display.print(F("STOP Fdc HAUT")); // EST le moteur vertical est en fdc haut
display.display();
// Serial.println(F(" STOP FDC HAUT"));
}
if (memo_Fdc_S == LOW) {
digitalWrite(HAUT, LOW);
digitalWrite(BAS, LOW); // EST Moteur V ARRET
digitalWrite(Moteur_V, LOW); // A voir mit en repos pour cause de bug
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 40); // Start at top-left corner
display.print(F("STOP Fdc BAS ")); // EST le moteur vertical est en fdc BAS
display.display();
// Serial.println(F(" STOP FDC BAS"));
}
//"""""""""""""""""" ajustement automatique de l hysteresis par temps couvert """""""""""""
if (luminosite_actuelle >= 860) {
hysteresis_H = 15; //plus petit n ameliore pas la production donc autant ne pas bouger
hysteresis_V = 10;
Raz_Minuteriedepart = Minuteriedepart;
tempsecoule = Minuteriedepart - Raz_Minuteriedepart;
}
if (luminosite_actuelle <= lumi && luminosite_actuelle >= nuit) {
variahysteresis = lumi - luminosite_actuelle;
if (variahysteresis >= 15 && variahysteresis <= 250) { //plage entre nuit et jour
hysteresis_H = variahysteresis;
hysteresis_V = variahysteresis;
// Serial.println( hysteresis_H);
// Serial.println( variahysteresis);
}
}
//uuuuuuuuuuuuuuu En position horizontale ou et verticale uuuuuuuuuuuuuuuuuuuuuuuuuu
if ((luminosite_actuelle >= nuit) && (deltaEO <= hysteresis_H)) // modifié
{
digitalWrite(EST, LOW); // EST
digitalWrite(OUEST, LOW); // OUEST
digitalWrite(Moteur_H, LOW);
// Serial.println(F(" position Horizontale"));
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 30); // Start at 40/40
display.print(F("HORIZONTAL OK "));
display.display();
Raz_Minuteriedepart = Minuteriedepart;
tempsecoule = Minuteriedepart - Raz_Minuteriedepart;
}
if ((luminosite_actuelle >= nuit) && (deltaHB <= hysteresis_V) && (vitesseVentkmh < 5)) // modifié
{
digitalWrite(HAUT, LOW);
delay(50);
analogWrite(BAS, 0); // Moteur V arret
digitalWrite(Moteur_V, LOW); // Moteurs V en position arret
// Serial.println(F(" position verticale"));
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 40); // Start at position
display.print(F("VERTICAL OK "));
display.display();
}
// arret moteur idem que position ok mais pour les deux par temps couvert
if ((luminosite_actuelle <= lumi) && (jour=1) || (deltaEO <= hysteresis_H && deltaHB <= hysteresis_V) && (jour=1) && (vitesseVentkmh < 10)) // modifié
{
digitalWrite(HAUT, LOW);
digitalWrite(BAS, LOW); // EST Moteur V ARRET
digitalWrite(Moteur_V, LOW); // Moteurs V en position arret
digitalWrite(OUEST, LOW);
digitalWrite(EST, LOW);
digitalWrite(Moteur_H, LOW); // Moteurs H en position arret
Raz_Minuteriedepart = Minuteriedepart;
tempsecoule = Minuteriedepart - Raz_Minuteriedepart;
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 20); // Start at position
display.print(F("TEMPS COUVERT "));
display.setCursor(40, 30); // Start at 40/40
display.print(F("HORIZONT STOP"));
display.setCursor(40, 40); // Start at position
display.print(F("VERTICAL STOP "));
display.display();
delay(2000);
Raz_Minuteriedepart = Minuteriedepart;
tempsecoule = Minuteriedepart - Raz_Minuteriedepart;
}
//µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ mise hors ombre a l ouest µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ
if ((memo_Fdc_N == HIGH) && (memo_Fdc_O == LOW) && (luminosite_actuelle >= lumi)) {
digitalWrite(BAS, LOW); // Moteur V ARRET // BAS
delay(50);
analogWrite(HAUT, 200); // HAUT Moteur H tourne vers le HAUT
digitalWrite(Moteur_V, HIGH);
Cp_N = 30;
Cp_S = -30;
}
// µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ orientation des panneaux µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ
//si pas de nuages et + de soleil à l'ouest et ecart tolerable est dépassé et pas en butée ouest
if (luminosite_actuelle >= lumi) {
if (ValLdrEst < ValLdrOuest && deltaEO > hysteresis_H && (memo_Fdc_O == HIGH)) {
// Minuteriedepart = 0;
Minuteriedepart = millis(); // ecriture de la valeur de la minuterie1 en milliseconde
if (Minuteriedepart - Raz_Minuteriedepart > 25000) { // tempsecoule =(millis() - Minuteriedepart); // lecture temps
tempsecoule = Minuteriedepart - Raz_Minuteriedepart;
}
for (int variat = 100; variat <= 210; variat++) {
digitalWrite(EST, LOW); // EST arret
delay(50);
analogWrite(OUEST, variat); // OUEST Moteur V tourne vers l'OUEST
digitalWrite(Moteur_H, HIGH);
}
// Serial.println(F(" Est < marche Ouest"));
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 20); // Start at
display.print(F("MODE MARCHE "));
display.setCursor(40, 30); // Start at
display.print(F("MARCHE OUEST "));
display.display();
}
//si pas de nuages et + de soleil à l'est et ecart tolerable est dépassé et pas en butée est
else if (ValLdrEst > ValLdrOuest && deltaEO > hysteresis_H && (memo_Fdc_E == HIGH)) {
// Minuteriedepart = 0;
Minuteriedepart = millis(); // ecriture de la valeur de la minuterie1 en milliseconde
if (Minuteriedepart - Raz_Minuteriedepart > 25000) { // tempsecoule =(millis() - Minuteriedepart); // lecture temps
tempsecoule = Minuteriedepart - Raz_Minuteriedepart;
}
digitalWrite(OUEST, LOW);
delay(50);
for (int variat = 100; variat <= 210; variat++) {
analogWrite(EST, variat); // EST Moteur V tourne vers l'EST
digitalWrite(Moteur_H, HIGH);
}
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 30); // Start position
display.print(F("MARCHE EST "));
display.display();
// Serial.println(F("marche Est > Ouest "));
}
// SENS vertical
//si pas de nuages et + de soleil en haut et ecart tolerable est dépassé et pas en butée haute
if (ValLdrHaut > ValLdrBas && deltaHB > hysteresis_V && (memo_Fdc_N == HIGH)) {
digitalWrite(BAS, LOW);
delay(50);
analogWrite(HAUT, 200); // HAUT Moteur H tourne vers le HAUT
digitalWrite(Moteur_V, HIGH);
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 40); // Start position
display.print(F("MARCHE MONTE "));
display.display();
// Serial.println(F(" monte Hauteur < Bas"));
}
//si pas de nuages et + de soleil en bas et ecart tolérable est dépassé et pas en butée basse
else if (ValLdrBas > ValLdrHaut && deltaHB > hysteresis_V && (memo_Fdc_S == HIGH) && (vitesseVentkmh < 10)) {
digitalWrite(HAUT, LOW);
delay(50);
analogWrite(BAS, 200); // BAS Moteur H tourne vers le BAS
digitalWrite(Moteur_V, HIGH);
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 40); // Start at top-left corner
display.print(F("MARCHE DESCENT"));
display.display();
// Serial.println(F(" Hauteur >marche Bas "));
}
}
// µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ trop de vent mise à l'horizontal des panneaux µµµµµµµµµµµµµ
//
if ((vitesseVentkmh > 10) && (memo_Fdc_N == HIGH)) {
delta_H_B = 50;
digitalWrite(BAS, LOW);
delay(50);
analogWrite(HAUT, 220); // HAUT Moteur H tourne vers le HAUT
digitalWrite(Moteur_V, HIGH);
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 20); // Start at top-left corner
display.print(F("MISE HORS VENT"));
display.setCursor(40, 40); // Start at top-left corner
display.print(F("VENT MONTE"));
display.display();
// Serial.println(F(" monte vent"));
delay(18000);
}
// µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ il fait nuit µµµµµµµµµµµµµ
if (luminosite_actuelle < nuit) //si Est < nuit, il fait nuit, retour à l'est
{
if (memo_Fdc_E == HIGH) {
Minuteriedepart = millis(); // ecriture de la valeur de la minuterie1 en milliseconde
if (Minuteriedepart - Raz_Minuteriedepart > 25000) { // lecture temps
tempsecoule = Minuteriedepart - Raz_Minuteriedepart;
}
if (tempsecoule >= 45000) {
digitalWrite(OUEST, LOW);
delay(50);
for (int variat = 255; variat >= 200; variat--) {
analogWrite(EST, variat); // deceleration
Serial.print(F(" deceleration "));
}
}
digitalWrite(OUEST, LOW);
delay(50);
analogWrite(EST, variat); // EST Moteur H tourne vers l'EST
digitalWrite(Moteur_H, HIGH);
digitalWrite(BAS, LOW);
delay(50);
analogWrite(HAUT, 200); // HAUT Moteur H tourne vers le HAUT
digitalWrite(Moteur_V, HIGH);
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK);
display.setCursor(40, 20); // Start at top-left corner
display.print(F("MODE RETOUR ")); // EST le moteur vertical va en fdc Est
display.setCursor(40, 30); // Start at top-left corner
display.print(F("MARCHE EST "));
display.setCursor(40, 40); // Start at top-left corner
display.print(F("MARCHE MONTE "));
display.display();
Cp_N = -20;
Cp_S = -20;
// Serial.println(F(" if marche retour est"));
} else {
digitalWrite(OUEST, LOW);
digitalWrite(EST, LOW);
analogWrite(OUEST, 0); // le moteur horizontal est en fdc Est
digitalWrite(Moteur_H, LOW);
jour = 0;
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK);
display.setCursor(40, 30); // Start at top-left corner
display.print("FDC RETOUR EST");
display.display();
Raz_Minuteriedepart = Minuteriedepart;
tempsecoule = Minuteriedepart - Raz_Minuteriedepart;
// µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ il fait jour µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ
if ((luminosite_actuelle > 400) && (vitesseVentkmh < 10) && (jour = 0)) // si H > nuit; il ne fait pas nuit et pas de vent
{
//memo_Fdc_S = digitalRead(Fdc_S);
// il fait jour au reveil ou à la mise sous tension.
if ((memo_Fdc_S == HIGH) && (luminosite_actuelle > 450) && (jour = 0)) { // on passe dans ce if puis le while
while ((memo_Fdc_S == HIGH) || (ValLdrBas > 950)) // si le moteur n'est pas sur le fdcbas ou en position
{
digitalWrite(HAUT, LOW);
delay(50);
analogWrite(BAS, 200); // BAS Moteur H tourne vers le BAS
digitalWrite(Moteur_V, HIGH);
jour = 1;
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); // Draw white text
display.setCursor(40, 40); // Start position
display.print(F("MARCHE DESCENT"));
display.display(); // BAS moteur bas en marche
memo_Fdc_S = digitalRead(Fdc_S); // lecture du fdcbas
int deltaHB = ValLdrHaut - ValLdrBas; // ctrl delta entre Haut et Bas
}
}
} else {
if (luminosite_actuelle < nuit) // Si H < nuit, il fait nuit, retour en haut
{
if (memo_Fdc_N == HIGH) {
digitalWrite(BAS, LOW);
delay(50);
analogWrite(HAUT, 200);
// Serial.println(F(" retour haut"));
display.setTextSize(1); // Taille des caractères (1:1, puis 2:1, puis 3:1)
display.setTextColor(SSD1306_WHITE, SSD1306_BLACK);
display.setCursor(40, 40); // Start at position
display.print(F("MARCHE MONTE "));
// Serial.println(F(" monte retour est"));
display.display();
} else {
digitalWrite(HAUT, LOW);
digitalWrite(BAS, LOW); // Moteur V stop
digitalWrite(Moteur_V, LOW);
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(2000); // wait for a 2second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(10000); // wait for a 10seconds
}
}
}
}
}
delay(250);
}