Aller au contenu


Photo
- - - - -

course du soleil


  • Veuillez vous connecter pour répondre
224 réponses à ce sujet

#101 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 27 janvier 2020 - 04:30

Bonjour,

tout d'abord, une petite remarque (qui ne devrait rien changer, sauf de rendre le code un peu plus propre) : la déclaration de maxdaytemp, que tu n'utilise que dans la fonction setday, devrait se faire à la première ligne de la fonction setday au lieu d'à la ligne 62 (si tu la déclare à la ligne 62, c'est une variable globale).

 

Sinon, désolé, j'avais raté une autre erreur dans la fonction max_day : le return n'est pas au bon endroit (il devrait être à la toute dernière ligne, pas dans un if). Le bon code est :

int max_day(){
  int ma_valeur_de_maxday=0;
    DateTime now = RTC.now();
      
   if (now.month() == 4 || now.month() == 5 || now.month() == 9 || now.month() == 11){  //30 jours =  Septembre, Avril, Juin,  Novembre.
     ma_valeur_de_maxday  = 30;
     }
  else {
     ma_valeur_de_maxday  = 31; //... all the others have 31
    
  }
  if (now.month() == 2 && now.year() % 4 == 0){  //... Exception Fevrier = 28 jours , ou 29 jours année bissextile.
     ma_valeur_de_maxday  = 29;
  }
  if (now.month() == 2 && now.year() % 4 != 0){
     ma_valeur_de_maxday  = 28;
  }   
  return ma_valeur_de_maxday;
}

 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#102 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 27 janvier 2020 - 04:59

rebonjour Sandro écoute la valeur lu et correct : 313°

j'avais pense à ça un peu ce que tu m'avais proposer

position_cible = map(alfa_1,0,360,0,64);ce qui vaut =55pas
comparer les pas_ cible par rapport au pas_ reelle
d'avance merci
 
void moteur_pas(){
    
      monmoteur.step(position_cible - position_reelle);                   
      position_reelle = position_cible;
      cptepas++;
}
 
ou
 
void moteur_pas(){
    position_cible = EEPROM.read(17);
    EEPROM.update(19,position_reelle);
  
    
   if(position_reelle < position_cible){
    monmoteur.step(+1);                   // Avance de 1 pas.
    cptepas++;
    position_reelle++;
   
    EEPROM.update(18,cptepas);// Incrémente la variable cptepas pour compter les pas.
    EEPROM.update(19,position_reelle);
    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_reelle > position_cible){
    monmoteur.step(-1);
    cptepas--;// décrémente la variable cptepas pour compter les pas.
    position_reelle++;
   
    EEPROM.update(18,cptepas);// decrémente la variable cptepas pour compter les pas.
    EEPROM.update(19,position_reelle);
    Serial.print("nombre de pas:" );    // Affiche dans le moniteur "série"
    Serial.println(cptepas); // le nbre de pas effectué.                   
    delay(500);                  
   }
    EEPROM.update(18,cptepas);
    EEPROM.update(19,position_reelle);
}


#103 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 27 janvier 2020 - 05:39

Contant que ça marche.

 

Pour la seconde partie du message, je ne suis pas sur d'avoir compris quelle est la question ou le problème?


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#104 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 27 janvier 2020 - 05:55

j'ai du mal avec position cible calculer par map tout les jours et faire avancer le moteur de l'ancienne position à la nouvelle .

le premier progamme je ne sais pas s'il es valable et le deuxieme a chaque redémarrage de la carte ça recommence à zero .

merci bonne soirée



#105 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 28 janvier 2020 - 12:02

Bonsoir,

pour la seconde version, je dois avouer avoir un peu la flemme de me plonger dans les eeprom read/update repartis partout dans le code pour essayer de comprendre d'où exactement vient le problème.

 

Pour la première version, tel quelle ça ne marchera pas, mais ça s'adapte facilement dans le même esprit : je te proposerais donc le code suivant :

void moteur_pas(){
      int cpte_pas=EEPROM.read(18)
      monmoteur.step(position_cible - cpte_pas);                   
      cpte_pas = position_cible;
      EEPROM.update(18,cpte_pas);
}

La seule condition pour que ça marche, c'est que la "position_cible" soit exprimé en nombre de pas depuis la position "0", ce qui est bien le cas avec le code "position_cible = map(alfa_1,0,360,0,64);" que tu proposais
 

 

 

Une variante, que je trouve plus élégante, serait la suivante :

void moteur_pas(int cpte_pas_cible){
      int cpte_pas=EEPROM.read(18)
      monmoteur.step(cpte_pas_cible - cpte_pas);                   
      cpte_pas = position_cible;
      EEPROM.update(18,cpte_pas);
}

où cpte_pas_cible correspond à la position cible.

Dans ce cas, tu appelle la fonction moteur_pas avec comme argument la position (en nbr de pas depuis l'origine) où tu veux aller.

 

 

Une troisième variante, qui est peut-être encore plus élégante serait la suivante :

void moteur_go_to_angle(int angle_cible){
      int cpte_pas=EEPROM.read(18)
      int cpte_pas_cible=map(angle_cible,0,360,0,64);
      monmoteur.step(cpte_pas_cible - cpte_pas);                   
      cpte_pas = position_cible;
      EEPROM.update(18,cpte_pas);
}

Dans ce cas, tu appelle la fonction moteur_go_to_angle avec la valeur de l'angle (alfa_1) comme argument, et le moteur vas a cette position.

Le grand avantage de cette dernière méthode est que vu de l'extérieur, elle fait totalement abstraction du choix du moteur (ie quand tu appelle la fonction, tu n'as plus a te soucier de savoir si ton moteur a 64 pas par tour ou un grand nombre).

 

Bonne soirée

Sandro
 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#106 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 28 janvier 2020 - 08:06

bonjour Sandro ,

merci beaucoup pour tout ces codes .

merci encore pour toute l'aide que tu m'a donner , je ne serais pas arriver sans toi .

je te tiens au courant .

belle journée, Michel.



#107 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 29 janvier 2020 - 05:40

bonsoir Sandro,

j'ai bien aimer ta troisième variante mais je crois bien n'avoir pas tout compris .

voila ce que je lis sur les EEPROM

alfa_1 = 336°, cpte_pas_cible = 59, cpte_pas =199 ??

je te joint le code :

pour que tu vois ou je me suis tromper .

bonne soirée ,Michel

#include <Wire.h>
#include "RTClib.h"
#include <Stepper.h>
#include <Encoder.h> // from http://www.pjrc.com/teensy/td_libs_Encoder.html
Encoder knob(3, 4); //encoder connected to pins 2 and 3 (and ground)// D2 SEEDSTUDIO shield
#include <TimeLib.h>
#include <TimeLord.h>
#include <EEPROM.h>
const float LATITUDE = 43.70, LONGITUDE = 7.25; // Nice Sun
const int TIMEZONE = + 1;
int r   = 35;//cercle drawLine
int r_1 = 35;//drawbitmap
int angle = 0;
int x1=57;// drawbitmap rattrapage width  65-8 = 57
int y1=43;// drawbitmap rattrapage height 50-8 = 42
int x0=65;// drawLine
int y0=50;// drawLine
int sun;
int alfa=0;
int degre = 0;
//int backlight = 6; //backlight control pin 6
/* variables stepper */
                                    
const int nbrepas360 = 64;                       // Fixe le nombre de pas pour faire un tour complet, c'est-à-dire 360°.
Stepper monmoteur (nbrepas360, 8, 9, 10, 11);    // Initialise la librairie Stepper.h
//int cptepas = 0 ;
int alfa_1 = 0;
float position_cible;
float degrees_pas = 1;
int cpte_pas_cible;
#define u8g_logo_width 16
#define u8g_logo_height 16

#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
   #define Serial SerialUSB
#endif
RTC_DS1307 RTC;
char daysOfTheWeek[7][12] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};

#include "U8glib.h"
//U8GLIB_ST7920_128X64 u8g(13, 11, 12, U8G_PIN_NONE);//U8GLIB_ST7920_128X64_1X u8g(7, 6, 5 ,8); //Enable, RW, RS, RESET
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);

int Timer = 0;
int Minutt = 0;
int Sekund = 0;
float Vinkel = 0;
int an = 0;
int luna = 0;
int zi = 0;
int zis = 0;

//the variables provide the holding values for the set clock routine
int setyeartemp;
int setmonthtemp;
int setdaytemp;
int setoretemp;
int setzitemp;
int setminstemp;
int setsecs = 0;
 // maximum number of days in the given month
int TimeMins; // number of seconds since midnight
int TimerMode = 2; //mode 0=Off 1=On 2=Auto
int TimeOut = 10;
int TimeOutCounter;

// These variables are for the push button routine
int buttonstate = 0; //flag to see if the button has been pressed, used internal on the subroutine only
int pushlengthset = 1500; // value for a long push in mS
int pushlength = pushlengthset; // set default pushlength
int pushstart = 0;// sets default push value for the button going low
int pushstop = 0;// sets the default value for when the button goes back high

int Sunrise, Sunset; //sunrise and sunset expressed as minute of day (0-1439)
TimeLord myLord; // TimeLord Object, Global variable
byte sunTime[]  = {0, 0, 0, 1, 1, 13}; // 17 Oct 2013
int SunriseHour, SunriseMin, SunsetHour, SunsetMin;
int knobval; // value for the rotation of the knob
boolean buttonflag = false; // default value for the button flag

int backlight = 6;//backlight control pin 6
#include <stdlib.h>
char tmp_string[8];

int max_day(){
  int ma_valeur_de_maxday=0;
    DateTime now = RTC.now();
      
   if (now.month() == 4 || now.month() == 5 || now.month() == 9 || now.month() == 11){  //30 jours =  Septembre, Avril, Juin,  Novembre.
     ma_valeur_de_maxday  = 30;
     }
  else {
     ma_valeur_de_maxday  = 31; //... all the others have 31
    
  }
  if (now.month() == 2 && now.year() % 4 == 0){  //... Exception Fevrier = 28 jours , ou 29 jours année bissextile.
     ma_valeur_de_maxday  = 29;
  }
  if (now.month() == 2 && now.year() % 4 != 0){
     ma_valeur_de_maxday  = 28;
  }
   return ma_valeur_de_maxday;
}
 


void turntable(void) {
  DateTime now = RTC.now();
 
    /* center */
 int x2=128/2;  
 int y2=64/2;  
 /* radius */
 int r2=22;
 /* angle*/
 //int cptepas = EEPROM.read(18);
  max_day() ;
  alfa_1 =360*now.day()/max_day();
 
 u8g.setPrintPos(1,60);
 u8g.print(alfa_1);
 
 u8g.setFont(u8g_font_6x10);
 
 u8g.setPrintPos(30,60);
 u8g.print(EEPROM.read(17));//cpte_pas_cible
 u8g.setPrintPos(90,60);
 u8g.print(EEPROM.read(18));//cptepas
  /* affichage maxday */
 u8g.setFont(u8g_font_6x10);
 u8g.setPrintPos(110,30 );
 u8g.print(EEPROM.read(7));
 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_go_to_angle(void){
      int cpte_pas = EEPROM.read(18);
      int cpte_pas_cible = map(alfa_1,0,360,0,64);
      EEPROM.update(17,cpte_pas_cible);
      monmoteur.step(cpte_pas_cible - cpte_pas);                   
      cpte_pas = position_cible;
      EEPROM.update(18,cpte_pas);
}

 void draw(void) {
      
      DateTime now = RTC.now();
      
    /*Timelord initialisation*/
    myLord.TimeZone(TIMEZONE * 60);
    myLord.Position(LATITUDE, LONGITUDE);
    sunTime[3] = now.day(); // Give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunRise(sunTime); // Computes Sun Rise.
    Sunrise = sunTime[2] * 60 + sunTime[1]; // Sunrise returned in minutes past midnight
    SunriseHour = sunTime[2];
    SunriseMin = sunTime [1];
    sunTime[3] = now.day(); // Uses the Time library to give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunSet(sunTime); // Computes Sun Set.
    Sunset = sunTime[2] * 60 + sunTime[1]; // Sunset returned in minutes past midnight
    SunsetHour = sunTime[2];
    SunsetMin = sunTime [1];
    u8g.setFont(u8g_font_6x13);   
    u8g.setPrintPos(2,10);
    if (zi < 10) u8g.print("0");
    u8g.print(zi);
    u8g.print("/");
    if (luna < 10) u8g.print("0");
    u8g.print(luna);
    u8g.print("/");
    u8g.setPrintPos(40,10);
    u8g.print(daysOfTheWeek[zis]);

    u8g.setFont(u8g_font_6x13);
    u8g.setPrintPos(80,10);
    if (Timer < 10) u8g.print(" ");
    u8g.print(Timer);
    u8g.setPrintPos(93,10);
    if (Sekund%2 != 1)
    u8g.print(":");
    u8g.setPrintPos(115,10);
    u8g.setFont(u8g_font_6x10);
    if(Sekund<10)u8g.print("0");
    u8g.print(Sekund);
    u8g.setPrintPos(100,10);
    u8g.setFont(u8g_font_6x13);
    if (Minutt < 10) u8g.print("0");
    u8g.print(Minutt);
    TimeMins = (now.hour() * 60) + now.minute();
    max_day();
    //u8g.setPrintPos(1,60);
    //u8g.print(EEPROM.read(16));
    
    TimeMins = (now.hour() * 60) + now.minute();
    
    if (TimeMins >= Sunrise && TimeMins <=Sunset-1) { //If it's after sunrise and before sunset, switch our relay on
            digitalWrite (A3, HIGH);// cdt PONT H
            //analogWrite(backlight,255);// lcd rétroéclairage On
            u8g.setColorIndex(1); // Pixel On SH1106
      }
       else {  //otherwise switch it off
            digitalWrite (A3,LOW);// cdt PONT H
            //analogWrite(backlight,0);// lcd rétroéclairage Off
            u8g.setColorIndex(0);// Pixel Off SH1106
     }    
  }
        
        
    
void setup(void) {
   u8g.setContrast(0);//Config the constrast to the best effect
   analogWrite(backlight,255);
      // assign default color value
  if ( u8g.getMode() == U8G_MODE_R3G3B2 )
    u8g.setColorIndex(255);     // white
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
    u8g.setColorIndex(3);         // max intensity
  else if ( u8g.getMode() == U8G_MODE_BW )
    u8g.setColorIndex(1);         // pixel on
    
  Serial.begin(9600);
  Wire.begin();
  if (! RTC.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
   
    RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
    
  }
pinMode(A0,INPUT);//push button on encoder connected to A0 (and GND)
digitalWrite(A0,HIGH); //Pull button high
}

void loop(void) {
    
    u8g.setFont(u8g_font_6x10);
    DateTime now = RTC.now();
    Timer = now.hour(), DEC;
    Minutt = now.minute(), DEC;
    Sekund = now.second(), DEC;
    Serial.print(Timer);
    Serial.print(':');
    Serial.print(Minutt);
    Serial.print(':');
    Serial.print(Sekund);
    Serial.print(" - ");
    an = now.year(), DEC;
    Serial.print(an);
    Serial.print('/');
    luna = now.month(), DEC;
    Serial.print(luna);
    Serial.print('/');
    zi = now.day(), DEC;
    Serial.print(zi);
    Serial.print(" (");
    zis = now.dayOfTheWeek();
    Serial.print(daysOfTheWeek[zis]);
    Serial.println(") ");
    moteur_go_to_angle();
    max_day();
    
           
  /* picture loop*/
  u8g.firstPage();
  do {
    draw();
    turntable();
  } while( u8g.nextPage() );
  // rebuild the picture after some delay
  delay(100);

 pushlength = pushlengthset;
 pushlength = getpushlength();
 delay (10);
 
 if (pushlength < pushlengthset)
 {
  //ShortPush ();   
   Serial.println("short push");
    // picture loop
  u8g.firstPage();
  do {
    draw1();
    
  } while( u8g.nextPage() );
  // rebuild the picture after some delay
  delay(1000);

 }
  //This runs the setclock routine if the knob is pushed for a long time
       if (pushlength > pushlengthset) {
 
  Serial.println("long push");
         DateTime now = RTC.now();
         setyeartemp=now.year(),DEC;
         setmonthtemp=now.month(),DEC;
         setdaytemp=now.day(),DEC;
         setoretemp=now.hour(),DEC;
         setminstemp=now.minute(),DEC;
         setzitemp = now.dayOfTheWeek();
         setclock();
         pushlength = pushlengthset;
       };
 
} // end main loop


// subroutine to return the length of the button push.
int getpushlength()
{
  buttonstate = digitalRead(A0);  
       if(buttonstate == LOW && buttonflag==false) {     
              pushstart = millis();
              buttonflag = true;
          };     
       if (buttonstate == HIGH && buttonflag==true) {
         pushstop = millis ();
         pushlength = pushstop - pushstart;
         buttonflag = false;
       };
        Serial.println("_");
       return pushlength;
}

void draw1(void) {
  u8g.drawStr( 10, 32, "Thx to niq_ro!");
}
//sets the clock
void setclock (){
 
   setyear ();//Annee
   setmonth ();//Mois
   setday ();//Jour
   setzi();//semaine
   setore ();//hours
   setmins ();//Minutes
   RTC.adjust(DateTime(setyeartemp,setmonthtemp,setdaytemp,setoretemp,setminstemp,setsecs));
   CalcSun();
   delay (1000);
}
int CalcSun () { //Calculates the Sunrise and Sunset times
    DateTime now = RTC.now();
    //Timelord initialisation
    myLord.TimeZone(TIMEZONE * 60);
    myLord.Position(LATITUDE, LONGITUDE);
    sunTime[3] = now.day(); // Give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunRise(sunTime); // Computes Sun Rise.
    Sunrise = sunTime[2] * 60 + sunTime[1]; // Sunrise returned in minutes past midnight
    SunriseHour = sunTime[2];
    SunriseMin = sunTime [1];
    sunTime[3] = now.day(); // Uses the Time library to give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunSet(sunTime); // Computes Sun Set.
    Sunset = sunTime[2] * 60 + sunTime[1]; // Sunset returned in minutes past midnight
    SunsetHour = sunTime[2];
    SunsetMin = sunTime [1];
    
 
}
// The following subroutines set the individual clock parameters
int setyear () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setyeartemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) { //bit of software de-bounce
      knobval = -1;
      delay (50);
    }
    if (knobval > 1) {
      knobval = 1;
      delay (50);
    }
    setyeartemp=setyeartemp + knobval;
    if (setyeartemp < 2018) { //Year can't be older than currently, it's not a time machine.
      setyeartemp = 2018;
    }
//itoa(setyeartemp - 2000, tmp_string, 10); // https://www.avrfreaks.net/forum/how-do-i-print-variable-u8glib
itoa(setyeartemp, tmp_string, 10); // https://www.avrfreaks.net/forum/how-do-i-print-variable-u8glib
  u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Annee");
//  u8g.drawStr( 0, 40, "20");
  u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );  
    setyear();
}

int setmonth () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setmonthtemp;
    }

 //   lcd.setCursor (0,1);
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
    }
    if (knobval > 1) {
      knobval = 1;
    }
    setmonthtemp=setmonthtemp + knobval;
    if (setmonthtemp < 1) {// month must be between 1 and 12
      setmonthtemp = 1;
    }
    if (setmonthtemp > 12) {
      setmonthtemp=12;
    }
    itoa(setmonthtemp, tmp_string, 10);
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Mois");
  u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );
    setmonth();
}


int setday () {
  int maxdaytemp;
  if (setmonthtemp == 4 || setmonthtemp == 5 || setmonthtemp == 9 || setmonthtemp == 11) { //30 days hath September, April June and November
    maxdaytemp = 30;
  }
  else {
  maxdaytemp = 31; //... all the others have 31
  }
  if (setmonthtemp ==2 && setyeartemp % 4 ==0) { //... Except February alone, and that has 28 days clear, and 29 in a leap year.
    maxdaytemp = 29;
  }
  if (setmonthtemp ==2 && setyeartemp % 4 !=0) {
    maxdaytemp = 28;
  }
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setdaytemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
    }
    if (knobval > 1) {
      knobval = 1;
    }
    setdaytemp = setdaytemp+ knobval;
    if (setdaytemp < 1) {
      setdaytemp = 1;
    }
    if (setdaytemp > max_day) {
      setdaytemp = max_day;
    }
  itoa(setdaytemp, tmp_string, 10);  
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Jour");
u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );
    setday();
}


int setzi () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setzitemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
    }
    if (knobval > 1) {
      knobval = 1;
    }
    setzitemp=setzitemp + knobval;
    if (setzitemp < 0) {// month must be between 0 and 6
      setzitemp = 0;
    }
    if (setzitemp > 6) {
      setzitemp=6;
    }
    itoa(setzitemp, tmp_string, 10);
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Jour of Week");
  u8g.drawStr(25, 40, tmp_string);
  u8g.drawStr(0,60, daysOfTheWeek[setzitemp]);
  } while( u8g.nextPage() );
    setzi();
}

int setore () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setoretemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
      delay (50);
    }
    if (knobval > 1) {
      knobval = 1;
      delay (50);
    }
    setoretemp=setoretemp + knobval;
    if (setoretemp < 0) {
      setoretemp = 0;
    }
    if (setoretemp > 23) {
      setoretemp=23;
    }
   itoa(setoretemp, tmp_string, 10);  
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Heures");
u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );
    setore();
}

int setmins () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setminstemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
      delay (50);
    }
    if (knobval > 1) {
      knobval = 1;
      delay (50);
    }
    setminstemp=setminstemp + knobval;
    if (setminstemp < 0) {
      setminstemp = 0;
    }
    if (setminstemp > 59) {
      setminstemp=59;
    }
   itoa(setminstemp, tmp_string, 10);  
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Minutes");
u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );
    setmins();
}

 
 
 


#108 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 29 janvier 2020 - 07:18

Bonsoir,

 

tout d'abord, je viens de voir que tu appelles à plusieurs reprise la fonction max_day sans récupérer le résultat (ie ta ligne est uniquement "max_day();) : ça ne sert strictement à rien (la fonction max_day ne modifie aucune variable globale ni l'eeprom, ni ne "fait" quoi que ce soit d'autre que de renvoyer la valeur de maxday). C'est le cas lignes 118, 203 et 277

 

Deuxièmement, lignes 479 et 480, il faut utiliser maxdaytemp et pas max_day (qui aurait de toute façon nécessité des parenthèses)

 

Troisièmement, une remarque sur l'EEPROM : l'EEPROM est sensé servir UNIQUEMENT a stocker des informations qu'on ne peut pas se permettre de perdre si l'arduino s'éteint ou reboot. Toutes les autres informations peuvent être stoquées en RAM à la place (ie une simple variable locale ou globale). Du coup, dans ton programme, la seule et unique information qui doit être stoquée dans l'EEPROM, c'est la position du moteur, car avec un moteur pas à pas on n'a aucun moyen sinon de savoir où était le moteur avant l'extinction (et donc où il est maintenant en supposant que personne ne l'a bougé manuellement).

Une chose importante à savoir, c'est qu'une EEPROM ne peut être écrite qu'un nombre limité de fois (environ 100 000 par emplacement pour celle de l'Arduino). Du coup, si tu écris rapidement, tu peux détruire très rapidement l'EEPROM (si dans loop tu ne mets que i=i+1; et EEPROM.update(0,i);   , alors en environ 6 minutes tu as détruit l'emplacement 0 de l'EEPROM. Dans ton cas, vu que la valeur ne change que rarement, et que tu utilise la fonction update (qui n'écrit vraiment que si la valeur change), tu ne détruit pas l'EEPROM. Mais si tu avais utilisé write (qui écrit même si la valeur n'a pas changé), tu aurais déjà détruit plusieurs emplacements de l'EEPROM. Et dans ton prochain projet, si tu as des valeurs qui changent un peu plus souvent, et que tu garde la mauvaise habitude de vouloir stocker tout et n'importe quoi dans l'EEPROM, alors ton EEPROM sera fichu très rapidement.

Tout ça pour dire que si tu veux absolument récupérer la valeur de cpte_pas_cible, alors prend la bonne habitude de passer par une variable globale plutôt que par l'EEPROM (il y a des solutions encore mieux que les variables globales, mais commence déjà par ça).

 

Quatrièmement, ligne 133, tu lis l'eeprom à l'adresse 7 alors que tu n'y écris rien : du coup supprime cette ligne (ainsi que les lignes 130,131 et 132). Ou alors, si tu veux afficher maxday, alors remplace la ligne 133 par  "u8g.print(max_day());"

 

Enfin, pour l'erreur, c'est moi qui ait fai une étourderie (c'est le problème quand on n'a pas le montage sous la main, on peut pas tester) : dans la fonction moteur_go_to_angle, il faut remplacer (pour les variantes 2 et 3) "cpte_pas = position_cible;" par "cpte_pas = cpte_pas_cible;"

 

 

Bonne soirée

sandro


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#109 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 30 janvier 2020 - 03:55

bonjour Sandro,

j'ai fait toutes les modifications ,mais toujours un probléme .

je peux te demander comment tu compte pas du moteur avant il y avais cptepas++;

pour les EEPROM je n'ai pas trouver autre chose pour afficher dans les void affichage .

merci d'avance et bonne soirée .

alfa_1= 348  ok

cpte_pas_cible = 61  ok

mais cpte_pas = 255?

je te joins le code :

#include <Wire.h>
#include "RTClib.h"
#include <Stepper.h>
#include <Encoder.h> // from http://www.pjrc.com/teensy/td_libs_Encoder.html
Encoder knob(3, 4); //encoder connected to pins 2 and 3 (and ground)// D2 SEEDSTUDIO shield
#include <TimeLib.h>
#include <TimeLord.h>
#include <EEPROM.h>
const float LATITUDE = 43.70, LONGITUDE = 7.25; // Nice Sun
const int TIMEZONE = + 1;
int r   = 35;//cercle drawLine
int r_1 = 35;//drawbitmap
int angle = 0;
int x1=57;// drawbitmap rattrapage width  65-8 = 57
int y1=43;// drawbitmap rattrapage height 50-8 = 42
int x0=65;// drawLine
int y0=50;// drawLine
int sun;
int alfa=0;
int degre = 0;
//int backlight = 6; //backlight control pin 6
/* variables stepper */
                                    
const int nbrepas360 = 64;                       // Fixe le nombre de pas pour faire un tour complet, c'est-à-dire 360°.
Stepper monmoteur (nbrepas360, 8, 9, 10, 11);    // Initialise la librairie Stepper.h
//int cptepas = 0 ;
int alfa_1 = 0;
float position_cible;
float degrees_pas = 1;
int cpte_pas_cible;
#define u8g_logo_width 16
#define u8g_logo_height 16

#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
   #define Serial SerialUSB
#endif
RTC_DS1307 RTC;
char daysOfTheWeek[7][12] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};

#include "U8glib.h"
//U8GLIB_ST7920_128X64 u8g(13, 11, 12, U8G_PIN_NONE);//U8GLIB_ST7920_128X64_1X u8g(7, 6, 5 ,8); //Enable, RW, RS, RESET
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);

int Timer = 0;
int Minutt = 0;
int Sekund = 0;
float Vinkel = 0;
int an = 0;
int luna = 0;
int zi = 0;
int zis = 0;

//the variables provide the holding values for the set clock routine
int setyeartemp;
int setmonthtemp;
int setdaytemp;
int setoretemp;
int setzitemp;
int setminstemp;
int setsecs = 0;
 // maximum number of days in the given month
int TimeMins; // number of seconds since midnight
int TimerMode = 2; //mode 0=Off 1=On 2=Auto
int TimeOut = 10;
int TimeOutCounter;

// These variables are for the push button routine
int buttonstate = 0; //flag to see if the button has been pressed, used internal on the subroutine only
int pushlengthset = 1500; // value for a long push in mS
int pushlength = pushlengthset; // set default pushlength
int pushstart = 0;// sets default push value for the button going low
int pushstop = 0;// sets the default value for when the button goes back high

int Sunrise, Sunset; //sunrise and sunset expressed as minute of day (0-1439)
TimeLord myLord; // TimeLord Object, Global variable
byte sunTime[]  = {0, 0, 0, 1, 1, 13}; // 17 Oct 2013
int SunriseHour, SunriseMin, SunsetHour, SunsetMin;
int knobval; // value for the rotation of the knob
boolean buttonflag = false; // default value for the button flag

int backlight = 6;//backlight control pin 6
#include <stdlib.h>
char tmp_string[8];

int max_day(){
  int ma_valeur_de_maxday=0;
    DateTime now = RTC.now();
      
   if (now.month() == 4 || now.month() == 5 || now.month() == 9 || now.month() == 11){  //30 jours =  Septembre, Avril, Juin,  Novembre.
     ma_valeur_de_maxday  = 30;
     }
  else {
     ma_valeur_de_maxday  = 31; //... all the others have 31
    
  }
  if (now.month() == 2 && now.year() % 4 == 0){  //... Exception Fevrier = 28 jours , ou 29 jours année bissextile.
     ma_valeur_de_maxday  = 29;
  }
  if (now.month() == 2 && now.year() % 4 != 0){
     ma_valeur_de_maxday  = 28;
  }
   return ma_valeur_de_maxday;
}
 


void turntable(void) {
  DateTime now = RTC.now();
 
    /* center */
 int x2=128/2;  
 int y2=64/2;  
 /* radius */
 int r2=22;
 /* angle*/
 
 
  alfa_1 =360*now.day()/max_day();
 
 u8g.setPrintPos(1,60);
 u8g.print(alfa_1);
 
 u8g.setFont(u8g_font_6x10);
 
 u8g.setPrintPos(30,60);
 u8g.print(EEPROM.read(17));//cpte_pas_cible
 u8g.setPrintPos(90,60);
 u8g.print(EEPROM.read(18));//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_go_to_angle(void){
      int cpte_pas = EEPROM.read(18);
      int cpte_pas_cible = map(alfa_1,0,360,0,64);
      EEPROM.update(17,cpte_pas_cible);
      monmoteur.step(cpte_pas_cible - cpte_pas);
      Serial.println("cpte_pas"),Serial.print(cpte_pas);
      Serial.println("cpte_pas_cible"),Serial.print(cpte_pas_cible);                  
      cpte_pas = cpte_pas_cible;
      EEPROM.update(18,cpte_pas);
      
}

 void draw(void) {
      
      DateTime now = RTC.now();
      
    /*Timelord initialisation*/
    myLord.TimeZone(TIMEZONE * 60);
    myLord.Position(LATITUDE, LONGITUDE);
    sunTime[3] = now.day(); // Give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunRise(sunTime); // Computes Sun Rise.
    Sunrise = sunTime[2] * 60 + sunTime[1]; // Sunrise returned in minutes past midnight
    SunriseHour = sunTime[2];
    SunriseMin = sunTime [1];
    sunTime[3] = now.day(); // Uses the Time library to give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunSet(sunTime); // Computes Sun Set.
    Sunset = sunTime[2] * 60 + sunTime[1]; // Sunset returned in minutes past midnight
    SunsetHour = sunTime[2];
    SunsetMin = sunTime [1];
    u8g.setFont(u8g_font_6x13);   
    u8g.setPrintPos(2,10);
    if (zi < 10) u8g.print("0");
    u8g.print(zi);
    u8g.print("/");
    if (luna < 10) u8g.print("0");
    u8g.print(luna);
    u8g.print("/");
    u8g.setPrintPos(40,10);
    u8g.print(daysOfTheWeek[zis]);

    u8g.setFont(u8g_font_6x13);
    u8g.setPrintPos(80,10);
    if (Timer < 10) u8g.print(" ");
    u8g.print(Timer);
    u8g.setPrintPos(93,10);
    if (Sekund%2 != 1)
    u8g.print(":");
    u8g.setPrintPos(115,10);
    u8g.setFont(u8g_font_6x10);
    if(Sekund<10)u8g.print("0");
    u8g.print(Sekund);
    u8g.setPrintPos(100,10);
    u8g.setFont(u8g_font_6x13);
    if (Minutt < 10) u8g.print("0");
    u8g.print(Minutt);
    TimeMins = (now.hour() * 60) + now.minute();
    
    //u8g.setPrintPos(1,60);
    //u8g.print(EEPROM.read(16));
    
    TimeMins = (now.hour() * 60) + now.minute();
    
    if (TimeMins >= Sunrise && TimeMins <=Sunset-1) { //If it's after sunrise and before sunset, switch our relay on
            digitalWrite (A3, HIGH);// cdt PONT H
            //analogWrite(backlight,255);// lcd rétroéclairage On
            u8g.setColorIndex(1); // Pixel On SH1106
      }
       else {  //otherwise switch it off
            digitalWrite (A3,LOW);// cdt PONT H
            //analogWrite(backlight,0);// lcd rétroéclairage Off
            u8g.setColorIndex(0);// Pixel Off SH1106
     }    
  }
        
        
    
void setup(void) {
   u8g.setContrast(0);//Config the constrast to the best effect
   analogWrite(backlight,255);
      // assign default color value
  if ( u8g.getMode() == U8G_MODE_R3G3B2 )
    u8g.setColorIndex(255);     // white
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
    u8g.setColorIndex(3);         // max intensity
  else if ( u8g.getMode() == U8G_MODE_BW )
    u8g.setColorIndex(1);         // pixel on
    
  Serial.begin(9600);
  Wire.begin();
  if (! RTC.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
   
    RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
    
  }
pinMode(A0,INPUT);//push button on encoder connected to A0 (and GND)
digitalWrite(A0,HIGH); //Pull button high
}

void loop(void) {
    
    u8g.setFont(u8g_font_6x10);
    DateTime now = RTC.now();
    Timer = now.hour(), DEC;
    Minutt = now.minute(), DEC;
    Sekund = now.second(), DEC;
    Serial.print(Timer);
    Serial.print(':');
    Serial.print(Minutt);
    Serial.print(':');
    Serial.print(Sekund);
    Serial.print(" - ");
    an = now.year(), DEC;
    Serial.print(an);
    Serial.print('/');
    luna = now.month(), DEC;
    Serial.print(luna);
    Serial.print('/');
    zi = now.day(), DEC;
    Serial.print(zi);
    Serial.print(" (");
    zis = now.dayOfTheWeek();
    Serial.print(daysOfTheWeek[zis]);
    Serial.println(") ");
    moteur_go_to_angle();
    
    
           
  /* picture loop*/
  u8g.firstPage();
  do {
    draw();
    turntable();
  } while( u8g.nextPage() );
  // rebuild the picture after some delay
  delay(100);

 pushlength = pushlengthset;
 pushlength = getpushlength();
 delay (10);
 
 if (pushlength < pushlengthset)
 {
  //ShortPush ();   
   Serial.println("short push");
    // picture loop
  u8g.firstPage();
  do {
    draw1();
    
  } while( u8g.nextPage() );
  // rebuild the picture after some delay
  delay(1000);

 }
  //This runs the setclock routine if the knob is pushed for a long time
       if (pushlength > pushlengthset) {
 
  Serial.println("long push");
         DateTime now = RTC.now();
         setyeartemp=now.year(),DEC;
         setmonthtemp=now.month(),DEC;
         setdaytemp=now.day(),DEC;
         setoretemp=now.hour(),DEC;
         setminstemp=now.minute(),DEC;
         setzitemp = now.dayOfTheWeek();
         setclock();
         pushlength = pushlengthset;
       };
 
} // end main loop


// subroutine to return the length of the button push.
int getpushlength()
{
  buttonstate = digitalRead(A0);  
       if(buttonstate == LOW && buttonflag==false) {     
              pushstart = millis();
              buttonflag = true;
          };     
       if (buttonstate == HIGH && buttonflag==true) {
         pushstop = millis ();
         pushlength = pushstop - pushstart;
         buttonflag = false;
       };
        Serial.println("_");
       return pushlength;
}

void draw1(void) {
  u8g.drawStr( 10, 32, "Thx to niq_ro!");
}
//sets the clock
void setclock (){
 
   setyear ();//Annee
   setmonth ();//Mois
   setday ();//Jour
   setzi();//semaine
   setore ();//hours
   setmins ();//Minutes
   RTC.adjust(DateTime(setyeartemp,setmonthtemp,setdaytemp,setoretemp,setminstemp,setsecs));
   CalcSun();
   delay (1000);
}
int CalcSun () { //Calculates the Sunrise and Sunset times
    DateTime now = RTC.now();
    //Timelord initialisation
    myLord.TimeZone(TIMEZONE * 60);
    myLord.Position(LATITUDE, LONGITUDE);
    sunTime[3] = now.day(); // Give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunRise(sunTime); // Computes Sun Rise.
    Sunrise = sunTime[2] * 60 + sunTime[1]; // Sunrise returned in minutes past midnight
    SunriseHour = sunTime[2];
    SunriseMin = sunTime [1];
    sunTime[3] = now.day(); // Uses the Time library to give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunSet(sunTime); // Computes Sun Set.
    Sunset = sunTime[2] * 60 + sunTime[1]; // Sunset returned in minutes past midnight
    SunsetHour = sunTime[2];
    SunsetMin = sunTime [1];
    
 
}
// The following subroutines set the individual clock parameters
int setyear () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setyeartemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) { //bit of software de-bounce
      knobval = -1;
      delay (50);
    }
    if (knobval > 1) {
      knobval = 1;
      delay (50);
    }
    setyeartemp=setyeartemp + knobval;
    if (setyeartemp < 2018) { //Year can't be older than currently, it's not a time machine.
      setyeartemp = 2018;
    }
//itoa(setyeartemp - 2000, tmp_string, 10); // https://www.avrfreaks.net/forum/how-do-i-print-variable-u8glib
itoa(setyeartemp, tmp_string, 10); // https://www.avrfreaks.net/forum/how-do-i-print-variable-u8glib
  u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Annee");
//  u8g.drawStr( 0, 40, "20");
  u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );  
    setyear();
}

int setmonth () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setmonthtemp;
    }

 //   lcd.setCursor (0,1);
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
    }
    if (knobval > 1) {
      knobval = 1;
    }
    setmonthtemp=setmonthtemp + knobval;
    if (setmonthtemp < 1) {// month must be between 1 and 12
      setmonthtemp = 1;
    }
    if (setmonthtemp > 12) {
      setmonthtemp=12;
    }
    itoa(setmonthtemp, tmp_string, 10);
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Mois");
  u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );
    setmonth();
}


int setday () {
  int maxdaytemp;
  if (setmonthtemp == 4 || setmonthtemp == 5 || setmonthtemp == 9 || setmonthtemp == 11) { //30 days hath September, April June and November
    maxdaytemp = 30;
  }
  else {
  maxdaytemp = 31; //... all the others have 31
  }
  if (setmonthtemp ==2 && setyeartemp % 4 ==0) { //... Except February alone, and that has 28 days clear, and 29 in a leap year.
    maxdaytemp = 29;
  }
  if (setmonthtemp ==2 && setyeartemp % 4 !=0) {
    maxdaytemp = 28;
  }
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setdaytemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
    }
    if (knobval > 1) {
      knobval = 1;
    }
    setdaytemp = setdaytemp+ knobval;
    if (setdaytemp < 1) {
      setdaytemp = 1;
    }
    if (setdaytemp > maxdaytemp) {
      setdaytemp = maxdaytemp;
    }
  itoa(setdaytemp, tmp_string, 10);  
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Jour");
u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );
    setday();
}


int setzi () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setzitemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
    }
    if (knobval > 1) {
      knobval = 1;
    }
    setzitemp=setzitemp + knobval;
    if (setzitemp < 0) {// month must be between 0 and 6
      setzitemp = 0;
    }
    if (setzitemp > 6) {
      setzitemp=6;
    }
    itoa(setzitemp, tmp_string, 10);
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Jour of Week");
  u8g.drawStr(25, 40, tmp_string);
  u8g.drawStr(0,60, daysOfTheWeek[setzitemp]);
  } while( u8g.nextPage() );
    setzi();
}

int setore () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setoretemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
      delay (50);
    }
    if (knobval > 1) {
      knobval = 1;
      delay (50);
    }
    setoretemp=setoretemp + knobval;
    if (setoretemp < 0) {
      setoretemp = 0;
    }
    if (setoretemp > 23) {
      setoretemp=23;
    }
   itoa(setoretemp, tmp_string, 10);  
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Heures");
u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );
    setore();
}

int setmins () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setminstemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
      delay (50);
    }
    if (knobval > 1) {
      knobval = 1;
      delay (50);
    }
    setminstemp=setminstemp + knobval;
    if (setminstemp < 0) {
      setminstemp = 0;
    }
    if (setminstemp > 59) {
      setminstemp=59;
    }
   itoa(setminstemp, tmp_string, 10);  
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Minutes");
u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );
    setmins();
}

 
 
 


#110 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 30 janvier 2020 - 05:38

Bonjour,

 

 

 

La ligne qui actualise la valeur de cpte_pas est "cpte_pas=cpte_pas_cible".

Elle est cohérente avec le fait qu'on parte de la position cpte_pas, puis qu'on effectue (cpte_pas_cible - cpte_pas)  pas : on arrive donc au pas n° cpte_pas + (cpte_pas_cible - cpte_pas) = cpte_pas_cible

 

 

 

Pour l'alternative à l'EEPROM, tu le fait déjà en utilisant certaines variables (déclarées au début du code) un peu partout.

 

Tu as plusieurs options :

1) Les variables globales

#include ... //tu mets ici tes includes

int ma_variable_globale; //déclarée après les includes mais avant la première fonction
//int ma_variable_globale=12;  //alternative en initialisant la variable


int ma_fonction()
{
     //tu peux utiliser ta variable gloable dans toutes les fonctions
     Serial.print(ma_variable_globale);
     ma_variable_globale=3+4;
}

void setup(void)
{
    //tu peux utiliser ta variable globale dans setup
    Serial.print(ma_variable_globale);
    ma_variable_globale=3+4;
}

void loop(void)
{
    //tu peux utiliser ta variable globale dans loop
    Serial.print(ma_variable_globale);
    ma_variable_globale=3+4;
}

2) En passant la valeur de la variable aux fonctions

void ma_fonction_1()
{
   int ma_variable_locale_1=1;
}

int ma_fonction_2_qui_renvoi_une_valeur()
{
   int ma_variable_locale_2=2;
   return ma_variable_locale_2;
}

void ma_fonction_3_qui_utilise_une_valeur_en_entree(int mon_entree_1, float mon_entree_2)
{
    float ma_variable_locale_3=mon_entree_2 / mon_entree_1;
    Serial.print(ma_variable_locale_3);
}

void ma_fonction_4_qui_utilise_une_valeur_retournee()
{
    int ma_variable_locale_3=4;
    ma_variable_locale_4=ma_fonction_2_qui_renvoi_une_valeur(); //ma_variable_locale_3 vaut maintenant 2 : on vient de récupérer une valeur depuis la fonction n°2
    ma_fonction_3_qui_utilise_une_valeur_en_entree(ma_variable_locale_4, 4.4);
}

Danc ce cas, si tu essaye d'utiliser la variable "ma_variable_locale_N" dans une fonction autre que la N, tu optiendra une erreur du compilateur.

Par contre, dans la fonction 3, tu a accès à deux VALEURS données en entrée (ici un int et un float). J'insiste sur le fait qu'il s'agit d'une valeur, et pas de la variable : ce n'est pas car tu donne une variable en argument que tu pourra la modifier depuis la fonction. Plus précisément, il s'agit d'une copie : dans la fonction 3, tu disposera d'une copie des variables ou valeurs passées en entrée (tu peux modifier cette copie (même si c'est pas top coté lisibilité), mais ça ne modifiera pas l'original).

La fonction 4 est particulièrement complète : elle récupère une valeur depuis la fonction 2 et la retransmet à la fonction 3 : c'est ainsi que tu peux transmettre une valeur d'une fonction à une autre sans passer par une variable globale ou par l'EEPROM. Nb : souvent, c'est la fonction loop qui joue directement se rôle (au lieu de fonction 4).

 

3) En passant une référence sur une variable (permet de modifier la variable depuis la fonction) :

void ma_fonction_1(int &ma_reference_1)
{
   //Serial.print(ma_variable); //pas permis : ma_variable n'existe pas sous ce nom ici
   ma_reference_1=ma_reference_1*2+1;
   Serial.print(ma_reference_1);   //vas renvoyer 3*2+1=7 quand appelé depuis ma_fonction_principale
}

void ma_fonction_2(int &ma_reference_2)
{
   ma_reference_2=ma_reference_2*5;
   Serial.print(ma_reference_2);   //vas renvoyer 7*5=35 quand appelé depuis ma_fonction_principale
}

void ma_fonction_principale()
{
    int ma_variable=3;
    Serial.print(ma_variable);  //affiche 3
    ma_fonction_1(ma_variable);
    Serial.print(ma_variable);  //affiche 7
    ma_fonction_2(ma_variable);
    Serial.print(ma_variable);  //affiche 35
}

L'avantage des références est que tu peux passer autant de références que tu veux en argument (alors que la méthode 2 ne permet de renvoyer que 1 argument par fonction). L’inconvénient est que le code est un peu moins lisible
NB : tu notera le signe "&" sur la déclaration des fonctions ma_fonction_1 et 2. C'est lui qui indique qu'il s'agit d'un passage par référence et pas par valeur.

 

4) Par passage de pointeurs : c'est un peu comme les références, sauf que tu peux aussi échanger des objets. Je rentrerais pas dans les détails pour l'instant, tu véra ça une fois que tu aura assimilé les bases des pointeurs.
 

 

 

 

 

Sinon, pour ton code, est-ce que tu pourrais être un peu plus précis sur d'où tu sors tes valeurs (ie quelles lignes sont responsable des valeurs que tu me donne)?

Et est-ce que tu peux aussi me dire si ça affiche ses données une seule fois ou en permance, et le cas échéant si le premier affichage est différent des suivants.

 

Bonne soirée

Sandro

 

PS : je serais pas là de demain fin de matiné jusqu'en milieu de semaine prochaines, donc il est bien possible que je ne réponde pas pendant cette durée (pour demain matin, ça dépendra de si j'ai fini les bagages ou pas)

 

 

 

EDIT : tu es sur que le code que tu as mis compile? Car dans la fonction moteur_go_to_angle, tu as une virgule au lieu d'un point virgule entre les deux Serial.print(ln) qui sont sur la même ligne, et ce deux lignes d'affilé.

Si le code ne compile pas, alors c'est toujours le vieux code qui est exécuté, et du coup c'est normal que le problème soit encore là. (Je chercherais plus en détail si tu me dit que ça compile sans message d'erreur)


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#111 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 30 janvier 2020 - 08:52

Rebonsoir Sandro,

comme je ne suis pas sûr de la valeur de l'EEPROM.update(18,cpte_pas);

j'ai donc fait Serial.print(cpte_pas); et j'ai la même valeur = 255, 

 je ne sais pas d’où vient l'erreur  .

bonne soirée et bonnes vacances .



#112 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 30 janvier 2020 - 09:12

Bonsoir,

tu parles bien du Serial.print(cpte_pas) que tu as mis dans la fonction motor_go_to_angle du dernier code que tu as posté?

 

Et est-ce que tu as vérifié que le code compile (ie ça affiche "téléversement terminé"?

 

Et tu ne m'as pas dit si tu obtiens cette valeur lors du premier affichage, ou uniquement lors des suivants, ou pour tous (ça peut avoir son importance).

 

 

EDIT : je pense que j'ai trouvé d'où viens le 255 : quand tu upload un sketch, ça reset l'EEPROM. Et la valeur par défaut de l'EEPROM, c'est pas 0, mais 255 (ie que des 1 en binaire).

Du coup, je te suggère d'ajouter le code suivant dans le setup, qui servira à chaque fois que tu upload un nouveau code :

if(EEPROM.read(18)==255) {
    EEPROM.update(18,0)
}

NB : ce petit code suppose qu'avant d'updater un nouveau code, tu replace manuellement le moteur en position 0.

 

 

Pour vérifier, j'aimerais bien que tu me donnes les infos suivantes :

- quelle est la première valeur de cpte_pas (normalement 0)

- quelle est la seconde valeur de cpte_pas (normalement la même que cpte_pas_cible)

- est-ce que le moteur se met à la bonne position (à vu d'oeil)

- est ce qu'à minuit (ou pendant la nuit), tu as bien avancé d'une position?

 

Bonne soirée

Sandro
 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#113 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 31 janvier 2020 - 09:42

bonjour Sandro,

oui tout compile normalement .

255 c'est tout le temps ,je vais faire ce que tu m'as demander demain car aujourd'hui je n'aurai pas le temps .

 quand le moteur est arrêter les diodes du driver reste allumées c'est normal ???

tout est ok sauf la lecture Serial.print(cpte_pas)

angle ce matin 360°, donc 64 cpte_cible hier 61 pas donc aujourd'hui le moteur devrais faire 3 pas .

Serial.print (cpte_pas) = 198 ce matin,

 

merci pour ton aide .Michel.



#114 Sandro

Sandro

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 260 messages
  • Gender:Male

Posté 31 janvier 2020 - 10:18

Est-ce que tu peux être un peu plus explicite de qu'est ce  qui affiche quoi quand?

 

Hier Serial.print(cpte_pas) donnait 255, et aujourd'hui ça donne 198, c'est ça?

 

Quand tu parles de "angle", tu parles de la valeur de alfa_1 ou de la position physique du moteur?

 

 

 

Pour les leds, sans connaitre ton module, ça ne me choque pas plus que ça : en effet, les bobines du moteur restent alimentées même quand le moteur ne bouge pas pour pouvoir maintenir la position (en forçant "beaucoup" tu peux quand même déplacer le moteur, mais il ne bougera pas de tout seul ou si tu le touche à peine)


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#115 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 31 janvier 2020 - 11:22

Hier Serial.print(cpte_pas) donnait 255, et aujourd'hui ça donne 198, c'est ça?  oui ,

Quand tu parles de "angle", tu parles de la valeur de alfa_1 ou de la position physique du moteur? de la valeur alfa_1,

j 'avais aussi penser que pour que le moteur ne compte pas plus de 64 pas il faudrait peut-être  > 64 = 0;

pas la peine pour alfa_1 .



#116 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 31 janvier 2020 - 05:00

Bonjour mike118 ,

pourrais tu s'il te plait jeter un coup d’œil à mon programme de turntable .

je n'arrive pas à le réaliser malgré l'aide de Sandro .

il es parti en vacances .

le soucis c'est l'avance du moteur au pas commander .

 alfa_1 =360*now.day()/max_day();// pour 360°* now.day() 1jourdu mois  / maw.day() fevrier 29 jours =12° et en pas 12°/5.625 = 2 pas

ensuite = int cpte_pas_cible = map(alfa_1,0,360,0,64);// ça me calcul pas cible .

ce que je n'arrive pas à faire malgrés l'aide de Sandro c'est de faire avancer le moteur de 2 pas .

je te remerci d'avance .MICHEL.

 
 
void turntable(void) {
  DateTime now = RTC.now();
 
    /* center */
 int x2=128/2;  
 int y2=64/2;  
 /* radius */
 int r2=22;
 /* angle*/
 
 
  alfa_1 =360*now.day()/max_day();// alfa_1 donne l'angle à map qui calcul pour chaque jour un angle et de ce fait des pas .
 
 u8g.setPrintPos(1,60);
 u8g.print(alfa_1);
 
 u8g.setFont(u8g_font_6x10);
 
 u8g.setPrintPos(30,60);
 u8g.print(EEPROM.read(17));//cpte_pas_cible
 u8g.setPrintPos(90,60);
 u8g.print(EEPROM.read(18));//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_go_to_angle(void){
      int cpte_pas = EEPROM.read(18);
      int cpte_pas_cible = map(alfa_1,0,360,0,64);
      EEPROM.update(17,cpte_pas_cible);
      monmoteur.step(cpte_pas_cible - cpte_pas);
      Serial.println("cpte_pas"),Serial.print(cpte_pas);
      Serial.println("cpte_pas_cible"),Serial.print(cpte_pas_cible);                  
      cpte_pas = cpte_pas_cible;
      EEPROM.update(18,cpte_pas);
      
}
 


#117 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 31 janvier 2020 - 06:36

 

Bonjour mike118 ,

pourrais tu s'il te plait jeter un coup d’œil à mon programme de turntable .

je n'arrive pas à le réaliser malgré l'aide de Sandro .

il es parti en vacances .

le soucis c'est l'avance du moteur au pas commander .

 alfa_1 =360*now.day()/max_day();// pour 360°* now.day() 1jourdu mois  / maw.day() fevrier 29 jours =12° et en pas 12°/5.625 = 2 pas

ensuite = int cpte_pas_cible = map(alfa_1,0,360,0,64);// ça me calcul pas cible .

ce que je n'arrive pas à faire malgrés l'aide de Sandro c'est de faire avancer le moteur de 2 pas .

je te remerci d'avance .MICHEL.

 
 
void turntable(void) {
  DateTime now = RTC.now();
 
    /* center */
 int x2=128/2;  
 int y2=64/2;  
 /* radius */
 int r2=22;
 /* angle*/
 
 
  alfa_1 =360*now.day()/max_day();// alfa_1 donne l'angle à map qui calcul pour chaque jour un angle et de ce fait des pas .
 
 u8g.setPrintPos(1,60);
 u8g.print(alfa_1);
 
 u8g.setFont(u8g_font_6x10);
 
 u8g.setPrintPos(30,60);
 u8g.print(EEPROM.read(17));//cpte_pas_cible
 u8g.setPrintPos(90,60);
 u8g.print(EEPROM.read(18));//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_go_to_angle(void){
      int cpte_pas = EEPROM.read(18);
      int cpte_pas_cible = map(alfa_1,0,360,0,64);
      EEPROM.update(17,cpte_pas_cible);
      monmoteur.step(cpte_pas_cible - cpte_pas);
      Serial.println("cpte_pas"),Serial.print(cpte_pas);
      Serial.println("cpte_pas_cible"),Serial.print(cpte_pas_cible);                  
      cpte_pas = cpte_pas_cible;
      EEPROM.update(18,cpte_pas);
      
}
 

 

 

 

Si tu utilises cette fonction dans ton code,

void moteur_avance_2_pas() {
      monmoteur.step(2);      
}

 Est ce que ton moteur avance bien de 2 pas?

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#118 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 01 février 2020 - 11:50

bonjour mike118,

j'ai modifiè le code ,et grand surprise , le moteur ne bouge pas .

je te mets le code pour que tu puisses vérifier que je n'ai rien oubliè .

je te mets également la photo de mon entrainement turntable .

total de la couronne de dents 140 dents combien tu penses que je dois mettre de dents sur l'axe du moteur .

je vais utiliser une couronne parce que j'aimerai utiliser le centre pour l'écoulement de l'eau puisque je vais poser un arbre sur le turntable .

merci pour ton aide ,Michel

#include <Wire.h>
#include "RTClib.h"
#include <Stepper.h>
#include <Encoder.h> // from http://www.pjrc.com/teensy/td_libs_Encoder.html
Encoder knob(3, 4); //encoder connected to pins 2 and 3 (and ground)// D2 SEEDSTUDIO shield
#include <TimeLib.h>
#include <TimeLord.h>
#include <EEPROM.h>
const float LATITUDE = 43.70, LONGITUDE = 7.25; // Nice Sun
const int TIMEZONE = + 1;
int r   = 35;//cercle drawLine
int r_1 = 35;//drawbitmap
int angle = 0;
int x1=57;// drawbitmap rattrapage width  65-8 = 57
int y1=43;// drawbitmap rattrapage height 50-8 = 42
int x0=65;// drawLine
int y0=50;// drawLine
int sun;
int alfa=0;
int degre = 0;
//int backlight = 6; //backlight control pin 6
/* variables stepper */
                                    
const int nbrepas360 = 64;                       // Fixe le nombre de pas pour faire un tour complet, c'est-à-dire 360°.
Stepper monmoteur (nbrepas360, 8, 9, 10, 11);    // Initialise la librairie Stepper.h
//int cptepas = 0 ;
int alfa_1 = 0;
float position_cible;
float degrees_pas = 1;
int cpte_pas_cible;
#define u8g_logo_width 16
#define u8g_logo_height 16

#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
   #define Serial SerialUSB
#endif
RTC_DS1307 RTC;
char daysOfTheWeek[7][12] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};

#include "U8glib.h"
//U8GLIB_ST7920_128X64 u8g(13, 11, 12, U8G_PIN_NONE);//U8GLIB_ST7920_128X64_1X u8g(7, 6, 5 ,8); //Enable, RW, RS, RESET
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);

int Timer = 0;
int Minutt = 0;
int Sekund = 0;
float Vinkel = 0;
int an = 0;
int luna = 0;
int zi = 0;
int zis = 0;

//the variables provide the holding values for the set clock routine
int setyeartemp;
int setmonthtemp;
int setdaytemp;
int setoretemp;
int setzitemp;
int setminstemp;
int setsecs = 0;
 // maximum number of days in the given month
int TimeMins; // number of seconds since midnight
int TimerMode = 2; //mode 0=Off 1=On 2=Auto
int TimeOut = 10;
int TimeOutCounter;

// These variables are for the push button routine
int buttonstate = 0; //flag to see if the button has been pressed, used internal on the subroutine only
int pushlengthset = 1500; // value for a long push in mS
int pushlength = pushlengthset; // set default pushlength
int pushstart = 0;// sets default push value for the button going low
int pushstop = 0;// sets the default value for when the button goes back high

int Sunrise, Sunset; //sunrise and sunset expressed as minute of day (0-1439)
TimeLord myLord; // TimeLord Object, Global variable
byte sunTime[]  = {0, 0, 0, 1, 1, 13}; // 17 Oct 2013
int SunriseHour, SunriseMin, SunsetHour, SunsetMin;
int knobval; // value for the rotation of the knob
boolean buttonflag = false; // default value for the button flag

int backlight = 6;//backlight control pin 6
#include <stdlib.h>
char tmp_string[8];

int max_day(){
  int ma_valeur_de_maxday=0;
    DateTime now = RTC.now();
      
   if (now.month() == 4 || now.month() == 5 || now.month() == 9 || now.month() == 11){  //30 jours =  Septembre, Avril, Juin,  Novembre.
     ma_valeur_de_maxday  = 30;
     }
  else {
     ma_valeur_de_maxday  = 31; //... all the others have 31
    
  }
  if (now.month() == 2 && now.year() % 4 == 0){  //... Exception Fevrier = 28 jours , ou 29 jours année bissextile.
     ma_valeur_de_maxday  = 29;
  }
  if (now.month() == 2 && now.year() % 4 != 0){
     ma_valeur_de_maxday  = 28;
  }
   return ma_valeur_de_maxday;
}
 


void turntable(void) {
  DateTime now = RTC.now();
 
    /* center */
 int x2=128/2;  
 int y2=64/2;  
 /* radius */
 int r2=22;
 /* angle*/
 
 
  alfa_1 =360*now.day()/max_day();
 
 u8g.setPrintPos(1,60);
 u8g.print(alfa_1);
 
 u8g.setFont(u8g_font_6x10);
 
 u8g.setPrintPos(30,60);
 u8g.print(EEPROM.read(17));//cpte_pas_cible
 u8g.setPrintPos(90,60);
 u8g.print(EEPROM.read(18));//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_avance_2_pas() {
      monmoteur.step(2);
            
}

 void draw(void) {
      
      DateTime now = RTC.now();
      
    /*Timelord initialisation*/
    myLord.TimeZone(TIMEZONE * 60);
    myLord.Position(LATITUDE, LONGITUDE);
    sunTime[3] = now.day(); // Give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunRise(sunTime); // Computes Sun Rise.
    Sunrise = sunTime[2] * 60 + sunTime[1]; // Sunrise returned in minutes past midnight
    SunriseHour = sunTime[2];
    SunriseMin = sunTime [1];
    sunTime[3] = now.day(); // Uses the Time library to give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunSet(sunTime); // Computes Sun Set.
    Sunset = sunTime[2] * 60 + sunTime[1]; // Sunset returned in minutes past midnight
    SunsetHour = sunTime[2];
    SunsetMin = sunTime [1];
    u8g.setFont(u8g_font_6x13);   
    u8g.setPrintPos(2,10);
    if (zi < 10) u8g.print("0");
    u8g.print(zi);
    u8g.print("/");
    if (luna < 10) u8g.print("0");
    u8g.print(luna);
    u8g.print("/");
    u8g.setPrintPos(40,10);
    u8g.print(daysOfTheWeek[zis]);

    u8g.setFont(u8g_font_6x13);
    u8g.setPrintPos(80,10);
    if (Timer < 10) u8g.print(" ");
    u8g.print(Timer);
    u8g.setPrintPos(93,10);
    if (Sekund%2 != 1)
    u8g.print(":");
    u8g.setPrintPos(115,10);
    u8g.setFont(u8g_font_6x10);
    if(Sekund<10)u8g.print("0");
    u8g.print(Sekund);
    u8g.setPrintPos(100,10);
    u8g.setFont(u8g_font_6x13);
    if (Minutt < 10) u8g.print("0");
    u8g.print(Minutt);
    TimeMins = (now.hour() * 60) + now.minute();
    
    //u8g.setPrintPos(1,60);
    //u8g.print(EEPROM.read(16));
    
    TimeMins = (now.hour() * 60) + now.minute();
    
    if (TimeMins >= Sunrise && TimeMins <=Sunset-1) { //If it's after sunrise and before sunset, switch our relay on
            digitalWrite (A3, HIGH);// cdt PONT H
            //analogWrite(backlight,255);// lcd rétroéclairage On
            u8g.setColorIndex(1); // Pixel On SH1106
      }
       else {  //otherwise switch it off
            digitalWrite (A3,LOW);// cdt PONT H
            //analogWrite(backlight,0);// lcd rétroéclairage Off
            u8g.setColorIndex(0);// Pixel Off SH1106
     }    
  }
        
        
    
void setup(void) {
   u8g.setContrast(0);//Config the constrast to the best effect
   analogWrite(backlight,255);
      // assign default color value
  if ( u8g.getMode() == U8G_MODE_R3G3B2 )
    u8g.setColorIndex(255);     // white
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
    u8g.setColorIndex(3);         // max intensity
  else if ( u8g.getMode() == U8G_MODE_BW )
    u8g.setColorIndex(1);         // pixel on
    
  Serial.begin(9600);
  Wire.begin();
  if (! RTC.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
   
    RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
    
  }
pinMode(A0,INPUT);//push button on encoder connected to A0 (and GND)
digitalWrite(A0,HIGH); //Pull button high
}

void loop(void) {
    
    u8g.setFont(u8g_font_6x10);
    DateTime now = RTC.now();
    Timer = now.hour(), DEC;
    Minutt = now.minute(), DEC;
    Sekund = now.second(), DEC;
    Serial.print(Timer);
    Serial.print(':');
    Serial.print(Minutt);
    Serial.print(':');
    Serial.print(Sekund);
    Serial.print(" - ");
    an = now.year(), DEC;
    Serial.print(an);
    Serial.print('/');
    luna = now.month(), DEC;
    Serial.print(luna);
    Serial.print('/');
    zi = now.day(), DEC;
    Serial.print(zi);
    Serial.print(" (");
    zis = now.dayOfTheWeek();
    Serial.print(daysOfTheWeek[zis]);
    Serial.println(") ");
    moteur_avance_2_pas();
    
    
           
  /* picture loop*/
  u8g.firstPage();
  do {
    draw();
    turntable();
  } while( u8g.nextPage() );
  // rebuild the picture after some delay
  delay(100);

 pushlength = pushlengthset;
 pushlength = getpushlength();
 delay (10);
 
 if (pushlength < pushlengthset)
 {
  //ShortPush ();   
   Serial.println("short push");
    // picture loop
  u8g.firstPage();
  do {
    draw1();
    
  } while( u8g.nextPage() );
  // rebuild the picture after some delay
  delay(1000);

 }
  //This runs the setclock routine if the knob is pushed for a long time
       if (pushlength > pushlengthset) {
 
  Serial.println("long push");
         DateTime now = RTC.now();
         setyeartemp=now.year(),DEC;
         setmonthtemp=now.month(),DEC;
         setdaytemp=now.day(),DEC;
         setoretemp=now.hour(),DEC;
         setminstemp=now.minute(),DEC;
         setzitemp = now.dayOfTheWeek();
         setclock();
         pushlength = pushlengthset;
       };
 
} // end main loop


// subroutine to return the length of the button push.
int getpushlength()
{
  buttonstate = digitalRead(A0);  
       if(buttonstate == LOW && buttonflag==false) {     
              pushstart = millis();
              buttonflag = true;
          };     
       if (buttonstate == HIGH && buttonflag==true) {
         pushstop = millis ();
         pushlength = pushstop - pushstart;
         buttonflag = false;
       };
        Serial.println("_");
       return pushlength;
}

void draw1(void) {
  u8g.drawStr( 10, 32, "Thx to niq_ro!");
}
//sets the clock
void setclock (){
 
   setyear ();//Annee
   setmonth ();//Mois
   setday ();//Jour
   setzi();//semaine
   setore ();//hours
   setmins ();//Minutes
   RTC.adjust(DateTime(setyeartemp,setmonthtemp,setdaytemp,setoretemp,setminstemp,setsecs));
   CalcSun();
   delay (1000);
}
int CalcSun () { //Calculates the Sunrise and Sunset times
    DateTime now = RTC.now();
    //Timelord initialisation
    myLord.TimeZone(TIMEZONE * 60);
    myLord.Position(LATITUDE, LONGITUDE);
    sunTime[3] = now.day(); // Give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunRise(sunTime); // Computes Sun Rise.
    Sunrise = sunTime[2] * 60 + sunTime[1]; // Sunrise returned in minutes past midnight
    SunriseHour = sunTime[2];
    SunriseMin = sunTime [1];
    sunTime[3] = now.day(); // Uses the Time library to give Timelord the current date
    sunTime[4] = now.month();
    sunTime[5] = now.year();
    myLord.SunSet(sunTime); // Computes Sun Set.
    Sunset = sunTime[2] * 60 + sunTime[1]; // Sunset returned in minutes past midnight
    SunsetHour = sunTime[2];
    SunsetMin = sunTime [1];
    
 
}
// The following subroutines set the individual clock parameters
int setyear () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setyeartemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) { //bit of software de-bounce
      knobval = -1;
      delay (50);
    }
    if (knobval > 1) {
      knobval = 1;
      delay (50);
    }
    setyeartemp=setyeartemp + knobval;
    if (setyeartemp < 2018) { //Year can't be older than currently, it's not a time machine.
      setyeartemp = 2018;
    }
//itoa(setyeartemp - 2000, tmp_string, 10); // https://www.avrfreaks.net/forum/how-do-i-print-variable-u8glib
itoa(setyeartemp, tmp_string, 10); // https://www.avrfreaks.net/forum/how-do-i-print-variable-u8glib
  u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Annee");
//  u8g.drawStr( 0, 40, "20");
  u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );  
    setyear();
}

int setmonth () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setmonthtemp;
    }

 //   lcd.setCursor (0,1);
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
    }
    if (knobval > 1) {
      knobval = 1;
    }
    setmonthtemp=setmonthtemp + knobval;
    if (setmonthtemp < 1) {// month must be between 1 and 12
      setmonthtemp = 1;
    }
    if (setmonthtemp > 12) {
      setmonthtemp=12;
    }
    itoa(setmonthtemp, tmp_string, 10);
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Mois");
  u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );
    setmonth();
}


int setday () {
  int maxdaytemp;
  if (setmonthtemp == 4 || setmonthtemp == 5 || setmonthtemp == 9 || setmonthtemp == 11) { //30 days hath September, April June and November
    maxdaytemp = 30;
  }
  else {
  maxdaytemp = 31; //... all the others have 31
  }
  if (setmonthtemp ==2 && setyeartemp % 4 ==0) { //... Except February alone, and that has 28 days clear, and 29 in a leap year.
    maxdaytemp = 29;
  }
  if (setmonthtemp ==2 && setyeartemp % 4 !=0) {
    maxdaytemp = 28;
  }
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setdaytemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
    }
    if (knobval > 1) {
      knobval = 1;
    }
    setdaytemp = setdaytemp+ knobval;
    if (setdaytemp < 1) {
      setdaytemp = 1;
    }
    if (setdaytemp > maxdaytemp) {
      setdaytemp = maxdaytemp;
    }
  itoa(setdaytemp, tmp_string, 10);  
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Jour");
u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );
    setday();
}


int setzi () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setzitemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
    }
    if (knobval > 1) {
      knobval = 1;
    }
    setzitemp=setzitemp + knobval;
    if (setzitemp < 0) {// month must be between 0 and 6
      setzitemp = 0;
    }
    if (setzitemp > 6) {
      setzitemp=6;
    }
    itoa(setzitemp, tmp_string, 10);
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Jour of Week");
  u8g.drawStr(25, 40, tmp_string);
  u8g.drawStr(0,60, daysOfTheWeek[setzitemp]);
  } while( u8g.nextPage() );
    setzi();
}

int setore () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setoretemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
      delay (50);
    }
    if (knobval > 1) {
      knobval = 1;
      delay (50);
    }
    setoretemp=setoretemp + knobval;
    if (setoretemp < 0) {
      setoretemp = 0;
    }
    if (setoretemp > 23) {
      setoretemp=23;
    }
   itoa(setoretemp, tmp_string, 10);  
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Heures");
u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );
    setore();
}

int setmins () {
    pushlength = pushlengthset;
    pushlength = getpushlength ();
    if (pushlength != pushlengthset) {
      return setminstemp;
    }
    knob.write(0);
    delay (50);
    knobval=knob.read();
    if (knobval < -1) {
      knobval = -1;
      delay (50);
    }
    if (knobval > 1) {
      knobval = 1;
      delay (50);
    }
    setminstemp=setminstemp + knobval;
    if (setminstemp < 0) {
      setminstemp = 0;
    }
    if (setminstemp > 59) {
      setminstemp=59;
    }
   itoa(setminstemp, tmp_string, 10);  
    u8g.firstPage();
  do {
  u8g.drawStr( 0, 20, "Set Minutes");
u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() );
    setmins();
}

 
 
 
 
[attachment=11145:IMG_1680.JPG][attachment=11146:IMG_1681.JPG]


#119 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 01 février 2020 - 12:31

Peux tu poster un code que tu as déjà , et où tu arrives à faire tourner le moteur pas à pas ?

 

 

Concernant le nombre de dents, ça dépend du rapport de réduction que tu souhaites ... Combien de tour devra faire ton moteur pour que le tourne table fasse un tour complet ?


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#120 michel

michel

    Habitué

  • Membres
  • PipPip
  • 179 messages
  • Gender:Male
  • Location:nice

Posté 01 février 2020 - 01:54

j'avais tester mon moteur avec ça

pour le moteur 1 tour c'est juste pour ne pas faire un entrainement direct puisque je suis obliger de décaler le moteur .

merci

/*   Programme permettant de faire tourner l'axe d'un MOTEUR PAP BIPOLAIRE très lentement  (un pas à la fois), de compter et d'afficher via le moniteur série  d'un ordinateur chaque pas effectué.  Le MOTEUR PAP doit être connecté aux broches 8 à 11 de la carte Arduino.  Programme pouvant servir à tester que les 4 fils du moteur sont  bien connectés. Si c'est le cas, le moteur tournera dans le même sens. */

#include <Stepper.h>                                // Permettra d'utilser des fonctions de la librairie externe Stepper.h,
                                                   // librairie spécifique pour contrôler les MOTEURS PAP.
const int nbrepas360 = 2048;                        // Fixe le nombre de pas pour faire un tour complet, c'est-à-dire 360°.
Stepper monmoteur (nbrepas360, 8, 9, 10, 11);    // Initialise la librairie Stepper.h
int cptepas = 0;                                // Stockera le nombre de pas compté.

void setup()
{
  Serial.begin(9600);                    // Ouvre le port de communication en série de la carte et initialise sa vitesse.
                                        // Cela permettra d'envoyer des donnés ou des commandes depuis ou vers
                                       // un ordinateur connecté au port série de la carte Arduino.
  delay (5000);                      // Pause de 5 secondes repérer le début de la boucle.
}

void loop()
{
  monmoteur.step(1);                   // Avance de 1 pas.
  Serial.print("nombre de pas:" );    // Affiche dans le moniteur "série"
  Serial.println(cptepas);           // le nbre de pas effectué.
  cptepas++;                        // Incrémente la variable cptepas pour compter les pas.
  delay(500);                      // Pause d'une demi seconde entre chaque pas.
}





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users