Accueil > Forum > Electronique > Arduino > course du soleil

course du soleil

1 2 3
MichelHohm MichelHohm 21 Messages
bonjour
j'ai réussi à faire drawLine en fonction de l'angle et je fais la simulation du soleil bitmap avec drawBitmap
mais la j'ai un soucis il fonctionne de tant en temp
mon code n'es surement pas bon , pourriez vous m'aider s'il vous plait
j'ai fait un switch case pour simuler la course du soleil
d'avance merci .
https://github.com/
MichelHohm MichelHohm 21 Messages
bonjour
j'ai réussi à faire drawLine en fonction de l'angle et je fais la simulation du soleil bitmap avec drawBitmap
mais la j'ai un soucis il fonctionne de tant en temp
mon code n'es surement pas bon , pourriez vous m'aider s'il vous plait
j'ai fait un switch case pour simuler la course du soleil
d'avance merci .
void draw2(void){//écran secondaire          DateTime now = RTC.now();          u8g.firstPage();      do {          u8g.setFont(u8g_font_6x10);          u8g.setPrintPos(2,10);          u8g.print("SunAngle");          u8g.setPrintPos(55,62);          u8g.print(EEPROM.read(13));//angle          angle = (EEPROM.read(13));          u8g.drawLine(20, 50, 110, 50);          u8g.drawCircle(x0, y0, r, U8G_DRAW_UPPER_RIGHT);//x0=65,y0=50,r=35          u8g.drawCircle(x0, y0, r, U8G_DRAW_UPPER_LEFT);//          u8g.drawLine(x0,y0,x0-r*cos(1*angle*2*3.14/360),y0-r*sin(1*angle*2*3.14/360));          CalcSun ();          myLord.SunRise(sunTime); // Computes Sun Rise.          myLord.SunSet(sunTime);          TimeMins = (now.hour() * 60) + now.minute();          uint16_t time = now.hour() * 60 + now.minute();          uint16_t angle = map(time, Sunrise, Sunset, 0, 180);          if(angle < 0)          angle = 0;          else if(angle > 180)          angle = 180;          if(angle==0 ) {sun=1;}          if(angle==10) {sun=2;}          if(angle==20) {sun=3;}          if(angle==30) {sun=4;}          if(angle==40) {sun=5;}          if(angle==50) {sun=6;}          if(angle==60) {sun=7;}          if(angle==70) {sun=8;}          if(angle==80) {sun=9;}          if(angle==90) {sun=10;}          if(angle==100){sun=11;}          if(angle==110){sun=12;}          if(angle==120){sun=13;}          if(angle==130){sun=14;}          if(angle==140){sun=15;}          if(angle==150){sun=16;}          if(angle==160){sun=17;}          if(angle==170){sun=18;}          if(angle==180){sun=19;}          switch(sun){            case 1:            u8g.drawXBMP(23,41,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//0°            break;            case 2:            u8g.drawXBMP(23,35,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//10°            break;            case 3:            u8g.drawXBMP(25,30,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//20°            break;            case 4:            u8g.drawXBMP(28,25,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//30°            break;            case 5:            u8g.drawXBMP(30,20,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//40°            break;            case 6:            u8g.drawXBMP(35,15,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//50°            break;            case 7:            u8g.drawXBMP(40,10,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//60°            break;            case 8:            u8g.drawXBMP(46,9,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//70°            break;            case 9:            u8g.drawXBMP(51,8,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//80°            break;            case 10:            u8g.drawXBMP(57,7,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//90°            break;            case 11:            u8g.drawXBMP(64,7,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//100°            break;            case 12:            u8g.drawXBMP(69,8,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//110°            break;            case 13:            u8g.drawXBMP(74,10,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//120°            break;            case 14:            u8g.drawXBMP(80,15,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//130°            break;            case 15:            u8g.drawXBMP(85,18,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//140°            break;            case 16:            u8g.drawXBMP(88,24,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//150°            break;            case 17:            u8g.drawXBMP(90,29,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//160°            break;            case 18:            u8g.drawXBMP(92,35,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//170°            break;            case 19:            u8g.drawXBMP(93,41,u8g_logo_width, u8g_logo_height, u8g_sun_3_bits);//180°            break;          u8g.setFont(u8g_font_6x10);          u8g.setPrintPos(5,62);          if(EEPROM.read(9)<10);          u8g.print("0");          u8g.print(EEPROM.read(9));          u8g.print (":");          if (EEPROM.read(10) <10)          u8g.print("0");          u8g.print (EEPROM.read(10));          u8g.setPrintPos(95,62);          if(EEPROM.read(11)<10)          u8g.print("0");          u8g.print (EEPROM.read(11));          u8g.print (":");          if (EEPROM.read(12) <10)          u8g.print("0");          u8g.print (EEPROM.read(12));          }          while (          u8g.nextPage() );          }
https://github.com/
MichelHohm MichelHohm 21 Messages
bonjour au big boss
a partir de la deuxième page tout est en italique tu pourrais s'il te plait me dire pourquoi c'est pour cela que j'ai rouvert un deuxième course du soleil
merci de ton aide
https://github.com/
lobodol lobodol 683 Messages BIG BOSS
Salut, si tu rafraichi la page y'a plus de problème 🙂
Mais il faudrait quand même que je prenne le temps corriger ça proprement ...
MichelHohm MichelHohm 21 Messages
Bonsoir
voila j'ai un soucis avec ma course du soleil
quand je trace drawLine tout ce passe bien
quand je remplace drawLine par bitmap j'ai un décalage par rapport a drawline pour le même angle .
quelqu'un pourrais m' expliquer mon erreur .
je pense que cela viens du bitmap (#define u8g_logo_width 16
#define u8g_logo_height 16 ) décalage de la moitié du soleil .
peut-être que le bitmap  n'ai pas centrer , je ne sais pas si on peux le centrer . 
d'avance merci.
angle =0, dessin sous la droite ,
angle =45 dessin ok idem à le drawLine
angle = 10 dessin équivalent à 0 angle sur la droite 0
angle = 145 différence un peu plus que le dessin toujours par rapport a drawLine
angle = 180 idem dessin sous 180°

u8g.drawLine(20, 50, 110, 50);//droite du bas de l'écran
u8g.drawCircle(x1, y1, r_1, U8G_DRAW_UPPER_RIGHT);//x1=65, y1=50, r_1=35
u8g.drawCircle(x1, y1, r_1, U8G_DRAW_UPPER_LEFT);//cercle 
    
u8g.drawLine(x0,y0,x0-r*cos(1*angle*2*3.14/360),y0-r*sin(1*angle*2*3.14/360)); // x0=65,y0=50,r=35,droite qui visualise l'angle du soleil
     
 u8g.drawXBMP(x1-r_1*cos(1*angle*2*3.14/360),y1-r_1*sin(1*angle*2*3.14/360),u8g_logo_width,
 u8g_logo_height, u8g_sun_3_bits);//dessin du soleil
https://github.com/
MichelHohm MichelHohm 21 Messages
Bonjour,
j'aimerai faire avancer un moteur stepper d'un nombre de pas défini .
entre une position qui change tout les jours et qui est position_cible .
alfa_1 =360*now.day()/max_day() ; et je reprend cette valeur que je converti en pas par int position_cible  = map(alfa_1,0,360,0,64);
je compare la position cible à la position moteur anterieur et je fais avancer du nombre de pas qui manque .
mais cela ne fonctionne pas .
mon moteur  et un stepper-28byj48 avec un Driver ULN2003
je vous met mon code :
si quelqu'un pourrais m'aider d'avance merci .

void turntable(void) { // c'est une petite animation qui reprend le turntable avec la positon du moteur en angle 
  DateTime now = RTC.now();
  
    /* center */ 
 int x2=128/2;  
 int y2=64/2;  
 /* radius */ 
 int r2=22;
 /* angle*/
 
  max_day() ;
  alfa_1 =360*now.day()/max_day();
 u8g.setFont(u8g_font_6x10);
 
 u8g.setPrintPos(1,50);
 u8g.print(alfa_1); 
 u8g.setPrintPos(30,60);
 u8g.print(EEPROM.read(21));//pos_moteur
 u8g.setPrintPos(90,60);
 u8g.print(EEPROM.read(20));//position_cible 
 u8g.setPrintPos(110,60);
 u8g.print(EEPROM.read(22));//cptepas 
  /* affichage maxday */
 u8g.setFont(u8g_font_6x10);
 u8g.setPrintPos(110,30 );
 u8g.print(max_day());
 u8g.setPrintPos(62,9);
 u8g.print("0");
 u8g.setPrintPos(90,32);
 u8g.print("90");
 u8g.setPrintPos(56,64);
 u8g.print("180");
 u8g.setPrintPos(22,32);
 u8g.print("270");
 u8g.drawLine(x2,y2, x2+r2*sin(1*alfa_1*2*3.14/360), y2-r2*cos(1*alfa_1*2*3.14/360));  
 u8g.drawCircle(x2, y2, r2);
  
 }
void moteur_pas(){
    int position_cible  = map(alfa_1,0,360,0,64);
    EEPROM.update(20,position_cible);
    int position_moteur = EEPROM.read(21);
   if(position_moteur < position_cible ){
    monmoteur.step(+1); // Avance de 1 pas.
    cptepas++;
    position_moteur = position_moteur + cptepas ;
    EEPROM.update(22,cptepas);// Incrémente la variable cptepas pour compter les pas.
    Serial.print("nombre de pas:" );     // Affiche dans le moniteur "série"
    Serial.println(cptepas);// le nbre de pas effectué.
    delay(500);                      // Pause d'une demi seconde entre chaque pas.
  }
  if(position_moteur > position_cible){
    monmoteur.step(-1);//Recule de 1 pas.
    cptepas--;// décrémente la variable cptepas pour compter les pas.
    position_moteur = position_moteur - cptepas ;
    EEPROM.update(22,cptepas);// decrémente la variable cptepas pour compter les pas.
    Serial.print("nombre de pas:" );    // Affiche dans le moniteur "série"
    Serial.println(cptepas); // le nbre de pas effectué.                   
    delay(500);                  
   }
    EEPROM.update(21,position_moteur); 
}

https://github.com/
lobodol lobodol 683 Messages BIG BOSS
Salut, pourquoi est-ce que tu store "position_cible" et "cptepas" dans l'EEPROM ?

Pour moi, ton algo peut être résumé à ça :


int target = map(alfa_1, 0, 360, 0, 64);
int diff = motor_position - target;
my_motor.step(diff);
MichelHohm MichelHohm 21 Messages
juste pour les avoir en lecture sur void ecran
https://github.com/
MichelHohm MichelHohm 21 Messages
le resultat c'est que le moteur tourne mais ne s'arrête pas .
https://github.com/
MichelHohm MichelHohm 21 Messages
je voudrais faire un turntable ,

chaque jour le map calcul une nouvelle position que je calcul en pas mais je n'arrive à rien .
si quelqu'un à une idèe je suis preneur d'avance merci .
https://github.com/
MichelHohm MichelHohm 21 Messages
bonjour à tout les membres du forum ,
cela fait pas mal de temps que je ne suis pas venu .
Voila j'ai fait un arrosage pour plante .
j'utilise un soil_moisture capacitif afin d'éviter la corrosion  : https://wiki.dfrobot.com/Capacitive_Soil_Moisture_Sensor_SKU_SEN0193.
quand la terre est inférieur au réglage minimum la pompe arrose la terre par une quantité d'eau programmée par un flow water :https://www.seeedstudio.com/G1-8-Water-Flow-Sensor-p-1346.html.
quand la quantité d'eau est atteinte elle s'arrête , on attend un temps de 2 à 3 minutes le temps de rétention de l'eau dans la terre .
et si l'humidité de la terre est inférieur au réglage maximum , le cycle arrosage recommence .
je viens vous voir pour la sécurité de la pompe pour qu'elle ne tourne pas sans eau .
j'aimerai utiliser le water flow sensor pour détecter le manque d'eau .
j'ai fait un code (je  suis amateur et j'aimerai que vous me donner votre avis , je pense qu'il y a surement mieux, d'avance merci  )
[/code] 

void defaut_eau(){
    if((millis()-StartTime>=teenSecondes)&&(totalMilliLitres<=0)&&(pompe_state_flag ==1)){//détection pas d'eau 10s
          compteur ++;
          StartTime = millis();
 } 
       if(compteur==2){
        WaterPumpOff();
        Serial.println("defaut_eau"); 
        u8g.setFont(u8g_font_04b_03);
        u8g.setPrintPos(55,30);
        if (Sekund % 2 != 1)
        u8g.print("Vide");
        StartTime = millis();
      }
  }

j'ai mis une tempo/ If((millis()-StartTime>=teenSecondes)
ensuite 
(totalMilliLitres<=0)
c'est le water flow sensor qui ne tourne pas puisque pas d'eau malgré  que la pompe tourne .
(pompe_state_flag ==1)
contrôle que la pompe est en service ensuite j'ai mis un compteur , au bout de deux comptage la POMPE est coupée waterPumpOff();
et je fait clignoter ("vide") pour indiquer que le réservoir est vide .
merci d'avance .
https://github.com/
lobodol lobodol 683 Messages BIG BOSS
Salut Michel, voici un lien vers un très bon tuto sur l'utilisation de ton capteur water flow : https://www.seeedstudio.com/blog/2020/05/11/how-to-use-water-flow-sensor-with-arduino/

Sur ce principe tu peux alors décider que si le capteur mesure un débit trop faible (à définir) c'est qu'il n'y a plus assez d'eau. Mais je ne suis pas certain de l'efficacité de ce capteur pour cette application. Peut-être utiliser/bricoler un capteur de niveau d'eau dans le réservoir ?

Très intéressant comme projet en tout cas :)
MichelHohm MichelHohm 21 Messages
bonjour
j'essaye de faire une minuterie à rebours j'ai trouver un code qui incrémente de 0 à 60 .
j'ai  changer le code maintenant il décrémente mais de deux par deux ( 60 , 58, 56, etc.........si quelqu'un pouvait m'aider .
j'aimerai décrémenter de 60 à 0 ;
je poste le code .
merci d'avance .

#include <LiquidCrystal_I2C.h>
#include <Wire.h> 

LiquidCrystal_I2C lcd(0x03F, 20, 4);
signed short  secondes;
char timeline[16];

void setup() {

  lcd.begin();
 
}
void chrono(){
  lcd.setCursor(0,0);
  lcd.print("Chrono :");
  lcd.setCursor(0, 1);
  sprintf(timeline," %0.2d secs", secondes);
  lcd.print(timeline);
  secondes--;
  if (--secondes < 0)
  {
    secondes = 60;
  }
delay(1000);
}
void loop() {
  chrono();

}

https://github.com/
lobodol lobodol 683 Messages BIG BOSS
Salut, remplace ton if par ça :


if (secondes < 0)
MichelHohm MichelHohm 21 Messages
bonjour BIG BOSS ,
merci cela fonctionne , j'ai tellement essayer de chose hier sans succès .
j'ai du après avoir changer le code oublier de le televerser.
merci encore .
je te mets quelque photos de mon projet arrosage .
j'avais besoin de ce minuteur pour attendre entre deux arrosages .
bon week-end .
QErzlLr
YICdQwp
https://github.com/
1 2 3
Vous devez être connecté pour pouvoir répondre à ce sujet.
Utilisation des données

Afin d'améliorer ton expérience utilisateur, nous utilisons des cookies 🍪