first commit
This commit is contained in:
795
TraqueurV_5_5_8_ET2transfer/TraqueurV_5_5_8_ET2transfer.ino
Normal file
795
TraqueurV_5_5_8_ET2transfer/TraqueurV_5_5_8_ET2transfer.ino
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user