first commit
This commit is contained in:
332
SOLAIRE_AZIMUTH_LM293/SOLAIRE_AZIMUTH_LM293.ino
Normal file
332
SOLAIRE_AZIMUTH_LM293/SOLAIRE_AZIMUTH_LM293.ino
Normal file
@@ -0,0 +1,332 @@
|
||||
#include <Ephem_Soleil.h>
|
||||
|
||||
double ha;
|
||||
double az;
|
||||
String lS, mS, cS;
|
||||
int amplitudeHoraire = 5;
|
||||
int minH = 0;
|
||||
int maxH = 0;
|
||||
int minM = 0;
|
||||
int maxM = 0;
|
||||
int minAz = 0;
|
||||
int maxAz = 0;
|
||||
|
||||
// PINS
|
||||
#define RTC_CLOCK 6
|
||||
#define RTC_DATA 7
|
||||
#define RTC_RESET 8
|
||||
|
||||
#define PWMA 3 //Right side
|
||||
#define PWMB 4 //Left side
|
||||
#define DA 2 //Right reverse
|
||||
#define DB 0 //Left reverse
|
||||
|
||||
// Load the virtuabotixRTC library
|
||||
#include "virtuabotixRTC.h"
|
||||
// Determine the pins connected to the module
|
||||
// myRTC (clock, data, RST)
|
||||
virtuabotixRTC myRTC (RTC_CLOCK, RTC_DATA, RTC_RESET);
|
||||
|
||||
int theorique_position = -1;
|
||||
|
||||
String date = "";
|
||||
String heure = "";
|
||||
|
||||
const int LONGUEUR_UTILE = 40;
|
||||
const int LATITUDE = 47.726682;
|
||||
const int LONGITUDE = -2.131774;
|
||||
const int ANGLE_MINI = 5;
|
||||
const int ANGLE_ROTATION = 90;
|
||||
|
||||
|
||||
|
||||
void setup() {
|
||||
// initialize digital pin LED_BUILTIN as an output.
|
||||
Serial.begin(9600);
|
||||
pinMode(PWMA, OUTPUT);
|
||||
pinMode(PWMB, OUTPUT);
|
||||
pinMode(DA, OUTPUT);
|
||||
pinMode(DB, OUTPUT);
|
||||
|
||||
stop();
|
||||
// After to set the entire information, comment the following line
|
||||
// (seconds, minutes, hours, day of week, day of month, month, year)
|
||||
myRTC.setDS1302Time (0, 17, 22, 5, 19, 7, 2024);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Reads the information from the CI
|
||||
myRTC.updateTime();
|
||||
printTime();
|
||||
|
||||
// Serial.println("NEW-YORK, Manhattan ; position du soleil le 12/02/2017 a 09:32:18");
|
||||
// posSoleil("28/05/2021 14:00:18", -5, 40.76, -73.984, &ha, &az); // Manhattan le 12/02/2017
|
||||
// Serial.println(" hauteur : " + String(ha, 7) + " azimut : " + String(az, 7));
|
||||
// Serial.println();
|
||||
//Serial.println("Glenac ; position du soleil");
|
||||
//posSoleil("28/05/2021 14:00:00", 0, LATITUDE, LONGITUDE, &ha, &az); // Tour Eiffel le 12/02/2017
|
||||
//Serial.println(" hauteur : " + String(ha, 7) + " azimut : " + String(az, 7));
|
||||
|
||||
|
||||
// il faut que l'Azimut soit supérieur à 0
|
||||
|
||||
posSoleil(
|
||||
myRTC.year, myRTC.month, myRTC.dayofmonth,
|
||||
myRTC.hours, myRTC.minutes, myRTC.seconds,
|
||||
/*décalage GMT*/ 2, LATITUDE, LONGITUDE,
|
||||
&ha, &az); // Même calcul que ci-dessus mais avec date et heure sous form d'entiers
|
||||
Serial.println(" hauteur : " + String(ha, 7) + " azimut : " + String(az, 7));
|
||||
//Serial.println("Glenac; lever, zenith et coucher : 19 m");
|
||||
|
||||
//lmvSoleil("28/05/2021", 2, 0, LATITUDE, LONGITUDE, &lS, &mS, &cS, 19);
|
||||
lmvSoleil(
|
||||
myRTC.year, myRTC.month, myRTC.dayofmonth,
|
||||
/*décalage GMT*/ 2, 0,
|
||||
LATITUDE, LONGITUDE,
|
||||
&lS, &mS, &cS, 19);
|
||||
|
||||
int hlS = lS.substring(0, 2).toInt();
|
||||
int mnlS = lS.substring(3, 5).toInt();
|
||||
|
||||
int hcS = cS.substring(0, 2).toInt();
|
||||
int mncS = cS.substring(3, 5).toInt();
|
||||
|
||||
if (theorique_position == -1) {
|
||||
|
||||
int min_angle = 180 - ANGLE_ROTATION / 2;
|
||||
int max_angle = 180 + ANGLE_ROTATION / 2;
|
||||
for (int h = hlS; h <= hcS; h++) {
|
||||
for (int m = 0; m <= 50; m+=10) {
|
||||
// double ha2;
|
||||
// double az2;
|
||||
posSoleil(
|
||||
/*2021, 12, 21, */ myRTC.year, myRTC.month, myRTC.dayofmonth,
|
||||
h, m, 0,
|
||||
/*décalage GMT*/ 2, LATITUDE, LONGITUDE,
|
||||
&ha, &az); // Même calcul que ci-dessus mais avec date et heure sous form d'entiers
|
||||
|
||||
Serial.println(String(h) + ":" + String(m) + " ==> hauteur : " + String(ha, 2) + " azimut : " + String(az, 2));
|
||||
// if (ha2 > ANGLE_MINI && minH == 0) {
|
||||
// minH = h;
|
||||
// minM = m;
|
||||
// minAz = az2;
|
||||
// }
|
||||
// if (ha2 > ANGLE_MINI) {
|
||||
// maxH = h;
|
||||
// maxM = m;
|
||||
// maxAz = az2;
|
||||
// }
|
||||
if (az > min_angle && minH == 0) {
|
||||
minH = h;
|
||||
minM = m;
|
||||
minAz = az;
|
||||
}
|
||||
if (az < max_angle) {
|
||||
maxH = h;
|
||||
maxM = m;
|
||||
maxAz = az;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
amplitudeHoraire = (maxH * 60 + maxM) - (minH * 60 + minM);
|
||||
|
||||
Serial.println("amplitudeHoraire : "
|
||||
+ String(minH) + ":" + String(minM) + " "
|
||||
+ String(maxH) + ":" + String(maxM) + " "
|
||||
+ String(minAz) + " "
|
||||
+ String(maxAz) + " amplitude=" + amplitudeHoraire);
|
||||
|
||||
for (int h = hlS; h <= hcS; h++) {
|
||||
for (int m = 0; m <= 50; m+=10) {
|
||||
|
||||
posSoleil(
|
||||
myRTC.year, myRTC.month, myRTC.dayofmonth,
|
||||
h, m, 0,
|
||||
/*décalage GMT*/ 2, LATITUDE, LONGITUDE,
|
||||
&ha, &az); // Même calcul que ci-dessus mais avec date et heure sous form d'entiers
|
||||
|
||||
calculatePosition(h,m);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Serial.println(" lever : " + lS + " zenith : " + mS + " coucher : " + cS);
|
||||
// Serial.println("Glenac ; lever, zenith et coucher en haut de la Tour Eiffel : 350 m");
|
||||
// lmvSoleil("12/02/2017", 0, 0, LATITUDE, LONGITUDE, &lS, &mS, &cS, 350);
|
||||
// Serial.println(" lever : " + lS + " zenith : " + mS + " coucher : " + cS);
|
||||
|
||||
|
||||
if (theorique_position == -1) {
|
||||
retourEnZero();
|
||||
|
||||
}
|
||||
|
||||
Serial.println("Calcul position pour heure " + heure);
|
||||
int h = heure.substring(0, 2).toInt();
|
||||
int mn = heure.substring(3, 5).toInt();
|
||||
int positionTogo = calculatePosition(h,mn);
|
||||
|
||||
gotoPosition(positionTogo);
|
||||
|
||||
|
||||
delay(10000);
|
||||
}
|
||||
|
||||
|
||||
void printTime()
|
||||
{
|
||||
// Print the details in serial monitor
|
||||
Serial.print
|
||||
("Data "); // Call the routine that prints the day of the week
|
||||
jourSemaine (myRTC.dayofweek);
|
||||
Serial.print (", ");
|
||||
|
||||
date = (myRTC.dayofmonth < 10 ? "0" : "") + String(myRTC.dayofmonth) + "/"
|
||||
+ (myRTC.month < 10 ? "0" : "") + String(myRTC.month)
|
||||
+ "/" + String(myRTC.year);
|
||||
|
||||
Serial.print (date);
|
||||
|
||||
heure = (myRTC.hours < 10 ? "0" : "") + String(myRTC.hours) + ":"
|
||||
+ (myRTC.minutes < 10 ? "0" : "") + String(myRTC.minutes) + ":"
|
||||
+ (myRTC.seconds < 10 ? "0" : "") + String(myRTC.seconds);
|
||||
|
||||
Serial.println(" Time " + heure); // Adds a 0 if the time value is <10
|
||||
|
||||
}
|
||||
void stop()
|
||||
{
|
||||
Serial.println("stop");
|
||||
digitalWrite(PWMA, LOW);
|
||||
digitalWrite(PWMB, LOW);
|
||||
digitalWrite(DA, LOW);
|
||||
digitalWrite(DB, LOW);
|
||||
|
||||
delay(200);
|
||||
|
||||
Serial.println("stop fin");
|
||||
}
|
||||
|
||||
void avance() {
|
||||
Serial.println("avance");
|
||||
|
||||
digitalWrite(PWMA, HIGH);
|
||||
digitalWrite(DA, HIGH);
|
||||
delay(200);
|
||||
Serial.println("avance fin");
|
||||
|
||||
}
|
||||
|
||||
void recule() {
|
||||
Serial.println("recule");
|
||||
|
||||
digitalWrite(PWMA, HIGH);
|
||||
digitalWrite(DA, LOW);
|
||||
delay(200);
|
||||
Serial.println("recule fin");
|
||||
}
|
||||
|
||||
void retourEnZero() {
|
||||
Serial.println("retour en zero");
|
||||
stop();
|
||||
recule();
|
||||
for (int i = 0; i < LONGUEUR_UTILE + 5; i++) {
|
||||
delay(1000); //LONGUEUR_UTILE * 1200);
|
||||
Serial.print(".");
|
||||
}
|
||||
stop();
|
||||
Serial.println("Fin retour en zero");
|
||||
|
||||
}
|
||||
|
||||
void gotoPosition(int positionTogo) {
|
||||
Serial.println("gotoPosition " + String(positionTogo));
|
||||
|
||||
if (theorique_position != positionTogo) {
|
||||
|
||||
if (positionTogo > theorique_position) {
|
||||
avance();
|
||||
Serial.println("delay " + String(positionTogo - theorique_position));
|
||||
for (int i = 0; i < (positionTogo - theorique_position); i++) {
|
||||
delay(1000);
|
||||
Serial.print(".");
|
||||
}
|
||||
//delay((positionTogo - theorique_position) * 1000);
|
||||
}
|
||||
else {
|
||||
recule();
|
||||
Serial.println("delay " + String(theorique_position - positionTogo));
|
||||
for (int i = 0; i < (theorique_position - positionTogo); i++) {
|
||||
delay(1000);
|
||||
Serial.print(".");
|
||||
}
|
||||
// delay((theorique_position - positionTogo) * 1000);
|
||||
}
|
||||
Serial.println("avant stop");
|
||||
stop();
|
||||
Serial.println("apres stop");
|
||||
}
|
||||
|
||||
theorique_position = positionTogo;
|
||||
if (theorique_position < -1) {
|
||||
theorique_position = -1;
|
||||
}
|
||||
Serial.println("gotoPosition fin");
|
||||
|
||||
}
|
||||
|
||||
int calculatePosition(int h, int mn)
|
||||
{
|
||||
|
||||
int position = 0;
|
||||
if ( ha > ANGLE_MINI) {
|
||||
if (az <= minAz) {
|
||||
position = 0;
|
||||
}
|
||||
if (az > minAz && az <= maxAz) {
|
||||
int hS = minH; //lS.substring(0, 2).toInt();
|
||||
int mnS = lS.substring(3, 5).toInt();
|
||||
int minutes = h * 60 + mn - minH * 60 - minM;
|
||||
position = min(LONGUEUR_UTILE, (LONGUEUR_UTILE * minutes / amplitudeHoraire));
|
||||
}
|
||||
if (az > maxAz) {
|
||||
position = LONGUEUR_UTILE;
|
||||
}
|
||||
} else {
|
||||
position = LONGUEUR_UTILE / 2;
|
||||
}
|
||||
Serial.println("Calcul position " + String(h) + " " + String(mn) + " " + String(position));
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
void jourSemaine (int day)
|
||||
{
|
||||
switch (day)
|
||||
{
|
||||
case 1:
|
||||
Serial.print("Lundi");
|
||||
break;
|
||||
case 2:
|
||||
Serial.print("Mardi");
|
||||
break;
|
||||
case 3:
|
||||
Serial.print("Mercredi");
|
||||
break;
|
||||
case 4:
|
||||
Serial.print("Jeudi");
|
||||
break;
|
||||
case 5:
|
||||
Serial.print("Vendredi");
|
||||
break;
|
||||
case 6:
|
||||
Serial.print("Samedi");
|
||||
break;
|
||||
case 7:
|
||||
Serial.print("Dimanche");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user