Aller au contenu


Contenu de michel

Il y a 179 élément(s) pour michel (recherche limitée depuis 02-mai 13)



#113668 course du soleil

Posté par michel sur 28 mai 2021 - 05:18 dans Conseils et aide aux débutants, livres et kits en robotique

bonsoir Sandro, Mike,

 je pourrais avoir un avis s'il vous plait sur mon code ,j'ai fait du rangement (j'ai encore laisser des codes en // en attende de suppression  .

j'aimerai avoir aussi s'il vous plait un avis sur une idée .

comme le levée et le couché de la lune s'effectue sur le même jour 20 jour par mois environ et seulement  10 jours a cheval sur deux jours MoonRISE sur un jour et MoonSET sur jour +1 .

je ne sais pas si cela et possible d'avoir tout le temps le couché sur le même jour ( LE CALCUL ) pour moi il calcul a minuit le jour suivant ,du coup quand il passe minuit j'ai  Monset le jour suivant J+1 d'ou la baisse de la PWM LUNE au passage de minuit  ;

d'avance merci pour votre aide .

/* Libraries */
#include <Wire.h>//I2C
#include <SPI.h>//Driver Interface, SPI
#include "RTClib.h"//time clock library 
#include <TimeLib.h>//time 
#include <math.h>//fonctions mathématiques
#include <stdlib.h>//conversion de chaînes de caractères en valeurs numériques
#include <Encoder.h> //Signal Input/Output
#include "U8glib.h"// V 1.17 library ecran oled 
#include <EEPROM.h>//memoire 
#include <TimeLord.h> //Daylight Savings, Moon Phase, Sidereal time, with the SunRise library
#include <Adafruit_Sensor.h>//Adafruit Unified Sensor Driver:
#include <Adafruit_BME280.h>//Humidity, Barometric Pressure + Temp sensor
#include "Arduino.h"
#include <avr/pgmspace.h>

/* Globals */

// Constructors
TimeLord myLord; // TimeLord Object, Global variable
RTC_DS1307 RTC;//Type Rtc
Adafruit_BME280 bme;//CAPTEUR pression 
Encoder knob(2,3);//Sorties CLK(2) et DT(3) SW: bouton-poussoir push(A0)
      


#define pressure_offset 12 // différence entre pression bme280 et pression météo locale 


      /*ECRAN*/
 U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); /*ecran sh1106 I2C*/
//U8GLIB_ST7920_128X64 u8g(13, 11, 12, U8G_PIN_NONE);
//U8GLIB_SSD1309_128X64 u8g(U8G_I2C_OPT_NONE);/*ecran sh1106 I2C*/

    /* Display*/
char daysOfTheWeek[7][12] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};
      /*Boot*/
const uint8_t bonsai_bitmap[] PROGMEM = {

  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, // .................................................................########.......................................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF3,0xF0,0x00,0x00,0x00,0x00,0x00, // ............................................................################..######............................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00, // ........................................................###############################.........................................
  0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00, // ............................................###################################..#######........................................
  0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00, // ...........................................##################################......#####........................................
  0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x7F,0x00,0x00,0x00, // ................................................#################################................#######........................
  0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xF8,0x01,0xFF,0x83,0xE0,0x00, // ..........................................###########################################..........##########.....#####.............
  0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFC,0x19,0xFC,0xFF,0xF0,0x00, // ..........................................############################################.....##..#######..############............
  0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFD,0xFF,0x30,0x3F,0xFF,0xFF,0xE0,0x00, // .............................................#########################.#########..##......#########################.............
  0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xF8,0x00,0x07,0xFF,0xFF,0xFC,0x00,0x00, // ...........................................##########################................#########################..................
  0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFF,0xFC,0xF8,0x00, // ..........................................#########################..............#############################..#####...........
  0x00,0x00,0x00,0x00,0x1C,0x1F,0xFF,0x8F,0x80,0x3F,0xFF,0xFF,0xFF,0xFF,0xF8,0x00, // ...................................###.....##############...#####.........###########################################...........
  0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0x80,0x7F,0xE0,0x00, // ..................................#######################....####################################........##########.............
  0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0x87,0xFF,0xC0,0x03,0xC3,0xE0,0x00,0x00,0x00, // ..................................#######################....#############............####....#####.............................
  0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x0F,0xF0,0x00,0x00,0x01,0xE0,0x00,0x00,0x00, // ........................................################....########...........................####.............................
  0x00,0x00,0x00,0x00,0x01,0xFF,0x87,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // .......................................##########....############...............................................................
  0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0xFF,0x00,0x00,0x00,0x03,0xFC,0x00,0x00,0x00, // ............................................########....########..............................########..........................
  0x00,0x00,0x3F,0xE7,0xDF,0x01,0xF0,0x3F,0xC0,0x00,0x7F,0x07,0xC0,0x07,0xF0,0x00, // ..................#########..#####.#####.......#####......########...............#######.....#####...........#######............
  0x00,0x00,0x1F,0xFF,0xFF,0xF8,0x00,0x1F,0xF8,0x00,0xFF,0xFF,0xFF,0xFF,0xF0,0x00, // ...................##########################..............##########...........####################################............
  0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xE0,0x3F,0xFF,0xFF,0xFF,0xF8,0x00, // .......................##################################.#################.......###################################...........
  0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, // ...................########################################################....#########################################........
  0x00,0xDF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80, // ........##.######.#######################################################################################################.......
  0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80, // .......##################################################################################################################.......
  0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x7F,0xFF,0xFF,0xFF,0xE0,0x00, // ......#################################################################..........##################################.............
  0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0x00, // .......#############################################################..............######################################........
  0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0x0E,0x00, // .........#######################################################...................#############################....###.........
  0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0x87,0xFC,0x03,0xF0,0x00,0x1F,0x0F,0xFC,0x00,0x00, // ...........######################################....#########........######...............#####....##########..................
  0x00,0x3F,0xFF,0xFF,0xC7,0xFF,0x1F,0xF0,0xE3,0xF9,0xE0,0x0E,0x0F,0xFF,0x80,0x00, // ..........########################...###########...#########....###...#######..####.........###.....#############...............
  0x00,0xFF,0xFF,0xF3,0x80,0x00,0x1F,0xC1,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00, // ........####################..###..................#######.....#####################............................................
  0x00,0x7E,0x1F,0xE7,0x80,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00, // .........######....########..####................########################################.......................................
  0x00,0x3E,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00, // ..........#####.................................##########################################......................................
  0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0x0C,0x7C,0x3F,0x03,0xC0,0x00,0x00,0x00,0x00, // ..............................................##########....##...#####....######......####......................................
  0x00,0x00,0x00,0x00,0x00,0x07,0xFC,0x00,0x00,0x07,0xF8,0x00,0x00,0x00,0x00,0x00, // .............................................#########.......................########...........................................
  0x00,0x00,0x00,0x00,0x00,0x07,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // .............................................#########..........................................................................
  0x00,0x00,0x00,0x00,0x00,0x0F,0xFC,0x00,0x00,0x01,0x00,0x00,0x01,0x40,0x00,0x00, // ............................................##########.........................#.......................#.#......................
  0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xC0,0x00,0x01,0x00,0x00,0x00,0x00,0xE0,0x00, // ............................................##############.....................#................................###.............
  0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFC,0x00,0x01,0xC6,0x31,0xCC,0x81,0x10,0x00, // .............................................#################.................###...##...##...###..##..#......#...#............
  0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0x80,0x01,0x29,0x4A,0x12,0x81,0x10,0x00, // ..............................................###################..............#..#.#..#.#..#.#....#..#.#......#...#............
  0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xC0,0x01,0x29,0x49,0x9E,0x81,0x10,0x00, // ....................................................##############.............#..#.#..#.#..#..##..####.#......#...#............
  0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xE0,0x01,0x29,0x48,0x52,0x80,0xA0,0x00, // ......................................................#############............#..#.#..#.#..#....#.#..#.#.......#.#.............
  0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF0,0x00,0xC6,0x4B,0x92,0x91,0xB0,0x00, // .....................................................###############............##...##..#..#.###..#..#.#..#...##.##............
  0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................#####################...........................................................
  0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00, // ...........................##############################################################.......................................
  0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, // ....................############################################################################................................
  0x00,0x00,0x7F,0xE0,0x00,0x1F,0xFF,0xE0,0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00, // .................##########................################...............................##########............................
  0x00,0x00,0x78,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00, // .................####.........#####.............................................................####............................
  0x00,0x00,0x7F,0x73,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x70,0x00,0x00,0x00, // .................#######.###..########..................................................#####....###............................
  0x00,0x00,0x3F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF0,0x00,0x00,0x00, // ..................################...................................................###############............................
  0x00,0x00,0x1F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xE0,0x00,0x00,0x00, // ...................################................................................################.............................
  0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00, // ........................#########################################################################...............................
  0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00, // .........................######################################################################.................................
  0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00, // ...........................##################################################################...................................
  0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00, // .............................#############################################################......................................
  0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // ...............................#########################################################........................................
  0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00, // ...............................########################################################.........................................
  0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00, // ................................#####################################################...........................................
  0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00, // ....................................################################################............................................
  0x00,0x00,0x00,0x00,0x0F,0xC0,0x00,0xFF,0xC0,0x07,0xE0,0x00,0x00,0x00,0x00,0x00, // ....................................######..............##########...........######.............................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  // ................................................................................................................................
};
#define u8g_logo_width 16
#define u8g_logo_height 16 

      /*icones lune*/
static unsigned char u8g_LUNE_QUART_bits[] U8G_PROGMEM = {/* lune quart*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x30, 0x0f, 0x08, 0x1f, 0x08, 0x1f, 0x04, 0x3f, 0x04, 0x3f, 0x04, 0x3f, 0x04, 0x3f, 0x08, 0x1f, 0x08, 0x1f, 0x30, 0x0f, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_premier_croissant_bits[] U8G_PROGMEM = { /* premier croissant*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x30, 0x0c, 0x08, 0x18, 0x08, 0x18, 0x04, 0x38, 0x04, 0x38, 0x04, 0x38, 0x04, 0x38, 0x08, 0x18, 0x08, 0x18, 0x30, 0x0c, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_lune_dernier_croissant_bits[] U8G_PROGMEM = {/*dernier croissant*/ 
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xf0, 0x0f, 0xc8, 0x1f, 0xc8, 0x1f, 0xc4, 0x3f, 0xc4, 0x3f, 0xc4, 0x3f, 0xc4, 0x3f, 0xc8, 0x1f, 0xc8, 0x1f, 0xf0, 0x0f, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_lune_noir_bits[] U8G_PROGMEM = {/*lune noir*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xf0, 0x0f, 0xf8, 0x1f, 0xf8, 0x1f, 0xfc, 0x3f, 0xfc, 0x3f, 0xfc, 0x3f, 0xfc, 0x3f, 0xf8, 0x1f, 0xf8, 0x1f, 0xf0, 0x0f, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_pleine_LUNE_bits[] U8G_PROGMEM = {/*pleine lune*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x30, 0x0c, 0x08, 0x10, 0x08, 0x10, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x08, 0x10, 0x08, 0x10, 0x30, 0x0c, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_premier_decroissant_bits[] U8G_PROGMEM = {/*premier decroissant*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x30, 0x0c, 0x18, 0x10, 0x18, 0x10, 0x1c, 0x20, 0x1c, 0x20, 0x1c, 0x20, 0x1c, 0x20, 0x18, 0x10, 0x18, 0x10, 0x30, 0x0c, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_quartier_decroissant_bits[] U8G_PROGMEM = {/*quartier decroissant*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xf0, 0x0c, 0xf8, 0x10, 0xf8, 0x10, 0xfc, 0x20, 0xfc, 0x20, 0xfc, 0x20, 0xfc, 0x20, 0xf8, 0x10, 0xf8, 0x10, 0xf0, 0x0c, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_dernier_decroissant_bits[] U8G_PROGMEM = {/*dernier decroissant*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xf0, 0x0f, 0xf8, 0x13, 0xf8, 0x13, 0xfc, 0x23, 0xfc, 0x23, 0xfc, 0x23, 0xfc, 0x23, 0xf8, 0x13, 0xf8, 0x13, 0xf0, 0x0f, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
}; 
          /*icones Meteo*/
static unsigned char u8g_orageux_bits[] U8G_PROGMEM = {/*orageux*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x03, 0x10, 0x02, 0x10, 0x3c, 0x1c, 0x20, 0x06, 0x40, 0xc2, 0x43, 0xc2, 0x21, 0xfc, 0x1f, 0xe0, 0x00, 0x60, 0x00, 0x20, 0x00
};  
static unsigned char u8g_ensoleillee_bits[] U8G_PROGMEM = {/*ensoleillee*/
0x10, 0x00, 0x11, 0x01, 0xba, 0x00, 0x44, 0x00, 0xc6, 0x00, 0x64, 0x03, 0x1a, 0x02, 0x11, 0x3c, 0x1c, 0x20, 0x06, 0x40, 0x02, 0x40, 0x02, 0x20, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}; 
static unsigned char u8g_pluie_bits[] U8G_PROGMEM = {/*pluie*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x03, 0x10, 0x02, 0x10, 0x3c, 0x1c, 0x20, 0x06, 0x40, 0x02, 0x40, 0x02, 0x20, 0xfc, 0x1f, 0x00, 0x00, 0x20, 0x09, 0x90, 0x04
};  
static unsigned char u8g_nuageux_bits[] U8G_PROGMEM = {/*nuageux*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x03, 0x10, 0x02, 0x10, 0x3c, 0x1c, 0x20, 0x06, 0x40, 0x02, 0x40, 0x02, 0x20, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_sun_3_bits[] U8G_PROGMEM = {/* course soleil  */
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x90, 0x04, 0xa0, 0x02, 0xc0, 0x01, 0xfc, 0x1f, 0xc0, 0x01, 0xa0, 0x02, 0x90, 0x04, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_Sun_1_bits[] U8G_PROGMEM = {/*Animation Sun_1*/ 
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xe8, 0x0b, 0x10, 0x04, 0x08, 0x08, 0x08, 0x08, 0x0c, 0x18, 0x08, 0x08, 0x08, 0x08, 0x10, 0x04, 0xe8, 0x0b, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_Sun_2_bits[] U8G_PROGMEM = {/* Animation Sun_2*/
0x80, 0x00, 0x82, 0x20, 0x84, 0x10, 0xe8, 0x0b, 0x10, 0x04, 0x08, 0x08, 0x08, 0x08, 0x0f, 0x78, 0x08, 0x08, 0x08, 0x08, 0x10, 0x04, 0xe8, 0x0b, 0x84, 0x10, 0x82, 0x20, 0x80, 0x00, 0x00, 0x00
};
static unsigned char u8g_thermo_bits[] U8G_PROGMEM = {/*thermometre*/
0x00, 0x00, 0x00, 0x01, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x03, 0x80, 0x03, 0xc0, 0x07, 0xe0, 0x0f, 0xe0, 0x0f, 0xe0, 0x0f, 0xc0, 0x07, 0x80, 0x03
};
static unsigned char u8g_humidity_bits[] U8G_PROGMEM = {/*humidity*/
0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x03, 0x80, 0x03, 0xc0, 0x07, 0xc0, 0x07, 0xe0, 0x0f, 0xe0, 0x0f, 0xe0, 0x0f, 0xc0, 0x07, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

// Variables
/*Reglage Clock*/
int Heure = 0;//Timer
int Minute = 0;//Minutt
int Seconde = 0;//Sekund
int Annee = 0;//an
int Mois = 0;//luna
int Jour = 0;//zi 
int Semaine= 0;//zis
/*the variables provide the holding values for the set clock routine*/
int setyeartemp; 
int setmonthtemp;
int setdaytemp;
int setHeuretemp;
int setSemainetemp;//setzitemp
int setminstemp;
int setsecs = 0;
int maxday; // maximum number of days in the given month
int TimeMins; // number of seconds since midnight
int TimeOut = 10;
//int TimeOutCounter;
//int Moon;
int setFuseautemp ;
int setLongitudetemp ;
int setLongitudetemp_1;
int setLatitudetemp ;
int setLatitudetemp_1;
/* state void draw ecran secondaire*/
int state = 0;
int val   = 0;
int old_buttonstate = 0;
/* cercle course du soleil*/
int r   = 35;//cercle drawLine
int r_1 = 35;//rayon drawbitmap
int angle = 0;
int x1=57;// drawbitmap soleil rattrapage width  65-8 = 57
int y1=42;// drawbitmap soleil rattrapage height 50-8 = 42 
int x0=65;
int y0=50; 

//int adresse = 0;
/* variables stepper */
int degre = 0;
int stepper = 0;
int currentDegre = 0;
int currentDegre_1=0;
int degre_1 = 0;
int   numstep;               
/* pin stepper */
const int stepPin = 10;//~digitalwrite
const int dirPin  = 12;//~digitalwrite
const int enPin  = 11;//digitalwrite 
// 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 knobval; // value for the rotation of the knob
boolean buttonflag = false; // default value for the button flag push (A0)
char tmp_string[8];// reglages knob encodeur rotatif
unsigned long  affichage = 15000; // time for display something tpaprindere
unsigned long moment_affichage; // store time
float F_TIMEZONE = 0 ; /* UTC france = +1 Hiver +2 ete */
float F_sunRhour=0,F_sunRmin =0;
float F_LATITUDE = 0,F_LATITUDE_1 = 0,  F_LONGITUDE = 0,F_LONGITUDE_1 = 0;
float F_Long = 0, F_Lat = 0;

//const float LATITUDE = 43.70, LONGITUDE = 7.25; // Nice Sun
String nfm = ""; // days to next full moon
int TIMEZONE ;
int sun,sunRhour, sunRmin;
int SeasonHour,SeasonMin;
int Moon,moonriseHour, moonriseMin, moonsetHour, moonsetMin; 
int nowMin;
int time;
int margeAube,margeCrepuscule;
int heureMidi;
int Sunrise, Sunset,Sun_zenith ;
int SunriseHour, SunriseMin, SunsetHour, SunsetMin,zenithHour,zenithMin,zenith,zenith_Hour,zenith_Min ; 
int minuit_lunaire_Min,lunaire_Min,minuit_lunaire_Hour,lunaire_Hour;
int LATITUDE ,LATITUDE_1, LONGITUDE,LONGITUDE_1, Long,Lat ;
int frameCount = 5;// Nbres de Draw (5)

byte current_season = 0;
byte sea = 0; // switch case saisons
byte sunTime[]  = {0, 0, 0, 1, 1, 13}; 
byte SeasonTime[]={0,0,0,1,1,13};
byte my_Season ;


 

#define PINPWMLUNE 8
int pwmLune = 0;//pwm Bleue
int valeur_Moon = 0;
int pwm2 = 5 ;// pwm Sun Jaune
int valeur_Sun  = 0;
int pwm3 = 9;// pwm Horticole 
//int backlight=6;//backlight control pin 6 "ST7920"  sauf I2C
int overlaysCount = 1;
int frame = 0;// Animation Sun 

//############################# EEPROM ######################################################################################################################################################################################################################################################################
// EEPROM 0 = soil_Min ,EEPROM 10 = soil_Max, EEPROM 1 = VOLUME ,EEPROM  2 = LONGITUDE degrés , EEPROM 3 = LATITUDE degrés, EEPROM 4 = TIMEZONE,EEPROM 5= longitude minutes , EEPROM 6 = LATITUDE minutes ,EEPROM 22 = Degrés stepper, EEPROM 23 = Current_Degrés
//############################# Météo ######################################################################################################################################################################################################################################################################################## 
    unsigned long delayTime;
    String      time_str, weather_text, weather_extra_text;
    int         last_reading_hour, reading_hour, hr_cnt;
    enum image_names { // enumerated table used to point to images
                  rain_img, sunny_img, mostlysunny_img, cloudy_img, tstorms_img,
                 } image;
    enum weather_type {unknown     =  4,//inconnu
                       sunny       =  2,// soleil
                       mostlysunny =  1,//assez ensoleillée
                       cloudy      =  0,// nuageux
                       rain        = -1,//pluie
                       tstorms     = -2 //tempête
                      };
    enum weather_description {GoodClearWeather, BecomingClearer,
                        NoChange, ClearSpells, ClearingWithin12hrs, ClearingAndColder,
                        GettingWarmer, WarmerIn2daysRainLikely,
                        ExpectRain, WarmerRainWithin36hrs, RainIn18hrs, RainHighWindsClearAndCool,
                        GalesHeavyRainSnowInWinter
                        };
    weather_type current_wx; 
                         
/* An array structure to record pressure, temperature, humidity and weather state*/
    typedef struct {
    float pressure;            // air pressure at the designated hour
    float temperature;         // temperature at the designated hour
    float humidity;            // humidity at the designated hour
    weather_type wx_state_1hr; // weather state at 1-hour
    weather_type wx_state_3hr; // weather state at 3-hour point
}   wx_record_type; 

    wx_record_type reading[24]; // An array covering 24-hours to enable P, T, % and Wx state to be recorded for every hour

    int wx_average_1hr, wx_average_3hr; // Indicators of average weather

    bool look_3hr = true;
    bool look_1hr = false;

    float read_pressure(){
    int reading = (bme.readPressure()/100.0F+pressure_offset)*10; // Rounded result to 1-decimal place
    return (float)reading/10;
  }

    /* Convert pressure trend to text*/
    String get_trend_text(float trend){
    String trend_str = "Steady"; // Default weather state
    if (trend > 3.5)                          { trend_str = "Rising fast";  }
    else if (trend >   1.5  && trend <= 3.5)  { trend_str = "Rising";       }
    else if (trend >   0.25 && trend <= 1.5)  { trend_str = "Rising slow";  }
    else if (trend >  -0.25 && trend <  0.25) { trend_str = "Steady";       }
    else if (trend >= -1.5  && trend < -0.25) { trend_str = "Falling slow"; }
    else if (trend >= -3.5  && trend < -1.5)  { trend_str = "Falling";      }
    else if (trend <= -3.5)                   { trend_str = "Falling fast"; }
    return trend_str;
  }
/* Convert forecast text to a corresponding image for display together with a record of the current weather*/
    void ForecastToImgTxt(weather_description wx_text){
    byte sel = 1;
    if      (wx_text == GoodClearWeather)           {image = sunny_img;       current_wx = sunny;        weather_text = "Good clear weather"; sel = 1;}
    else if (wx_text == BecomingClearer)            {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Becoming clearer";sel = 2;}
    else if (wx_text == NoChange)                   {image = cloudy_img;      current_wx = cloudy;       weather_text = "No change, clearing"; sel = 3;}
    else if (wx_text == ClearSpells)                {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Clear spells"; sel = 2;}
    else if (wx_text == ClearingWithin12hrs)        {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Clearing within 12-hrs";sel = 2;}
    else if (wx_text == ClearingAndColder)          {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Clearing and colder";sel = 2;}
    else if (wx_text == GettingWarmer)              {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Getting warmer";sel = 2;}
    else if (wx_text == WarmerIn2daysRainLikely)    {image = rain_img;        current_wx = rain;         weather_text = "Warmer in 2-days, rain likely";sel = 4;}
    else if (wx_text == ExpectRain)                 {image = rain_img;        current_wx = rain;         weather_text = "Expect rain";sel = 2;}
    else if (wx_text == WarmerRainWithin36hrs)      {image = rain_img;        current_wx = rain;         weather_text = "Warmer, rain within 36-hrs";sel = 4;}
    else if (wx_text == RainIn18hrs)                {image = rain_img;        current_wx = rain;         weather_text = "Rain in 18-hrs";sel = 4;}
    else if (wx_text == RainHighWindsClearAndCool)  {image = rain_img;        current_wx = rain;         weather_text = "Rain, high winds, clear and cool";sel = 4;}
    else if (wx_text == GalesHeavyRainSnowInWinter) {image = tstorms_img;     current_wx = tstorms;      weather_text = "Gales, heavy rain, in winter snow";sel = 5;}
  
    /* Select Icon */
      switch (sel) {
    case 1: // Soleil
    valeur_Sun = 255;/*100%*/
    break;
    case 2: // Ensoleillee
    valeur_Sun = 191;/*75%*/     
    break;
    case 3:// Nuageux
    valeur_Sun = 128;/*50%*/    
    break;
    case 4:// Pluie
    valeur_Sun = 128;/*50%*/     
    break;
    case 5:// Tempete
    valeur_Sun = 64;/*25%*/    
     } // .end Switch Select
  }
/* Convert pressure and trend to a weather description either for 1 or 3 hours with the boolean true/false switch*/
    weather_description get_forecast_text(float pressure_now, float trend, bool range) {
    String trend_str = get_trend_text(trend);
    weather_description wx_text = NoChange; //As a default forecast 
    weather_extra_text = "";
    //image = cloudy_img; // Generally when there is 'no change' then cloudy is the conditions
    if (pressure_now >= 1022.68 )                                                          {wx_text = GoodClearWeather;}
    if (pressure_now >= 1022.7  && trend_str  == "Falling fast")                           {wx_text = WarmerRainWithin36hrs;}
    if (pressure_now >= 1013.2  && pressure_now <= 1022.68 && 
     (trend_str == "Steady" || trend_str == "Rising slow"))                              {wx_text = NoChange; (range?wx_history_3hr():wx_history_1hr()); }
    if (pressure_now >= 1013.2 && pressure_now <= 1022.68 &&
     (trend_str == "Rising" || trend_str == "Rising fast"))                              {wx_text = GettingWarmer;}
    if (pressure_now >= 1013.2 && pressure_now <= 1022.68 && trend_str == "Rising slow")   {wx_text = BecomingClearer;}
    if (pressure_now >= 1013.2 && pressure_now <= 1022.68 && 
     (trend_str == "Falling fast" || trend_str == "Faling slow"))                        {wx_text = ExpectRain;}
    if (pressure_now >= 1013.2 && pressure_now <= 1022.68 && trend_str  == "Steady")       {wx_text = ClearSpells; (range?wx_history_3hr():wx_history_1hr());};
    if (pressure_now <= 1013.2 && (trend_str == "Falling slow" || trend_str == "Falling")) {wx_text = RainIn18hrs;}
    if (pressure_now <= 1013.2  &&  trend_str == "Falling fast")                           {wx_text = RainHighWindsClearAndCool;}
    if (pressure_now <= 1013.2  && 
     (trend_str == "Rising" || trend_str=="Rising slow"||trend_str=="Rising fast"))      {wx_text = ClearingWithin12hrs;}
    if (pressure_now <= 1009.14 && trend_str  == "Falling fast")                           {wx_text = GalesHeavyRainSnowInWinter;}
    if (pressure_now <= 1009.14 && trend_str  == "Rising fast")                            {wx_text = ClearingAndColder;}
    return wx_text;
  }

    /* Convert 1-hr weather history to text*/
    void wx_history_1hr() {
    if      (wx_average_1hr >  0) weather_extra_text = ", expect sun";
    else if (wx_average_1hr == 0) weather_extra_text = ", mainly cloudy";
    else if (wx_average_1hr <  0) weather_extra_text = ", expect rain";
    else weather_extra_text = "";
  }

    /* Convert 3-hr weather history to text*/
    void wx_history_3hr() {
    if      (wx_average_3hr >  0) weather_extra_text = ", expect sun";
    else if (wx_average_3hr == 0) weather_extra_text = ", mainly cloudy";
    else if (wx_average_3hr <  0) weather_extra_text = ", expect rain";
    else weather_extra_text = "";
  }
 
    /* Moon Calcul */

    static float Dec[3] = { 0.0, 0.0, 0.0 };
    static float RAn[3] = { 0.0, 0.0, 0.0 };
    static float VHz[3] = { 0.0, 0.0, 0.0 };
    static float Sky[3] = { 0.0, 0.0, 0.0 };
    const static float DR = M_PI / 180;

    static int Rise_time[2] = {0.0, 0.0}; 
    static int Set_time[2] = {0.0, 0.0};

    static bool Moonrise, Moonset;

    /* returns value for sign of argument*/
    float sgn(float x)
    {
    float rv;
    if (x > 0.0)
    rv = 1;
    else if (x < 0.0)
    rv = -1;
    else
    rv = 0;
    return rv;
  }

/* determine Julian day from calendar date (Jean Meeus, "Astronomical Algorithms", Willmann-Bell, 1991)*/

    float julian_day(const int day_const, const int month_const,
      const int year_const)
    {
    float a, b, jd;
    bool gregorian;

    int month = month_const;
    int day = day_const;
    float year = (float) year_const;

    gregorian = (year < 1583) ? 0 : 1;

    if ((month == 1) || (month == 2)) {
    year = year - 1;
    month = month + 12;
    }

    a = floor(year / 100);
    if (gregorian)
    b = 2.0 - a + floor(a / 4.0);
    else
    b = 0.0;

    jd = floor(365.25 * (float)(year + 4716.0))
    + floor(30.6001 * (float)(month + 1))
    + day + b - 1524.5;

    return jd;
  }
    /* moon's position using fundamental arguments  (Van Flandern & Pulkkinen, 1979)*/

    void moon(float jd)
    {


    float d, f, g, h, m, n, s, u, v, w;

    h = 0.606434 + 0.03660110129 * jd;
    m = 0.374897 + 0.03629164709 * jd;
    f = 0.259091 + 0.0367481952 * jd;
    d = 0.827362 + 0.03386319198 * jd;
    n = 0.347343 - 0.00014709391 * jd;
    g = 0.993126 + 0.0027377785 * jd;

    h = h - floor(h);
    m = m - floor(m);
    f = f - floor(f);
    d = d - floor(d);
    n = n - floor(n);
    g = g - floor(g);

    h = h * 2 * M_PI;
    m = m * 2 * M_PI;
    f = f * 2 * M_PI;
    d = d * 2 * M_PI;
    n = n * 2 * M_PI;
    g = g * 2 * M_PI;

    v = 0.39558 * sin(f + n);
    v = v + 0.082 * sin(f);
    v = v + 0.03257 * sin(m - f - n);
    v = v + 0.01092 * sin(m + f + n);
    v = v + 0.00666 * sin(m - f);
    v = v - 0.00644 * sin(m + f - 2 * d + n);
    v = v - 0.00331 * sin(f - 2 * d + n);
    v = v - 0.00304 * sin(f - 2 * d);
    v = v - 0.0024 * sin(m - f - 2 * d - n);
    v = v + 0.00226 * sin(m + f);
    v = v - 0.00108 * sin(m + f - 2 * d);
    v = v - 0.00079 * sin(f - n);
    v = v + 0.00078 * sin(f + 2 * d + n);

    u = 1 - 0.10828 * cos(m);
    u = u - 0.0188 * cos(m - 2 * d);
    u = u - 0.01479 * cos(2 * d);
    u = u + 0.00181 * cos(2 * m - 2 * d);
    u = u - 0.00147 * cos(2 * m);
    u = u - 0.00105 * cos(2 * d - g);
    u = u - 0.00075 * cos(m - 2 * d + g);

    w = 0.10478 * sin(m);
    w = w - 0.04105 * sin(2 * f + 2 * n);
    w = w - 0.0213 * sin(m - 2 * d);
    w = w - 0.01779 * sin(2 * f + n);
    w = w + 0.01774 * sin(n);
    w = w + 0.00987 * sin(2 * d);
    w = w - 0.00338 * sin(m - 2 * f - 2 * n);
    w = w - 0.00309 * sin(g);
    w = w - 0.0019 * sin(2 * f);
    w = w - 0.00144 * sin(m + n);
    w = w - 0.00144 * sin(m - 2 * f - n);
    w = w - 0.00113 * sin(m + 2 * f + 2 * n);
    w = w - 0.00094 * sin(m - 2 * d + g);
    w = w - 0.00092 * sin(2 * m - 2 * d);

    s = w / sqrt(u - v * v);  // compute moon's right ascension ...  
    Sky[0] = h + atan(s / sqrt(1 - s * s));

    s = v / sqrt(u);    // declination ...
    Sky[1] = atan(s / sqrt(1 - s * s));

    Sky[2] = 60.40974 * sqrt(u);  // and parallax
    }

      /* test an hour for an event*/
    float test_moon(int k, float t0, float lat, float plx)
    {

    const static float K1 = 15 * M_PI * 1.0027379 / 180;
    static float Rise_az = 0.0, Set_az = 0.0;

    float ha[3] = { 0.0, 0.0, 0.0 };
    float a, b, c, d, e, s, z;
    float hr, min, time;
    float az, hz, nz, dz;

    if (RAn[2] < RAn[0])
    RAn[2] = RAn[2] + 2 * M_PI;

    ha[0] = t0 - RAn[0] + (k * K1);
    ha[2] = t0 - RAn[2] + (k * K1) + K1;

    ha[1] = (ha[2] + ha[0]) / 2;  // hour angle at half hour
    Dec[1] = (Dec[2] + Dec[0]) / 2; // declination at half hour

    s = sin(DR * lat);
    c = cos(DR * lat);

    /* refraction + sun semidiameter at horizon + parallax correction*/
    z = cos(DR * (90.567 - 41.685 / plx));

    if (k <= 0)     // first call of function
    VHz[0] = s * sin(Dec[0]) + c * cos(Dec[0]) * cos(ha[0]) - z;

    VHz[2] = s * sin(Dec[2]) + c * cos(Dec[2]) * cos(ha[2]) - z;

    if (sgn(VHz[0]) == sgn(VHz[2]))
    return VHz[2];    // no event this hour

    VHz[1] = s * sin(Dec[1]) + c * cos(Dec[1]) * cos(ha[1]) - z;

    a = 2 * VHz[2] - 4 * VHz[1] + 2 * VHz[0];
    b = 4 * VHz[1] - 3 * VHz[0] - VHz[2];
    d = b * b - 4 * a * VHz[0];

    if (d < 0)
    return VHz[2];    /* no event this hour*/

    d = sqrt(d);
    e = (-b + d) / (2 * a);

    if ((e > 1) || (e < 0))
    e = (-b - d) / (2 * a);

    time = ((float) k) + e + 1 / 120; /* time of an event + round up*/
    hr = floor(time);
    min = floor((time - hr) * 60);

    hz = ha[0] + e * (ha[2] - ha[0]); /* azimuth of the moon at the event*/
    nz = -cos(Dec[1]) * sin(hz);
    dz = c * sin(Dec[1]) - s * cos(Dec[1]) * cos(hz);
    az = atan2(nz, dz) / DR;
    if (az < 0)
    az = az + 360;

    if ((VHz[0] < 0) && (VHz[2] > 0)) {
    Rise_time[0] = (int) hr;
    Rise_time[1] = (int) min;
    Rise_az = az;
    Moonrise = 1;
    }

    if ((VHz[0] > 0) && (VHz[2] < 0)) {
    Set_time[0] = (int) hr;
    Set_time[1] = (int) min;
    Set_az = az;
    Moonset = 1;
    }

    return VHz[2];
    }

      /* Local Sidereal Time for zone*/
    float lst(const float lon, const float jd, const float z)
    {
    float s =
    24110.5 + 8640184.812999999 * jd / 36525 + 86636.6 * z +
    86400 * lon;
    s = s / 86400;
    s = s - floor(s);
    return s * 360 * DR;
    }

      /* 3-point interpolation*/
    float interpolate(const float f0, const float f1, const float f2,
       const float p)
    {
    float a = f1 - f0;
    float b = f2 - f1 - a;
    float f = f0 + p * (2 * a + b * (2 * p - 1));

    return f;
    }


        /* calculate moonrise and moonset times*/
    void riseset(const float lat, const float lon, const int day,
       const int month, const int year, const int TIMEZONE )//
    {
    int i, j, k;
    float ph;
    // guido: julian day has been converted to int from float
    // float jd = (julian_day(day, month, year)) - 2451545;  // Julian day relative to Jan 1.5, 2000
    float jd = (julian_day(day, month, year)) - 2451545;  // Julian day relative to Jan 1.5, 2000
    float mp[3][3];
    float lon_local = lon;

    if ((sgn(-TIMEZONE) == sgn(lon)) && (TIMEZONE != 0))//
    Serial.println("WARNING: time zone and longitude are incompatible!");

    for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++)
      mp[i][j] = 0.0;
    }

    lon_local = lon / 360;
    float tz = -((float)TIMEZONE) / 24;
    float t0 = lst(lon_local, jd, tz);  /* local sidereal time*/

    jd = jd + tz;   /* get moon position at start of day*/

    for (k = 0; k < 3; k++) {
    moon(jd);
    mp[k][0] = Sky[0];
    mp[k][1] = Sky[1];
    mp[k][2] = Sky[2];
    jd = jd + 0.5;
    }

    if (mp[1][0] <= mp[0][0])
    mp[1][0] = mp[1][0] + 2 * M_PI;

    if (mp[2][0] <= mp[1][0])
    mp[2][0] = mp[2][0] + 2 * M_PI;

    RAn[0] = mp[0][0];
    Dec[0] = mp[0][1];

    Moonrise = 0;   /* initialize*/
    Moonset = 0;

    for (k = 0; k < 24; k++)  /* check each hour of this day*/
    {
    ph = ((float) (k + 1)) / 24;

    RAn[2] = interpolate(mp[0][0], mp[1][0], mp[2][0], ph);
    Dec[2] = interpolate(mp[0][1], mp[1][1], mp[2][1], ph);

    VHz[2] = test_moon(k, t0, lat, mp[1][2]);

    RAn[0] = RAn[2];  // advance to next hour
    Dec[0] = Dec[2];
    VHz[0] = VHz[2];
    }

}

    float get_phase(const DateTime now, const int TIMEZONE) {/*TZOffset*/
    //float phase = (julian_day(now.day(),now.month(), now.year()) - 2451550.1);
    //float phase = (julian_day(now.day(),now.month(), now.year()) - 2440594.359028);  //CE 1970 January 07 20:37:00.2 UT  Wednesday - new moon
    float phase;
  
    phase = julian_day(now.day(),now.month(), now.year());
    //  phase -= 2455211.8; //CE  2010 January 15 07:12:00.0 UT - new moon
    phase -= 2440594.359028;
    phase += ((now.hour() * 60) + now.minute()) / (float)1440; // Adjust for current time JD returns Midnight. 1140 = minutes in day.
    phase += -((float)TIMEZONE) / 24.0; // Now adjust local to UTC.
    phase = fmod(phase,29.530588853);
    return (phase);
  }


      /* check for no moonrise and/or no moonset*/
    int moon_up(const DateTime now) {
  
    int riseMin=(Rise_time[0]*60)+Rise_time[1];
    int setMin=(Set_time[0]*60)+Set_time[1];
    int nowMin=(now.hour()*60)+now.minute();

    if ((!Moonrise) && (!Moonset)) { // neither moonrise nor moonset
    if (VHz[2] < 0)
      return(0); // down all day
    else
      return(1); // up all day
    }
  
    if (Moonrise && Moonset) {
    if ((setMin > riseMin) && (riseMin < nowMin) && (nowMin < setMin)) {
      return(1); // up
    } 

    if ((setMin < riseMin) && ((nowMin < setMin) || (nowMin > riseMin))) {
      return(1); // up
    } 
  }
  
    if (Moonrise && (!Moonset)) { // Moonrise only
    if (nowMin > riseMin) {
      return(1);
    }
  }
  
    if (Moonset && (!Moonrise)) { // Moonset only
    if (nowMin < setMin) {
      return(1);
    }
  }

    return(0); // if in doubt turn blow it out

}
    int moon_phase(){
    /* calculates the age of the moon phase(0 to 7)*/
    /* there are eight stages, 0 is full moon and 4 is a new moon*/
    DateTime now = RTC.now();  
    double jd = 0; // Julian Date
    double ed = 0; //days elapsed since start of full moon
    int b= 0;
    jd = julianDate(now.year(), now.month(), now.day());
    //jd = julianDate(1972,1,1); // used to debug this is a new moon
    jd = int(jd - 2244116.75); // start at Jan 1 1972
    jd /= 29.53; // divide by the moon cycle    
    b = jd;
    jd -= b; // leaves the fractional part of jd
    ed = jd * 29.53; // days elapsed this month
    nfm = String((int(29.53 - ed))); // days to next full moon
    b = jd*8 +0.5;
    b = b & 7; 
    return b;
   
    }
    double julianDate(int y, int m, int d){
      /* convert a date to a Julian Date}*/
    int mm,yy;
    double k1, k2, k3;
    double j;
  
    yy = y- int((12-m)/10);
    mm = m+9;
    if(mm >= 12) {
    mm = mm-12;
    }
    k1 = 365.25 *(yy +4172);
    k2 = int((30.6001 * mm) + 0.5);
    k3 = int((((yy/100) + 4) * 0.75) -38);
    j = k1 +k2 + d + 59;
    j = j-k3; // j is the Julian date at 12h UT (Universal Time)

    return j;
  }
    void Affichage_Sun(void){
    DateTime now = RTC.now();
    TimeMins = (now.hour() * 60) + now.minute(); 
    if(TimeMins>Sunset&&TimeMins<Sunrise){
          /*Affichage heure Sunrise*/ 
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(80,20);
          if(SunriseHour<10);
          u8g.print("0");
          u8g.print(SunriseHour);
          u8g.print (":");
          if (SunriseMin <10) 
          u8g.print("0");
          u8g.print (SunriseMin);
      }
    if(TimeMins>Sunrise&&TimeMins<heureMidi){
          /* affichage heure zenith*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(80,20 );
          if(zenith_Hour<0)
          u8g.print("0");
          u8g.print(zenith_Hour);
          u8g.print(":");
          if (zenith_Min<10) 
          u8g.print("0");
          u8g.print (zenith_Min);
      }      
     if(TimeMins>heureMidi&&TimeMins>Sunrise){
          /*Affichage heure Sunset*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(80,20);
          if(SunsetHour<10)
          u8g.print("0");
          u8g.print (SunsetHour);
          u8g.print (":"); 
          if (SunsetMin <10) 
          u8g.print("0");
          u8g.print (SunsetMin); 
       }
   }
   
    void drawMoon(void){
      DateTime now = RTC.now(); 
      time = ((now.hour() * 60) + now.minute());
      int mp = moon_phase();
      switch (mp){
      case 0:
      u8g.setFont(u8g_font_04b_03);
      u8g.setPrintPos(2,51);
      valeur_Moon = 255;/* 100% Pleine Lune*/
      break;
      case 1:
      u8g.setFont(u8g_font_04b_03);
      u8g.setPrintPos(2,51);
      valeur_Moon = 191;/* 75% lune gibbeuse croissante*/
      break;
      case 2: 
      u8g.setFont(u8g_font_04b_03);
      u8g.setPrintPos(2,51);
      valeur_Moon = 128;/* 50% premier quartier de lune */
      break; 
      case 3:
      u8g.setFont(u8g_font_04b_03);
      u8g.setPrintPos(2,51);
      valeur_Moon = 64;/* 25%  lune premier croissant*/
      break;
      case 4: 
      u8g.setFont(u8g_font_04b_03);
      u8g.setPrintPos(2,51);
      valeur_Moon = 0;/*0% lune noir */
      break;
      case 5: 
      u8g.setFont(u8g_font_04b_03);
      u8g.setPrintPos(2,51);
      valeur_Moon = 64;/*25%  dernier croissant */
      break;
      case 6:
      u8g.setFont(u8g_font_04b_03);
      u8g.setPrintPos(2,51);
      valeur_Moon = 128;/*50% dernier quartier */
      break;
      case 7:
      u8g.setFont(u8g_font_04b_03);
      u8g.setPrintPos(2,51);
      valeur_Moon = 191;/*75% premier decroissant*/
      break; 
    }
      const char* newNfm = (const char*) nfm.c_str();  
    
  }
    void Affichage_Moon(void){
      DateTime now = RTC.now();
      TimeMins = (now.hour() * 60) + now.minute(); 
      int riseMin=(Rise_time[0]*60)+Rise_time[1];
      int setMin=(Set_time[0]*60)+Set_time[1];
      int  minuitLunaire = (riseMin + setMin)/2 ;
    
      if(TimeMins>Moonset&&TimeMins<Moonrise){
          /*Affichage heure Moonrise*/ 
          u8g.setFont(u8g_font_6x10); 
          u8g.setPrintPos(80,30 );
          if(moonriseHour<10)
          u8g.print("0");
          u8g.print(moonriseHour);
          u8g.print(":");
          if (moonriseMin <10) 
          u8g.print("0");
          u8g.print (moonriseMin);
       }      
      if(TimeMins> Moonrise && TimeMins<minuitLunaire){
    
          /* affichage minuit lunaire*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(80,30 );
          if(lunaire_Hour<0)
          u8g.print("0");
          u8g.print(lunaire_Hour);
          u8g.print(":");
          if (lunaire_Min<10) 
          u8g.print("0");
          u8g.print (lunaire_Min);
         }  
       
      if(TimeMins>minuitLunaire && TimeMins> Moonrise){
      
          /*Affichage heure Moonset*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(80,30);
          if(moonsetHour<10)
          u8g.print("0");
          u8g.print (moonsetHour);
          u8g.print (":"); 
          if (moonsetMin <10) 
          u8g.print("0");
          u8g.print (moonsetMin);
          }
   }
    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];
      int riseMin=(Rise_time[0]*60)+Rise_time[1];
      int setMin=(Set_time[0]*60)+Set_time[1];
      int minuit_lunaire_Min=(riseMin+setMin)/2;
      zenithMin = (Sunset+Sunrise)/2;
      zenith_Min = (zenithMin)%60;
      zenithHour = (Sunset+Sunrise)/2;
      zenith_Hour = (zenithHour)/60;
      minuit_lunaire_Min =(riseMin+setMin)/2;
      lunaire_Min = (minuit_lunaire_Min)%60;
      minuit_lunaire_Hour =(riseMin+setMin)/2;
      lunaire_Hour = (minuit_lunaire_Hour)/60;
      TimeMins = (now.hour() * 60) + now.minute();
      uint16_t time = now.hour() * 60 + now.minute();
      uint16_t angle = map(time, Sunrise, Sunset, 0, 180);
      Affichage_Sun();
      Affichage_Moon();
      setPwmLune(); 
     
    /*evite de depasser l'angle*/ 
      if(angle < 0)
      angle = 0;
      else if(angle > 180) 
      angle = 180;
    //EEPROM.update(13,angle);//Angle du soleil info ecran secondaire
      margeAube = (Sunset - Sunrise)/180*6; /*calcul de la durer de uint16_t angle multiplier par 6° angle Aube Civil*/
      heureMidi = (Sunrise + Sunset)/2;
      margeCrepuscule =(Sunset - Sunrise)/180*6; /*calcul de la durer de uint16_t angle multiplier par 6° angle Crepuscule Civil*/
    /* pwm Sunrise/Sunset Jaune */
      if(TimeMins < heureMidi ){
      pwm2 = map ( TimeMins, Sunrise - margeAube, heureMidi, 0, valeur_Sun);
      }
      else {
      pwm2 = map ( TimeMins, heureMidi, Sunset + margeCrepuscule, valeur_Sun, 0);
      }
      if(pwm2<0) {
      pwm2=0;
      }
      analogWrite(5,pwm2);/* PIN 5 timer 16 bits*/
   
      /* pwm Sunrise/Sunset Horticole */
      if(TimeMins < heureMidi ){
      pwm3 = map ( TimeMins, Sunrise, heureMidi, 0, valeur_Sun);
      }
      else {
      pwm3 = map ( TimeMins, heureMidi, Sunset, valeur_Sun, 0);
      }
      if(pwm3<0) {
      pwm3=0;
      }
      analogWrite(9,pwm3);/* PIN 9 timer 8 bits*/
      myLord.Season(SeasonTime);// Computes Season
      SeasonTime[2]= SeasonHour; 
      SeasonTime[1]= SeasonMin;
      SeasonTime[3] = now.day();
      SeasonTime[4] = now.month();
      SeasonTime[5] = now.year();
      SeasonHour = now.hour();
      SeasonMin =  now.minute();
      /* Computes Season */    
      current_season = myLord.Season(SeasonTime);
      if (current_season == 0){sea=0;}
      if (current_season == 1){sea=1;} 
      if (current_season == 2){sea=2;}
      if (current_season == 3){sea=3;} 
      
      /* Select Icon*/
    
      switch (sea) {
      case 0: // Hiver 
      u8g.setFont(u8g_font_6x10);
      u8g.setPrintPos(75,40); 
      u8g.print("Hiver    ");
      break;
      case 1: // Printemps
      u8g.setFont(u8g_font_6x10);
      u8g.setPrintPos(75,40);
      u8g.print("Printemps");
      break;
      case 2:// Eté
      u8g.setFont(u8g_font_6x10);
      u8g.setPrintPos(75,40);
      u8g.print("Ete      ");
      break;
      case 3:// Automne
      u8g.setFont(u8g_font_6x10);
      u8g.setPrintPos(75,40);
      u8g.print("Automne  ");
    } // .end Switch Select 
    
      /* date  mois jour  */
      u8g.setFont(u8g_font_6x13);   
      u8g.setPrintPos(2,10); 
      if (now.day() < 10) u8g.print("0");
      u8g.print(now.day());
      u8g.print("/");
      if (now.month() < 10) u8g.print("0");
      u8g.print(now.month());
      u8g.print("/");
      u8g.setPrintPos(40,10);
      u8g.print(daysOfTheWeek[Semaine]);//zis
      /*heures ,minutes,secondes et ":"*/
      u8g.setFont(u8g_font_6x13);
      u8g.setPrintPos(80,10);
      if (now.hour() < 10) u8g.print("0");
      u8g.print(now.hour());
      u8g.setPrintPos(92,10);
      if (now.second()%2 != 1)
      u8g.print(":");
      u8g.setPrintPos(112,10);
      u8g.setFont(u8g_font_6x10);
      if(now.second()<10)u8g.print("0");
      u8g.print(now.second());
      u8g.setPrintPos(98,10);
      u8g.setFont(u8g_font_6x13); 
      if (now.minute() < 10) u8g.print("0");
      u8g.print(now.minute());
    
      /* affichage angle Draw_soleil */
      u8g.setFont(u8g_font_6x10);
      u8g.setPrintPos(2,60 );
      u8g.print("angle: ");// soleil
      u8g.setPrintPos(50,60 );
      u8g.print(angle);//soleil
    
      /* Affichage pwm */
      u8g.setFont(u8g_font_6x10);
      u8g.setPrintPos(0,20);
      u8g.print("Sun: ");
      u8g.print(pwm2);
      u8g.setPrintPos(0,40);
      u8g.print("Hort: ");
      u8g.print(pwm3);
    /* affichage angle_Stepper  */ 

      u8g.setFont(u8g_font_6x10);
      u8g.setPrintPos(80,60 );
      u8g.print("st: ");// stepper
      u8g.setPrintPos(100,60 );
      u8g.print(degre);//stepper
    
      TimeMins = (now.hour() * 60) + now.minute();
      /* sunrise ou  sunset, cdt relay on*/
      if (TimeMins >= Sunrise && TimeMins <=Sunset-1) { 
            //digitalWrite (A3, HIGH);// Relay
            //analogWrite(backlight,255);/* cdt rétroéclairage "On" Pin6 st7920*/
            //u8g.setColorIndex(1); /* Pixel On Ecran sh1103*/
      }
       else {  /* cdt relay off*/
            //digitalWrite (A3,LOW);//Relay
            //analogWrite(backlight,0);/* cdt rétroéclairage "Off"Pin6 st7920*/
            //u8g.setColorIndex(0);/* Pixel Off Ecran sh1103*/
       }
  
     /* forecast meteo*/
      reading_hour = now.hour();
      if (reading_hour != last_reading_hour) { // If the hour has advanced, then shift readings left and record new values at array element [23]
      for (int i = 0; i < 23;i++){
      reading[i].pressure     = reading[i+1].pressure;
      reading[i].temperature  = reading[i+1].temperature;
      reading[i].wx_state_1hr = reading[i+1].wx_state_1hr;
      reading[i].wx_state_3hr = reading[i+1].wx_state_3hr;
      }
      reading[23].pressure     = read_pressure(); // Update time=now with current value of pressure
      reading[23].wx_state_1hr = current_wx;
      reading[23].wx_state_3hr = current_wx;
      last_reading_hour        = reading_hour;
      hr_cnt++;
      wx_average_1hr = reading[22].wx_state_1hr + current_wx;           // Used to predict 1-hour forecast extra text
      wx_average_3hr = 0;
      for (int i=23;i >= 21; i--){                                      // Used to predict 3-hour forecast extra text 
      wx_average_3hr = wx_average_3hr + (int)reading[i].wx_state_3hr; // On average the last 3-hours of weather is used for the 'no change' forecast - e.g. more of the same?
      }
      }  

      // ForecastToImgTxt(get_forecast_text(reading[23].pressure, trend, look_3hr));
      //  weather_description wx_text = get_forecast_text(reading[23].pressure, trend, look_3hr);
      reading[23].pressure = (reading[23].pressure + read_pressure())/2; /* 1hr */              // Update rolling average, gets reset on the hour transition
      float  trend = reading[23].pressure - reading[20].pressure;  /* 3hr */                    // Get short-term trend for the last 3-hour
      weather_description wx_text = get_forecast_text(read_pressure(), trend, look_1hr);
      ForecastToImgTxt(wx_text); /* 1hr &3hr*/
 
      /* affichage pression hpa*/
      u8g.setFont(u8g_font_6x10); 
      u8g.setPrintPos(2,50);
      u8g.print("hpa: ");
      u8g.setPrintPos(30,50);
      u8g.print(read_pressure());
          
      }
                   
      int calculPwm( int TimeMins, int riseMin, int setMin) { 
      DateTime now = RTC.now();
      TimeMins =  (now.hour() * 60) + now.minute(); 
      riseMin = Rise_time[0] * 60 + Rise_time[1];
      setMin  = Set_time[0]*60 + Set_time[1];
      int pwm = 0;
      int minuitLunaire = 0; 
      int minuit_lunaire_Min=(riseMin+setMin)/2;
      minuit_lunaire_Min =(riseMin+setMin)/2;
      lunaire_Min = (minuit_lunaire_Min)%60;
      minuit_lunaire_Hour =(riseMin+setMin)/2;
      lunaire_Hour = (minuit_lunaire_Hour)/60;
    
    // gestion du cas où le levé est plus tard que le couché  pour la lune
       if( riseMin > setMin) 
       setMin+= 24 * 60; // ajout de 24h...
              
        if( TimeMins < riseMin )
        TimeMins += 24 * 60; // ajout de 24h...
     // fin de la gestion
  
        minuitLunaire=(riseMin+setMin)/2;
      
        /* phase montante*/
        if(TimeMins > riseMin && TimeMins <minuitLunaire) {//<=au lieu de <
        pwm = map( TimeMins, riseMin,minuitLunaire , 0, valeur_Moon); 
        }

        /* phase descendante */
        if(TimeMins > minuitLunaire && TimeMins < setMin) {
        pwm = map( TimeMins, minuitLunaire, setMin, valeur_Moon, 0); 
        }
    
        return pwm;
      
        }
        void setPwmLune() {
        DateTime now = RTC.now();
        TimeMins = (now.hour() * 60) + now.minute();
        int riseMin = Rise_time[0] * 60 + Rise_time[1]; // Attention variables globales à modifier avec des fonctions...
        int setMin = Set_time[0]*60 + Set_time[1]; // Attention variables globales ...
        int pwmLune = calculPwm ( TimeMins, riseMin, setMin );
        u8g.setFont(u8g_font_6x10);
        u8g.setPrintPos(0,30);
        u8g.print("Lune: ");
        u8g.print(pwmLune);
        analogWrite(PINPWMLUNE, pwmLune);
        }
        void setup(void) {
        draw_Bonsai();//Boot Bitmap logo 
        //analogWrite(backlight, 255);/*Retroeclairage PIN 6 */
        delay(5000);
        Serial.begin(9600);
        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__)));
        }
        /*Timelord initialisation*/
        myLord.TimeZone(TIMEZONE * 60);
        myLord.Position(LATITUDE, LONGITUDE);
        CalcSun ();
        Wire.begin();
        float p,t;
        Serial.println(F("BME280 test"));
        bool status;
    
        /* default settings*/
        status = bme.begin(0x76);  
        if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (isnan(bme.readPressure())) { Serial.println(bme.readPressure());
        } //while (1);
        delayTime = 1000;
        }
        DateTime();
    
        for (int i = 0; i <= 23; i++){ // At the start all array values are the same as a baseline 
        reading[i].pressure     = read_pressure();       // A rounded to 1-decimal place version of pressure
        reading[i].temperature  = bme.readTemperature(); // Although not used, but avialable
        reading[i].humidity     = bme.readHumidity();    // Although not used, but avialable for BMP280
        reading[i].wx_state_1hr = unknown;               // To begin with  
        reading[i].wx_state_3hr = unknown;               // To begin with 
        }                                                  // Note that only 0,5,11,17,20,21,22,23 are used as display positions
        last_reading_hour = reading_hour;
        wx_average_1hr = 0; // Until we get a better idea
        wx_average_3hr = 0; // Until we get a better idea
   
        /* pins assignation*/
        /*push button on encoder connected to A0 (and GND)*/
        pinMode(A0,INPUT);
        digitalWrite(A0,HIGH);
        /* pin PWM Jaune Sun*/  
        pinMode (5,OUTPUT);
        analogWrite(pwm2,LOW);// commande pwm Jaune Sun  
        /* pin PWM bleu lune*/
        pinMode (8,OUTPUT); 
        analogWrite(PINPWMLUNE,LOW);// commande pwm bleu lune PINPWMLUNE
        /* pin pwm horticole*/ 
        pinMode (9,OUTPUT); 
        analogWrite(pwm3,LOW);// commande pwm blanche rouge Horticole
      
        // Pins commande stepper 
        pinMode(stepPin,OUTPUT);//10
        pinMode(dirPin,OUTPUT); //12
        pinMode(enPin,OUTPUT);  //11
        digitalWrite(dirPin,HIGH);
       
        }
        void drawFrame1() {// forescast météo 
        float trend  = reading[23].pressure - reading[20].pressure; /* Trend over the last 3-hours*/
        ForecastToImgTxt(get_forecast_text(reading[23].pressure, trend, look_3hr));/* From forecast and trend determine what image to display*/
        weather_description wx_text = get_forecast_text(read_pressure(), trend, look_1hr);
        reading[23].pressure = (reading[23].pressure + read_pressure())/2; /* 1hr*/
        ForecastToImgTxt(wx_text); 
        byte sel = 1;
        if      (wx_text == GoodClearWeather)           {image = sunny_img;       current_wx = sunny;        weather_text = "Good clear weather"; sel = 1;}
        else if (wx_text == BecomingClearer)            {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Becoming clearer";sel = 2;}
        else if (wx_text == NoChange)                   {image = cloudy_img;      current_wx = cloudy;       weather_text = "No change, clearing"; sel = 3;}
        else if (wx_text == ClearSpells)                {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Clear spells"; sel = 2;}
        else if (wx_text == ClearingWithin12hrs)        {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Clearing within 12-hrs";sel = 2;}
        else if (wx_text == ClearingAndColder)          {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Clearing and colder";sel = 2;}
        else if (wx_text == GettingWarmer)              {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Getting warmer";sel = 2;}
        else if (wx_text == WarmerIn2daysRainLikely)    {image = rain_img;        current_wx = rain;         weather_text = "Warmer in 2-days, rain likely";sel = 4;}
        else if (wx_text == ExpectRain)                 {image = rain_img;        current_wx = rain;         weather_text = "Expect rain";sel = 2;}
        else if (wx_text == WarmerRainWithin36hrs)      {image = rain_img;        current_wx = rain;         weather_text = "Warmer, rain within 36-hrs";sel = 4;}
        else if (wx_text == RainIn18hrs)                {image = rain_img;        current_wx = rain;         weather_text = "Rain in 18-hrs";sel = 4;}
        else if (wx_text == RainHighWindsClearAndCool)  {image = rain_img;        current_wx = rain;         weather_text = "Rain, high winds, clear and cool";sel = 4;}
        else if (wx_text == GalesHeavyRainSnowInWinter) {image = tstorms_img;     current_wx = tstorms;      weather_text = "Gales, heavy rain, in winter snow";sel = 5;}
            /* Select Icon */
        switch (sel) {
        case 1: /* Soleil*/
        u8g.setFont(u8g_font_04b_03);
        u8g.setPrintPos(25,51);
        if(frame==0)
        u8g.drawXBMP(57, 25,u8g_logo_width, u8g_logo_height, u8g_Sun_1_bits );
        else if (frame == 1)
        u8g.drawXBMP(57, 25,u8g_logo_width, u8g_logo_height,u8g_Sun_2_bits  );
        break;
        case 2: /* Ensoleillee*/
        u8g.setFont(u8g_font_04b_03);
        u8g.setPrintPos(25,51);
        u8g.drawXBMP( 57, 25,u8g_logo_width, u8g_logo_height, u8g_ensoleillee_bits);
        break;
        case 3:/* Nuageux*/
        u8g.setFont(u8g_font_04b_03);
        u8g.setPrintPos(25,51);
        u8g.drawXBMP( 57, 25,u8g_logo_width, u8g_logo_height, u8g_nuageux_bits);
        break;
        case 4:/* Pluie*/
        u8g.setFont(u8g_font_04b_03);
        u8g.setPrintPos(25,51);
        u8g.drawXBMP( 57, 25,u8g_logo_width, u8g_logo_height, u8g_pluie_bits);
        break;
        case 5:/* Tempete*/
        u8g.setFont(u8g_font_04b_03);
        u8g.setPrintPos(25,51);
        u8g.drawXBMP( 57, 25,u8g_logo_width, u8g_logo_height, u8g_orageux_bits);
     
        } // .end Switch Select
        }

        void turntable() {
        DateTime now = RTC.now();
  
          // center / 
        int x2=128/2;  
        int y2=64/2;  
          // radius / 
        int r2=22;
          // angle/
        u8g.setFont(u8g_font_6x10);
        u8g.setPrintPos(1,50);
        u8g.print("degre");//turntable
        u8g.setPrintPos(2,60);
        u8g.print(degre);//turntable
        u8g.setPrintPos(99,50);
        u8g.print("steps");
        u8g.setPrintPos(103,60);
        u8g.print(stepper); 
      // affichage position turntable ecran /
        u8g.setFont(u8g_font_6x10);
        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*degre*2*3.14/360), y2-r2*cos(1*degre*2*3.14/360));  
        u8g.drawCircle(x2, y2, r2); 
        }
        void commande(){
        DateTime now = RTC.now();
        int dayOfTheWeek = now.dayOfTheWeek();
        Semaine = now.dayOfTheWeek();//zis
        switch(dayOfTheWeek){
        case 0:
        Serial.println("Dimanche");
        if( daysOfTheWeek[now.dayOfTheWeek()]&& "Dim"){
        degre = 0;// visu table
        degre_1 = degre/2; 
        EEPROM.update(22,degre_1);
        }    
        break;
        case 1:
        Serial.println("Lundi");
        if( daysOfTheWeek[now.dayOfTheWeek()]&& "Lun"){
        degre = 60;//visu table 
        degre_1 = degre/2;
        EEPROM.update(22,degre_1);
        }
        break;
        case 2:
        Serial.println("Mardi");
        if( daysOfTheWeek[now.dayOfTheWeek()]&& "Mar"){
        degre = 120;//visu table 
        degre_1 = degre/2;
        EEPROM.update (22,degre_1);
        }
        break;
        case 3:
        Serial.println("Mercredi");
        if( daysOfTheWeek[now.dayOfTheWeek()]&& "Mer"){
        degre = 180;// visu table
        degre_1 = degre/2;
        EEPROM.update(22,degre_1);
        } 
        break;
        case 4:
        Serial.println("Jeudi");
        if( daysOfTheWeek[now.dayOfTheWeek()]&& "Jeu"){
        degre = 240;// visu table 
        degre_1 = degre/2;
        EEPROM.update(22,degre_1);
        }    
        break;
        case 5:
        Serial.println("Vendredi");
        if( daysOfTheWeek[now.dayOfTheWeek()]&& "Ven"){
        degre = 300;//visu table 
        degre_1= degre/2;
        EEPROM.update(22,degre_1);
        }    
        break;
        case 6:
        Serial.println("Samedi");
        if( daysOfTheWeek[now.dayOfTheWeek()]&& "Sam"){
        degre = 360;//visu table
        degre_1= degre/2;
        EEPROM.update(22,degre_1);
        }
        }
        moteur();//moteur nema 17  
        }
        void moteur(){// stepper nema 17
        DateTime now = RTC.now();
        Semaine = now.dayOfTheWeek();//zis
        int n;
        float stepPerDegre = 0.45; //ajustement pour la couronne dentelée // full step nema = 1.8
        stepper = degre/stepPerDegre;//nbr de steps
        degre_1 = (EEPROM.read(22));
        degre = degre_1*2;
  
        currentDegre_1 =  (EEPROM.read(23)); 
        currentDegre = currentDegre_1*2;// EEPROM maxi 255,currentAngle *2;
  
        if( currentDegre != degre ){
        
        if( currentDegre < degre){

        digitalWrite(dirPin,HIGH);
        digitalWrite(enPin,LOW);
        n = degre - currentDegre;
        numstep = n / stepPerDegre;
        }
        else if( currentDegre > degre){

        digitalWrite(dirPin,LOW);
        digitalWrite(enPin,LOW);
        n = currentDegre - degre;
        if( degre == 0){
        n = currentDegre;
        }
        numstep = n / stepPerDegre;

        }

        for(int x = 0; x < numstep; x++) {
        digitalWrite(stepPin,HIGH);
        delayMicroseconds(800);//1000
        digitalWrite(stepPin,LOW);
        delayMicroseconds(800);
         
        }
        currentDegre_1 = degre_1;
        EEPROM.update(23,currentDegre_1);

        }
        delay(500);
        Serial.println("Deblocage axe");
        digitalWrite( enPin, HIGH ); // logique inversée
        } 

        void loop(void) {
        u8g.setFont(u8g_font_6x10);
        DateTime now = RTC.now();
        int year = now.year();
        int month = now.month();
        int day = now.day();
        int hour = now.hour();
        int minute = now.minute();
        int seconde = now.second(); 
        int riseMin=(Rise_time[0]*60)+Rise_time[1];
        int setMin=(Set_time[0]*60)+Set_time[1];
        TimeMins = (now.hour() * 60) + now.minute();
            /* Variables */
        float F_TIMEZONE    = EEPROM.read(4);
        float F_LATITUDE    = EEPROM.read(3);
        float F_LATITUDE_1  = EEPROM.read(6);
        float F_LONGITUDE   = EEPROM.read(2);
        float F_LONGITUDE_1 = EEPROM.read(5); 
        float F_Long        = EEPROM.read(2)+ (float)(EEPROM.read(5)/100.);
        float F_Lat         = EEPROM.read(3)+ (float)(EEPROM.read(6)/100.);
        TIMEZONE = F_TIMEZONE;
        LATITUDE = F_Lat;
        LONGITUDE= F_Long;
         /*Timelord initialisation*/
        myLord.TimeZone(TIMEZONE * 60);
        myLord.Position(LATITUDE, LONGITUDE);
        /*  Moon Rise initialisation */
        riseset(LATITUDE, LONGITUDE, now.day(), now.month(), now.year(), TIMEZONE);
              /* BME 280 */
        bme.readPressure();
        bme.readTemperature();
        bme.readHumidity();
        Moonset = Set_time[0]*60 + Set_time[1];
        moonsetHour = Set_time[0];
        moonsetMin = Set_time[1];
        Moonrise = Rise_time[0]*60 + Rise_time[1];
        moonriseHour = Rise_time[0];
        moonriseMin = Rise_time[1];
        TimeMins = (now.hour() * 60) + now.minute();
        Heure = now.hour(), DEC;
        Minute = now.minute(), DEC;
        Seconde = now.second(), DEC;
        Annee = now.year(), DEC;//an
        Mois = now.month(), DEC;//Luna
        Jour = now.day(), DEC;//zi 
       // int dayOfTheWeek = now.dayOfTheWeek();
        Semaine = now.dayOfTheWeek();//zis
        commande();
     
    
      
        pushlength = pushlengthset;
        pushlength = getpushlength();
        delay (10);

        if (pushlength < pushlengthset) 
        {
        if((buttonstate == LOW)&&(old_buttonstate==HIGH)){/* anti rebond */
        }
        state = state+1  ;
        if (state > 5) state = 0;    
        delay(10);
        moment_affichage = millis();
        }
        old_buttonstate = val;/*old_buttonstate = buttonstate;*/
    
        if ((millis() - moment_affichage > affichage) and (state != 0))/*delay pour revenir à state 0 moment d'allumage>type d'allumage*/
        {
        state = 0;
        }
    
        if(state == 1){
        draw1();
        }

        if(state == 2){
        draw2();
        }
        if (state == 3){
        draw3();
        }    
        if (state == 4){
        draw4();
        }
        if (state == 5){
        draw5();
        }
        if (state == 0){
        draw0();
        }
  /*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;
         setHeuretemp=now.hour(),DEC;
         setminstemp=now.minute(),DEC;
         setSemainetemp = now.dayOfTheWeek();
         setFuseautemp = EEPROM.read(4);
         setLongitudetemp = EEPROM.read(2);
         setLongitudetemp_1 = EEPROM.read(5);
         setLatitudetemp = EEPROM.read(3);
         setLatitudetemp_1 = EEPROM.read(6);
         setLatitude();
         setLatitude_1();
         setLongitude();
         setLongitude_1();
         setFuseau();
         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 draw0(void) {   // écran principal 
           /* picture loop */
          u8g.firstPage(); 
          do {
          draw();
          drawMoon();// Moon  affichage
         } while( u8g.nextPage() );
          frame ++;
          if(frame>1)
          frame = 0;
     /* rebuild the picture after some delay */
          delay(100);
           
          }
          void draw1(void) {/*écran secondaire Sun */
          u8g.firstPage();
          do {
          drawFrame1() ;
          DateTime now = RTC.now();
          uint16_t time = now.hour() * 60 + now.minute();
          uint16_t angle = map(time, Sunrise, Sunset, 0, 180);
          /*evite de depasser l'angle*/ 
          if(angle < 0)
          angle = 0;
          else if(angle > 180)
          angle = 180;  
          u8g.drawLine(20, 50, 110, 50);/*droite du bas de l'écran*/
          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.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
          //DateTime now = RTC.now();                                                                //x1=57,y1=43,r_1=35,u8g_logo_width = 16,u8g_logo_height = 16,
          CalcSun ();
          myLord.SunRise(sunTime); // Computes Sun Rise.
          myLord.SunSet(sunTime);
           
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,10);
          u8g.print("SunAngle");
          /* affichage heure zenith*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(95,10 );
          if(zenith_Hour<0)
          u8g.print("0");
          u8g.print(zenith_Hour);
          u8g.print(":");
          if (zenith_Min<10) 
          u8g.print("0");
          u8g.print (zenith_Min);
            /*affichage Angle*/
          u8g.setPrintPos(55,62);
          u8g.print(angle);
          u8g.setPrintPos(1,20);
          u8g.print(pwm2);
          u8g.setPrintPos(1,30);
          u8g.print(valeur_Sun); 
        /* levée et couché du soleil*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(5,62);
          if(SunriseHour<10);
          u8g.print("0");
          u8g.print(SunriseHour);
          u8g.print (":");
          if (SunriseMin <10) 
          u8g.print("0");
          u8g.print (SunriseMin);
          u8g.setPrintPos(95,62);
          if(SunsetHour<10)
          u8g.print("0");
          u8g.print (SunsetHour);
          u8g.print (":"); 
          if (SunsetMin <10) 
          u8g.print("0");
          u8g.print (SunsetMin);
         }
          while ( u8g.nextPage() );
          frame ++;
          if(frame>1)
          frame = 0;
     /* rebuild the picture after some delay */
          delay(100);       
          }
           
          void draw2(void){/*écran secondaire LUNE */
            u8g.firstPage();
          do {
          
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(0,10); 
          u8g.print("Moon");
              /*pwm Lune*/
          DateTime now = RTC.now();
          TimeMins = (now.hour() * 60) + now.minute();
          int riseMin = Rise_time[0] * 60 + Rise_time[1]; // Attention variables globales à modifier avec des fonctions...
          int setMin = Set_time[0]*60 + Set_time[1]; // Attention variables globales ...
          int minuitLunaire= 0 ;
          int pwmLune = 0;
          pwmLune = calculPwm ( TimeMins, riseMin, setMin );
          
           
          // gestion du cas où le levé est plus tard que le couché  pour la lune
          if( riseMin > setMin) 
          setMin += 24 * 60; // ajout de 24h...
               
          if( TimeMins < riseMin) 
          TimeMins += 24 * 60; // ajout de 24h...
          minuitLunaire = (riseMin + setMin)/2 ;
        
          //fin de gestion
          u8g.setPrintPos(0,20);
          u8g.print("lune: ");
          u8g.print(pwmLune);
          /*switch case moon*/
          u8g.setPrintPos(0,30);
          u8g.print(valeur_Moon);
          /* affichage minuit lunaire*/
          u8g.setPrintPos(95,10 );
          if(lunaire_Hour<0)
          u8g.print("0");
          u8g.print(lunaire_Hour);
          u8g.print(":");
          if (lunaire_Min<10) 
          u8g.print("0");
          u8g.print (lunaire_Min);
          u8g.setPrintPos(95,30);
          u8g.print(minuitLunaire);
          u8g.setPrintPos(5,62);
          if(moonriseHour<10)
          u8g.print("0");
          u8g.print(moonriseHour);
          u8g.print(":");
          if (moonriseMin <10) 
          u8g.print("0");
          u8g.print (moonriseMin);
          u8g.setPrintPos(95,62);
          if(moonsetHour<10)
          u8g.print("0");
          u8g.print (moonsetHour);
          u8g.print (":"); 
          if (moonsetMin <10) 
          u8g.print("0");
          u8g.print (moonsetMin);
          
          /*switch case phase Moon*/
          int mp = moon_phase();
          switch (mp){
          case 0:
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_pleine_LUNE_bits);
                  
          break;
          case 1:
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_premier_croissant_bits);
                
          break;
          case 2: 
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_LUNE_QUART_bits);
                
          break; 
          case 3:
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_lune_dernier_croissant_bits);
        
          break;
          case 4: 
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height,u8g_lune_noir_bits);
                
          break;
          case 5: 
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_dernier_decroissant_bits);
                
          break;
          case 6:
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_quartier_decroissant_bits);
                
          break;
          case 7:
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_premier_decroissant_bits);
                
          break; 
          }
          const char* newNfm = (const char*) nfm.c_str();  
          } 
          while ( 
          u8g.nextPage() ); 
          }
          void draw3(void) {/*écran secondaire Turntable */
          u8g.firstPage();
          do {
          DateTime now = RTC.now();
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,10); 
          u8g.print("Turntable");
          turntable();
          }     while (
          u8g.nextPage() );
          }  
          void draw4(void) {/*écran secondaire Arrosage*/ 
          u8g.firstPage();
          do {
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,10); 
          u8g.print("Arrosage");
          /* Computes Season */    
          current_season = myLord.Season(SeasonTime);
          if (current_season == 0){sea=0;}
          if (current_season == 1){sea=1;} 
          if (current_season == 2){sea=2;}
          if (current_season == 3){sea=3;} 
           /* Select Icon saisons */
          switch (sea) {
          case 0: /* Hiver*/ 
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,20); 
          u8g.print("Hiver    ");
          break;
          case 1: /* Printemps*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,20);
          u8g.print("Printemps");
          break;
          case 2:/* Eté*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,20);
          u8g.print("Ete      ");
          break;
          case 3:/* Automne*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,20);
          u8g.print("Automne  ");
          } // .end Switch Select 
          } 
        
          while (
          u8g.nextPage() );
                 
          }
          void draw5(void) {/*écran secondaire Reglages*/ 
          u8g.firstPage();
          do {
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,10); 
          u8g.print("Reglages");
          /*Affichage Timezone*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,20);
          u8g.print("utc:"); 
          /*Reglage Timezone*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos( 30,20 );
          u8g.print(EEPROM.read(4));
          /*Affichage Longitude*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,30);
          u8g.print("lon:");
          /*Reglage Longitude*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(30,30 );
          float F_Long =  (EEPROM.read(2))+ (float)(EEPROM.read(5)/100.);
          u8g.print((float)F_Long); 
          /*Affichage Latitude*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,40);
          u8g.print("lat:"); 
          /*Reglage Latitude*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(30,40 );
          float F_Lat =  (EEPROM.read(3))+ (float)(EEPROM.read(6)/100.);
          u8g.print((float)F_Lat);
          } 
           while (
          u8g.nextPage() );
                 
          }
          void draw_Bonsai(void){
            /* picture loop*/
          u8g.firstPage();
          do {
          u8g.drawBitmapP(0, 0, 16, 64, bonsai_bitmap);//Boot Bitmap 
          } while ( u8g.nextPage() );
          /* rebuild the picture after some delay*/
          delay(100);
          }
        
        void setclock (){
   
        /*Timelord initialisation*/
        myLord.TimeZone(TIMEZONE * 60);
        myLord.Position(LATITUDE, LONGITUDE);
        setyear ();//Annee
        setmonth ();//Mois
        setday ();//Jour
        setSemaine();//semaine
        setHeure ();//hours
        setmins ();//Minutes
        RTC.adjust(DateTime(setyeartemp,setmonthtemp,setdaytemp,setHeuretemp,setminstemp,setsecs));
        CalcSun ();
        delay (1000); 
        }
        int setFuseau() {
        pushlength = pushlengthset;
        pushlength = getpushlength ();
        if (pushlength != pushlengthset) {
        return setFuseautemp;
        }
        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);
        }
        setFuseautemp = setFuseautemp + knobval;
        if (setFuseautemp < 1) {/*0*/
        setFuseautemp = 0; 
        }
        if (setFuseautemp > 2) {/*3*/
        setFuseautemp = 3;
        }
        itoa(setFuseautemp, tmp_string, 10);
        EEPROM.update(4,setFuseautemp);
        u8g.firstPage();
        do {
        u8g.setFont(u8g_font_6x10);
        u8g.drawStr( 0, 20, "Set Timezone");
        u8g.drawStr(35, 40, tmp_string);
        } while ( u8g.nextPage() );
        setFuseau();
        }
        int setLongitude() {
        pushlength = pushlengthset;
        pushlength = getpushlength ();
        if (pushlength != pushlengthset) {
        return setLongitudetemp;
        }
        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);
        }
        setLongitudetemp = setLongitudetemp + knobval;
        if (setLongitudetemp < 1) {/*0*/
        setLongitudetemp = 0; 
        }
        if (setLongitudetemp > 99) {/*100*/
        setLongitudetemp = 100;
        }
        itoa(setLongitudetemp, tmp_string, 10);
        EEPROM.update(2,setLongitudetemp);
        u8g.firstPage();
        do {
        u8g.setFont(u8g_font_6x10);
        u8g.drawStr( 0, 20, "Set Longitude Degres");
        u8g.drawStr(35, 40, tmp_string);
        } while ( u8g.nextPage() );
        setLongitude();
        }
        int setLongitude_1() {
        pushlength = pushlengthset;
        pushlength = getpushlength ();
        if (pushlength != pushlengthset) {
        return setLongitudetemp_1;
        }
        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);
        }
        setLongitudetemp_1 = setLongitudetemp_1 + knobval;
        if (setLongitudetemp_1 < 1) {/*0*/
        setLongitudetemp_1 = 0; 
        }
        if (setLongitudetemp_1 > 99) {/*100*/
        setLongitudetemp_1 = 100;
        }
        itoa(setLongitudetemp, tmp_string, 10);
        itoa(setLongitudetemp_1, tmp_string, 10);
        EEPROM.update(2,setLongitudetemp);
        EEPROM.update(5,setLongitudetemp_1);
        u8g.firstPage();
        do {
        u8g.setFont(u8g_font_6x10);
        u8g.drawStr( 0, 20, "Set Longitude Mins");
        u8g.drawStr(35, 40, tmp_string);
        } while ( u8g.nextPage() );
        setLongitude_1();
        }
        int setLatitude() {
        pushlength = pushlengthset;
        pushlength = getpushlength ();
        if (pushlength != pushlengthset) {
        return setLatitudetemp;
        }
        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);
        }
        setLatitudetemp = setLatitudetemp + knobval;
        if (setLatitudetemp < 1) {/*0*/
        setLatitudetemp = 0; 
        }
        if (setLatitudetemp > 99) {/*100*/
        setLatitudetemp = 100;
        }
        itoa(setLatitudetemp, tmp_string, 10);
        EEPROM.update(3,setLatitudetemp);
        u8g.firstPage();
        do {
        u8g.setFont(u8g_font_6x10);
        u8g.drawStr( 0, 20, "Set Latitude Degres");
        u8g.drawStr(35, 40, tmp_string);
        } while ( u8g.nextPage() );
        setLatitude();
        }
        int setLatitude_1() {
        pushlength = pushlengthset;
        pushlength = getpushlength ();
        if (pushlength != pushlengthset) {
        return setLatitudetemp_1;
        }
        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);
        }
        setLatitudetemp_1 = setLatitudetemp_1 + knobval;
        if (setLatitudetemp_1 < 1) {/*0*/
        setLatitudetemp_1 = 0; 
        }
        if (setLatitudetemp_1 > 99) {/*100*/
        setLatitudetemp_1 = 100;
        }
        itoa(setLatitudetemp, tmp_string, 10);
        itoa(setLatitudetemp_1, tmp_string, 10);
        EEPROM.update(3,setLatitudetemp);
        EEPROM.update(6,setLatitudetemp_1);
        u8g.firstPage();
        do {
        u8g.setFont(u8g_font_6x10);
        u8g.drawStr( 0, 20, "Set Latitude Mins");
        u8g.drawStr(35, 40, tmp_string);
        } while ( u8g.nextPage() );
        setLatitude_1();
        }
        int CalcSun () { /*Calculate 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, tmp_string, 10); 
        u8g.firstPage(); 
        do {
        u8g.setFont(u8g_font_6x10);
        u8g.drawStr( 0, 20, "Set Annee");
        u8g.drawStr(25, 40, tmp_string);
        } while( u8g.nextPage() );  
        setyear();
        }

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

        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.setFont(u8g_font_6x10);
        u8g.drawStr( 0, 20, "Set Mois");
        u8g.drawStr(25, 40, tmp_string);
        } while( u8g.nextPage() ); 
        setmonth();
        }

        int setday () {
        if (setmonthtemp == 4 || setmonthtemp == 6 || setmonthtemp == 9 || setmonthtemp == 11) { //30 days hath September, April June and November
        maxday = 30;
        }
        else {
        maxday = 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.
        maxday = 29;
        }
        if (setmonthtemp ==2 && setyeartemp % 4 !=0) {
        maxday = 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 > maxday) {
        setdaytemp = maxday;
        }
        itoa(setdaytemp, tmp_string, 10);  
        u8g.firstPage(); 
        do {
        u8g.setFont(u8g_font_6x10);
        u8g.drawStr( 0, 20, "Set Jour");
        u8g.drawStr(25, 40, tmp_string);
        } while( u8g.nextPage() ); 
        setday();
        }
        int max_day(){
        int ma_valeur_de_maxday=0;
        DateTime now = RTC.now();
      
        if (now.month() == 4 || now.month() == 6 || now.month() == 9 || now.month() == 11){  //30 jours =   Avril, Juin,Septembre,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;
        }

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

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

        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.setFont(u8g_font_6x10);
        u8g.drawStr( 0, 20, "Set Minutes");
        u8g.drawStr(25, 40, tmp_string);
        } while( u8g.nextPage() ); 
        setmins();
        }










#113647 course du soleil

Posté par michel sur 26 mai 2021 - 07:01 dans Conseils et aide aux débutants, livres et kits en robotique

Bonjour Mike , Sandro,

j'avais penser à refaire chaque fonction ( Sun ,Moon, Weather ).

comme cela le code serais plus lisible .

 

sur le point de la  pwm lune . 

il y  avait un truc que je ne comprenais pas au passage de minuit ( avant minuit 23h59 PWM = 220 , et à 00:00 PWM = 159 ,

la j'ai compris au passage de minuit Moon recalcul le SetMin du coup a minuit il recalcul le map .

merci encore pour votre aide . 

bonne journée.




#113642 course du soleil

Posté par michel sur 25 mai 2021 - 05:37 dans Conseils et aide aux débutants, livres et kits en robotique

voila sandro ,

je t'ai mis mon code complet .

merci de m'aider à faire le ménage .

bonne soirée.

#include <Wire.h>
#include <SPI.h>
#include "RTClib.h"
#include <TimeLib.h>
#include <math.h>
#include <stdlib.h>
#include <Encoder.h> 
Encoder knob(2,3);// push(A0)
#include <EEPROM.h>
#include <TimeLord.h> 
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "Arduino.h"
#include "SI114X.h"
#include <avr/pgmspace.h>
#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;
SI114X SI1145 = SI114X();
char daysOfTheWeek[7][12] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};
Adafruit_BME280 bme; 
#define pressure_offset 12 // différence entre pression bme280 et pression météo locale 
int frameCount = 5;
/* library ecran oled */
#include "U8glib.h"// V 1.17
/* différent type d'ecran*/
 U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); /*ecran sh1106 I2C*/
//U8GLIB_ST7920_128X64 u8g(13, 11, 12, U8G_PIN_NONE);
//U8GLIB_SSD1309_128X64 u8g(U8G_I2C_OPT_NONE);

const uint8_t bonsai_bitmap[] PROGMEM = {

  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, // .................................................................########.......................................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF3,0xF0,0x00,0x00,0x00,0x00,0x00, // ............................................................################..######............................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00, // ........................................................###############################.........................................
  0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00, // ............................................###################################..#######........................................
  0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00, // ...........................................##################################......#####........................................
  0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x7F,0x00,0x00,0x00, // ................................................#################################................#######........................
  0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xF8,0x01,0xFF,0x83,0xE0,0x00, // ..........................................###########################################..........##########.....#####.............
  0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFC,0x19,0xFC,0xFF,0xF0,0x00, // ..........................................############################################.....##..#######..############............
  0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFD,0xFF,0x30,0x3F,0xFF,0xFF,0xE0,0x00, // .............................................#########################.#########..##......#########################.............
  0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xF8,0x00,0x07,0xFF,0xFF,0xFC,0x00,0x00, // ...........................................##########################................#########################..................
  0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFF,0xFC,0xF8,0x00, // ..........................................#########################..............#############################..#####...........
  0x00,0x00,0x00,0x00,0x1C,0x1F,0xFF,0x8F,0x80,0x3F,0xFF,0xFF,0xFF,0xFF,0xF8,0x00, // ...................................###.....##############...#####.........###########################################...........
  0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0xFF,0x80,0x7F,0xE0,0x00, // ..................................#######################....####################################........##########.............
  0x00,0x00,0x00,0x00,0x3F,0xFF,0xFF,0x87,0xFF,0xC0,0x03,0xC3,0xE0,0x00,0x00,0x00, // ..................................#######################....#############............####....#####.............................
  0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x0F,0xF0,0x00,0x00,0x01,0xE0,0x00,0x00,0x00, // ........................................################....########...........................####.............................
  0x00,0x00,0x00,0x00,0x01,0xFF,0x87,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // .......................................##########....############...............................................................
  0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0xFF,0x00,0x00,0x00,0x03,0xFC,0x00,0x00,0x00, // ............................................########....########..............................########..........................
  0x00,0x00,0x3F,0xE7,0xDF,0x01,0xF0,0x3F,0xC0,0x00,0x7F,0x07,0xC0,0x07,0xF0,0x00, // ..................#########..#####.#####.......#####......########...............#######.....#####...........#######............
  0x00,0x00,0x1F,0xFF,0xFF,0xF8,0x00,0x1F,0xF8,0x00,0xFF,0xFF,0xFF,0xFF,0xF0,0x00, // ...................##########################..............##########...........####################################............
  0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xE0,0x3F,0xFF,0xFF,0xFF,0xF8,0x00, // .......................##################################.#################.......###################################...........
  0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, // ...................########################################################....#########################################........
  0x00,0xDF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80, // ........##.######.#######################################################################################################.......
  0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80, // .......##################################################################################################################.......
  0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x7F,0xFF,0xFF,0xFF,0xE0,0x00, // ......#################################################################..........##################################.............
  0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0x00, // .......#############################################################..............######################################........
  0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0x0E,0x00, // .........#######################################################...................#############################....###.........
  0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0x87,0xFC,0x03,0xF0,0x00,0x1F,0x0F,0xFC,0x00,0x00, // ...........######################################....#########........######...............#####....##########..................
  0x00,0x3F,0xFF,0xFF,0xC7,0xFF,0x1F,0xF0,0xE3,0xF9,0xE0,0x0E,0x0F,0xFF,0x80,0x00, // ..........########################...###########...#########....###...#######..####.........###.....#############...............
  0x00,0xFF,0xFF,0xF3,0x80,0x00,0x1F,0xC1,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00, // ........####################..###..................#######.....#####################............................................
  0x00,0x7E,0x1F,0xE7,0x80,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00, // .........######....########..####................########################################.......................................
  0x00,0x3E,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00, // ..........#####.................................##########################################......................................
  0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0x0C,0x7C,0x3F,0x03,0xC0,0x00,0x00,0x00,0x00, // ..............................................##########....##...#####....######......####......................................
  0x00,0x00,0x00,0x00,0x00,0x07,0xFC,0x00,0x00,0x07,0xF8,0x00,0x00,0x00,0x00,0x00, // .............................................#########.......................########...........................................
  0x00,0x00,0x00,0x00,0x00,0x07,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // .............................................#########..........................................................................
  0x00,0x00,0x00,0x00,0x00,0x0F,0xFC,0x00,0x00,0x01,0x00,0x00,0x01,0x40,0x00,0x00, // ............................................##########.........................#.......................#.#......................
  0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xC0,0x00,0x01,0x00,0x00,0x00,0x00,0xE0,0x00, // ............................................##############.....................#................................###.............
  0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFC,0x00,0x01,0xC6,0x31,0xCC,0x81,0x10,0x00, // .............................................#################.................###...##...##...###..##..#......#...#............
  0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0x80,0x01,0x29,0x4A,0x12,0x81,0x10,0x00, // ..............................................###################..............#..#.#..#.#..#.#....#..#.#......#...#............
  0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xC0,0x01,0x29,0x49,0x9E,0x81,0x10,0x00, // ....................................................##############.............#..#.#..#.#..#..##..####.#......#...#............
  0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xE0,0x01,0x29,0x48,0x52,0x80,0xA0,0x00, // ......................................................#############............#..#.#..#.#..#....#.#..#.#.......#.#.............
  0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF0,0x00,0xC6,0x4B,0x92,0x91,0xB0,0x00, // .....................................................###############............##...##..#..#.###..#..#.#..#...##.##............
  0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................#####################...........................................................
  0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00, // ...........................##############################################################.......................................
  0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, // ....................############################################################################................................
  0x00,0x00,0x7F,0xE0,0x00,0x1F,0xFF,0xE0,0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00, // .................##########................################...............................##########............................
  0x00,0x00,0x78,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00, // .................####.........#####.............................................................####............................
  0x00,0x00,0x7F,0x73,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x70,0x00,0x00,0x00, // .................#######.###..########..................................................#####....###............................
  0x00,0x00,0x3F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF0,0x00,0x00,0x00, // ..................################...................................................###############............................
  0x00,0x00,0x1F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xE0,0x00,0x00,0x00, // ...................################................................................################.............................
  0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00, // ........................#########################################################################...............................
  0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00, // .........................######################################################################.................................
  0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00, // ...........................##################################################################...................................
  0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00, // .............................#############################################################......................................
  0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // ...............................#########################################################........................................
  0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00, // ...............................########################################################.........................................
  0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00, // ................................#####################################################...........................................
  0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00, // ....................................################################################............................................
  0x00,0x00,0x00,0x00,0x0F,0xC0,0x00,0xFF,0xC0,0x07,0xE0,0x00,0x00,0x00,0x00,0x00, // ....................................######..............##########...........######.............................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ................................................................................................................................
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  // ................................................................................................................................
};
#define u8g_logo_width 16
#define u8g_logo_height 16 

/*icones lune*/
static unsigned char u8g_LUNE_QUART_bits[] U8G_PROGMEM = {/* lune quart*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x30, 0x0f, 0x08, 0x1f, 0x08, 0x1f, 0x04, 0x3f, 0x04, 0x3f, 0x04, 0x3f, 0x04, 0x3f, 0x08, 0x1f, 0x08, 0x1f, 0x30, 0x0f, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_premier_croissant_bits[] U8G_PROGMEM = { /* premier croissant*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x30, 0x0c, 0x08, 0x18, 0x08, 0x18, 0x04, 0x38, 0x04, 0x38, 0x04, 0x38, 0x04, 0x38, 0x08, 0x18, 0x08, 0x18, 0x30, 0x0c, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_lune_dernier_croissant_bits[] U8G_PROGMEM = {/*dernier croissant*/ 
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xf0, 0x0f, 0xc8, 0x1f, 0xc8, 0x1f, 0xc4, 0x3f, 0xc4, 0x3f, 0xc4, 0x3f, 0xc4, 0x3f, 0xc8, 0x1f, 0xc8, 0x1f, 0xf0, 0x0f, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_lune_noir_bits[] U8G_PROGMEM = {/*lune noir*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xf0, 0x0f, 0xf8, 0x1f, 0xf8, 0x1f, 0xfc, 0x3f, 0xfc, 0x3f, 0xfc, 0x3f, 0xfc, 0x3f, 0xf8, 0x1f, 0xf8, 0x1f, 0xf0, 0x0f, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_pleine_LUNE_bits[] U8G_PROGMEM = {/*pleine lune*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x30, 0x0c, 0x08, 0x10, 0x08, 0x10, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x08, 0x10, 0x08, 0x10, 0x30, 0x0c, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_premier_decroissant_bits[] U8G_PROGMEM = {/*premier decroissant*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x30, 0x0c, 0x18, 0x10, 0x18, 0x10, 0x1c, 0x20, 0x1c, 0x20, 0x1c, 0x20, 0x1c, 0x20, 0x18, 0x10, 0x18, 0x10, 0x30, 0x0c, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_quartier_decroissant_bits[] U8G_PROGMEM = {/*quartier decroissant*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xf0, 0x0c, 0xf8, 0x10, 0xf8, 0x10, 0xfc, 0x20, 0xfc, 0x20, 0xfc, 0x20, 0xfc, 0x20, 0xf8, 0x10, 0xf8, 0x10, 0xf0, 0x0c, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_dernier_decroissant_bits[] U8G_PROGMEM = {/*dernier decroissant*/
0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xf0, 0x0f, 0xf8, 0x13, 0xf8, 0x13, 0xfc, 0x23, 0xfc, 0x23, 0xfc, 0x23, 0xfc, 0x23, 0xf8, 0x13, 0xf8, 0x13, 0xf0, 0x0f, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00
}; 
/*icones Meteo*/
static unsigned char u8g_orageux_bits[] U8G_PROGMEM = {/*orageux*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x03, 0x10, 0x02, 0x10, 0x3c, 0x1c, 0x20, 0x06, 0x40, 0xc2, 0x43, 0xc2, 0x21, 0xfc, 0x1f, 0xe0, 0x00, 0x60, 0x00, 0x20, 0x00
};  
static unsigned char u8g_ensoleillee_bits[] U8G_PROGMEM = {/*ensoleillee*/
0x10, 0x00, 0x11, 0x01, 0xba, 0x00, 0x44, 0x00, 0xc6, 0x00, 0x64, 0x03, 0x1a, 0x02, 0x11, 0x3c, 0x1c, 0x20, 0x06, 0x40, 0x02, 0x40, 0x02, 0x20, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}; 
static unsigned char u8g_pluie_bits[] U8G_PROGMEM = {/*pluie*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x03, 0x10, 0x02, 0x10, 0x3c, 0x1c, 0x20, 0x06, 0x40, 0x02, 0x40, 0x02, 0x20, 0xfc, 0x1f, 0x00, 0x00, 0x20, 0x09, 0x90, 0x04
};  
static unsigned char u8g_nuageux_bits[] U8G_PROGMEM = {/*nuageux*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x60, 0x03, 0x10, 0x02, 0x10, 0x3c, 0x1c, 0x20, 0x06, 0x40, 0x02, 0x40, 0x02, 0x20, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_sun_3_bits[] U8G_PROGMEM = {/* course soleil  */
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x90, 0x04, 0xa0, 0x02, 0xc0, 0x01, 0xfc, 0x1f, 0xc0, 0x01, 0xa0, 0x02, 0x90, 0x04, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_Sun_1_bits[] U8G_PROGMEM = {/*Animation Sun_1*/ 
0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xe8, 0x0b, 0x10, 0x04, 0x08, 0x08, 0x08, 0x08, 0x0c, 0x18, 0x08, 0x08, 0x08, 0x08, 0x10, 0x04, 0xe8, 0x0b, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static unsigned char u8g_Sun_2_bits[] U8G_PROGMEM = {/* Animation Sun_2*/
0x80, 0x00, 0x82, 0x20, 0x84, 0x10, 0xe8, 0x0b, 0x10, 0x04, 0x08, 0x08, 0x08, 0x08, 0x0f, 0x78, 0x08, 0x08, 0x08, 0x08, 0x10, 0x04, 0xe8, 0x0b, 0x84, 0x10, 0x82, 0x20, 0x80, 0x00, 0x00, 0x00
};
static unsigned char u8g_thermo_bits[] U8G_PROGMEM = {/*thermometre*/
0x00, 0x00, 0x00, 0x01, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x03, 0x80, 0x03, 0xc0, 0x07, 0xe0, 0x0f, 0xe0, 0x0f, 0xe0, 0x0f, 0xc0, 0x07, 0x80, 0x03
};
static unsigned char u8g_humidity_bits[] U8G_PROGMEM = {/*humidity*/
0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x03, 0x80, 0x03, 0xc0, 0x07, 0xc0, 0x07, 0xe0, 0x0f, 0xe0, 0x0f, 0xe0, 0x0f, 0xc0, 0x07, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

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;
int maxday; // 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;
int Moon;
int setFuseautemp ;
int setLongitudetemp ;
int setLongitudetemp_1;
int setLatitudetemp ;
int setLatitudetemp_1;
/* state void draw ecran secondaire*/
int state = 0;
int val   =0;
int old_buttonstate = 0;
/* cercle course du soleil*/
int r =35;//cercle drawLine
int r_1 = 35;//drawbitmap
int angle = 0;
int x1=57;// drawbitmap soleil rattrapage width  65-8 = 57
int y1=42;// drawbitmap soleil rattrapage height 50-8 = 42 
int x0=65;
int y0=50; 
int sun;
int adresse = 0;
/* variables stepper */
int degre = 0;
int stepper = 0;
int currentDegre = 0;
int currentDegre_1=0;
int degre_1 = 0;
int   numstep;               
/* pin stepper */
const int stepPin = 10;//~digitalwrite
const int dirPin  = 12;//~digitalwrite
const int enPin  = 11;//digitalwrite 
// 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 knobval; // value for the rotation of the knob
boolean buttonflag = false; // default value for the button flag
char tmp_string[8];
unsigned long tpaprindere = 15000; // time for display something
unsigned long momentaprindere; // store time
float F_TIMEZONE = 0 ; /* UTC france = +1 Hiver +2 ete */
int TIMEZONE ;
float F_sunRhour=0,F_sunRmin =0;
int sunRhour, sunRmin;
float F_LATITUDE = 0,F_LATITUDE_1 = 0,  F_LONGITUDE = 0,F_LONGITUDE_1 = 0;
float F_Long = 0, F_Lat = 0;
int LATITUDE ,LATITUDE_1, LONGITUDE,LONGITUDE_1, Long,Lat ;
//const float LATITUDE = 43.70, LONGITUDE = 7.25; // Nice Sun
String nfm = ""; // days to next full moon
int moonriseHour, moonriseMin, moonsetHour, moonsetMin; 
int nowMin;
int time;
int margeAube,margeCrepuscule;
int heureMidi;
int Sunrise, Sunset,Sun_zenith ; 
int minuit_lunaire_Min,lunaire_Min,minuit_lunaire_Hour,lunaire_Hour;
TimeLord myLord; // TimeLord Object, Global variable
byte current_season = 0;
byte sea = 0; // switch case saisons 
byte SeasonTime[]={0,0,0,1,1,13};
byte my_Season ;
int SeasonHour,SeasonMin;
byte sunTime[]  = {0, 0, 0, 1, 1, 13}; // 17 Oct 2013
int SunriseHour, SunriseMin, SunsetHour, SunsetMin,zenithHour,zenithMin,zenith,zenith_Hour,zenith_Min ; 

#define PINPWMLUNE 8
int pwmLune = 0;
int valeur_Moon = 0;
int pwm2 = 5 ;// pwm Sun
int valeur_Sun  = 0;
int pwm3 = 9;// pwm Horticole 
//int backlight=6;//backlight control pin 6 "ST7920"  sauf I2C
int overlaysCount = 1;
int frame = 0;// Animation Sun 

//############################# EEPROM ######################################################################################################################################################################################################################################################################
// EEPROM 0 = soil_Min ,EEPROM 10 = soil_Max, EEPROM 1 = VOLUME ,EEPROM  2 = LONGITUDE degrés , EEPROM 3 = LATITUDE degrés, EEPROM 4 = TIMEZONE,EEPROM 5= longitude minutes , EEPROM 6 = LATITUDE minutes ,EEPROM 13 = angle soleil,EEPROM 22 = Degrés stepper, EEPROM 23 = Current_Degrés
//############################# Météo ######################################################################################################################################################################################################################################################################################## 
unsigned long delayTime;
String      time_str, weather_text, weather_extra_text;
int         last_reading_hour, reading_hour, hr_cnt;
enum image_names { // enumerated table used to point to images
                  rain_img, sunny_img, mostlysunny_img, cloudy_img, tstorms_img,
                 } image;
enum weather_type {unknown     =  4,//inconnu
                   sunny       =  2,// soleil
                   mostlysunny =  1,//assez ensoleillée
                   cloudy      =  0,// nuageux
                   rain        = -1,//pluie
                   tstorms     = -2 //tempête
                   };
enum weather_description {GoodClearWeather, BecomingClearer,
                          NoChange, ClearSpells, ClearingWithin12hrs, ClearingAndColder,
                          GettingWarmer, WarmerIn2daysRainLikely,
                          ExpectRain, WarmerRainWithin36hrs, RainIn18hrs, RainHighWindsClearAndCool,
                          GalesHeavyRainSnowInWinter
                          };
weather_type current_wx; 
                         
/* An array structure to record pressure, temperature, humidity and weather state*/
  typedef struct {
  float pressure;            // air pressure at the designated hour
  float temperature;         // temperature at the designated hour
  float humidity;            // humidity at the designated hour
  weather_type wx_state_1hr; // weather state at 1-hour
  weather_type wx_state_3hr; // weather state at 3-hour point
} wx_record_type; 

wx_record_type reading[24]; // An array covering 24-hours to enable P, T, % and Wx state to be recorded for every hour

int wx_average_1hr, wx_average_3hr; // Indicators of average weather

bool look_3hr = true;
bool look_1hr = false;

float read_pressure(){
  int reading = (bme.readPressure()/100.0F+pressure_offset)*10; // Rounded result to 1-decimal place
  return (float)reading/10;
}

/* Convert pressure trend to text*/
String get_trend_text(float trend){
  String trend_str = "Steady"; // Default weather state
  if (trend > 3.5)                          { trend_str = "Rising fast";  }
  else if (trend >   1.5  && trend <= 3.5)  { trend_str = "Rising";       }
  else if (trend >   0.25 && trend <= 1.5)  { trend_str = "Rising slow";  }
  else if (trend >  -0.25 && trend <  0.25) { trend_str = "Steady";       }
  else if (trend >= -1.5  && trend < -0.25) { trend_str = "Falling slow"; }
  else if (trend >= -3.5  && trend < -1.5)  { trend_str = "Falling";      }
  else if (trend <= -3.5)                   { trend_str = "Falling fast"; }
  return trend_str;
}
/* Convert forecast text to a corresponding image for display together with a record of the current weather*/
void ForecastToImgTxt(weather_description wx_text){
  byte sel = 1;
  if      (wx_text == GoodClearWeather)           {image = sunny_img;       current_wx = sunny;        weather_text = "Good clear weather"; sel = 1;}
  else if (wx_text == BecomingClearer)            {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Becoming clearer";sel = 2;}
  else if (wx_text == NoChange)                   {image = cloudy_img;      current_wx = cloudy;       weather_text = "No change, clearing"; sel = 3;}
  else if (wx_text == ClearSpells)                {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Clear spells"; sel = 2;}
  else if (wx_text == ClearingWithin12hrs)        {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Clearing within 12-hrs";sel = 2;}
  else if (wx_text == ClearingAndColder)          {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Clearing and colder";sel = 2;}
  else if (wx_text == GettingWarmer)              {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Getting warmer";sel = 2;}
  else if (wx_text == WarmerIn2daysRainLikely)    {image = rain_img;        current_wx = rain;         weather_text = "Warmer in 2-days, rain likely";sel = 4;}
  else if (wx_text == ExpectRain)                 {image = rain_img;        current_wx = rain;         weather_text = "Expect rain";sel = 2;}
  else if (wx_text == WarmerRainWithin36hrs)      {image = rain_img;        current_wx = rain;         weather_text = "Warmer, rain within 36-hrs";sel = 4;}
  else if (wx_text == RainIn18hrs)                {image = rain_img;        current_wx = rain;         weather_text = "Rain in 18-hrs";sel = 4;}
  else if (wx_text == RainHighWindsClearAndCool)  {image = rain_img;        current_wx = rain;         weather_text = "Rain, high winds, clear and cool";sel = 4;}
  else if (wx_text == GalesHeavyRainSnowInWinter) {image = tstorms_img;     current_wx = tstorms;      weather_text = "Gales, heavy rain, in winter snow";sel = 5;}
  
    /* Select Icon */
      switch (sel) {
    case 1: // Soleil
    valeur_Sun = 255;/*100%*/
      break;
    case 2: // Ensoleillee
    valeur_Sun = 191;/*75%*/     
      break;
    case 3:// Nuageux
    valeur_Sun = 128;/*50%*/    
      break;
    case 4:// Pluie
    valeur_Sun = 128;/*50%*/     
       break;
    case 5:// Tempete
    valeur_Sun = 64;/*25%*/    
     } // .end Switch Select
}

/* Convert pressure and trend to a weather description either for 1 or 3 hours with the boolean true/false switch*/
  weather_description get_forecast_text(float pressure_now, float trend, bool range) {
  String trend_str = get_trend_text(trend);
  weather_description wx_text = NoChange; //As a default forecast 
  weather_extra_text = "";
  //image = cloudy_img; // Generally when there is 'no change' then cloudy is the conditions
  if (pressure_now >= 1022.68 )                                                          {wx_text = GoodClearWeather;}
  if (pressure_now >= 1022.7  && trend_str  == "Falling fast")                           {wx_text = WarmerRainWithin36hrs;}
  if (pressure_now >= 1013.2  && pressure_now <= 1022.68 && 
     (trend_str == "Steady" || trend_str == "Rising slow"))                              {wx_text = NoChange; (range?wx_history_3hr():wx_history_1hr()); }
  if (pressure_now >= 1013.2 && pressure_now <= 1022.68 &&
     (trend_str == "Rising" || trend_str == "Rising fast"))                              {wx_text = GettingWarmer;}
  if (pressure_now >= 1013.2 && pressure_now <= 1022.68 && trend_str == "Rising slow")   {wx_text = BecomingClearer;}
  if (pressure_now >= 1013.2 && pressure_now <= 1022.68 && 
     (trend_str == "Falling fast" || trend_str == "Faling slow"))                        {wx_text = ExpectRain;}
  if (pressure_now >= 1013.2 && pressure_now <= 1022.68 && trend_str  == "Steady")       {wx_text = ClearSpells; (range?wx_history_3hr():wx_history_1hr());};
  if (pressure_now <= 1013.2 && (trend_str == "Falling slow" || trend_str == "Falling")) {wx_text = RainIn18hrs;}
  if (pressure_now <= 1013.2  &&  trend_str == "Falling fast")                           {wx_text = RainHighWindsClearAndCool;}
  if (pressure_now <= 1013.2  && 
     (trend_str == "Rising" || trend_str=="Rising slow"||trend_str=="Rising fast"))      {wx_text = ClearingWithin12hrs;}
  if (pressure_now <= 1009.14 && trend_str  == "Falling fast")                           {wx_text = GalesHeavyRainSnowInWinter;}
  if (pressure_now <= 1009.14 && trend_str  == "Rising fast")                            {wx_text = ClearingAndColder;}
  return wx_text;
}

/* Convert 1-hr weather history to text*/
void wx_history_1hr() {
  if      (wx_average_1hr >  0) weather_extra_text = ", expect sun";
  else if (wx_average_1hr == 0) weather_extra_text = ", mainly cloudy";
  else if (wx_average_1hr <  0) weather_extra_text = ", expect rain";
  else weather_extra_text = "";
}

/* Convert 3-hr weather history to text*/
void wx_history_3hr() {
  if      (wx_average_3hr >  0) weather_extra_text = ", expect sun";
  else if (wx_average_3hr == 0) weather_extra_text = ", mainly cloudy";
  else if (wx_average_3hr <  0) weather_extra_text = ", expect rain";
  else weather_extra_text = "";
}
/* Moon Calcul */

static float Dec[3] = { 0.0, 0.0, 0.0 };
static float RAn[3] = { 0.0, 0.0, 0.0 };
static float VHz[3] = { 0.0, 0.0, 0.0 };
static float Sky[3] = { 0.0, 0.0, 0.0 };
const static float DR = M_PI / 180;

static int Rise_time[2] = {0.0, 0.0}; 
static int Set_time[2] = {0.0, 0.0};

static bool Moonrise, Moonset;

/* returns value for sign of argument*/
float sgn(float x)
{
    float rv;
    if (x > 0.0)
  rv = 1;
    else if (x < 0.0)
  rv = -1;
    else
  rv = 0;
    return rv;
}

/* determine Julian day from calendar date (Jean Meeus, "Astronomical Algorithms", Willmann-Bell, 1991)*/

float julian_day(const int day_const, const int month_const,
      const int year_const)
{
    float a, b, jd;
    bool gregorian;

    int month = month_const;
    int day = day_const;
    float year = (float) year_const;

    gregorian = (year < 1583) ? 0 : 1;

    if ((month == 1) || (month == 2)) {
  year = year - 1;
  month = month + 12;
    }

    a = floor(year / 100);
    if (gregorian)
  b = 2.0 - a + floor(a / 4.0);
    else
  b = 0.0;

    jd = floor(365.25 * (float)(year + 4716.0))
  + floor(30.6001 * (float)(month + 1))
  + day + b - 1524.5;

    return jd;
}
/* moon's position using fundamental arguments  (Van Flandern & Pulkkinen, 1979)*/

void moon(float jd)
{


  float d, f, g, h, m, n, s, u, v, w;

    h = 0.606434 + 0.03660110129 * jd;
    m = 0.374897 + 0.03629164709 * jd;
    f = 0.259091 + 0.0367481952 * jd;
    d = 0.827362 + 0.03386319198 * jd;
    n = 0.347343 - 0.00014709391 * jd;
    g = 0.993126 + 0.0027377785 * jd;

    h = h - floor(h);
    m = m - floor(m);
    f = f - floor(f);
    d = d - floor(d);
    n = n - floor(n);
    g = g - floor(g);

    h = h * 2 * M_PI;
    m = m * 2 * M_PI;
    f = f * 2 * M_PI;
    d = d * 2 * M_PI;
    n = n * 2 * M_PI;
    g = g * 2 * M_PI;

    v = 0.39558 * sin(f + n);
    v = v + 0.082 * sin(f);
    v = v + 0.03257 * sin(m - f - n);
    v = v + 0.01092 * sin(m + f + n);
    v = v + 0.00666 * sin(m - f);
    v = v - 0.00644 * sin(m + f - 2 * d + n);
    v = v - 0.00331 * sin(f - 2 * d + n);
    v = v - 0.00304 * sin(f - 2 * d);
    v = v - 0.0024 * sin(m - f - 2 * d - n);
    v = v + 0.00226 * sin(m + f);
    v = v - 0.00108 * sin(m + f - 2 * d);
    v = v - 0.00079 * sin(f - n);
    v = v + 0.00078 * sin(f + 2 * d + n);

    u = 1 - 0.10828 * cos(m);
    u = u - 0.0188 * cos(m - 2 * d);
    u = u - 0.01479 * cos(2 * d);
    u = u + 0.00181 * cos(2 * m - 2 * d);
    u = u - 0.00147 * cos(2 * m);
    u = u - 0.00105 * cos(2 * d - g);
    u = u - 0.00075 * cos(m - 2 * d + g);

    w = 0.10478 * sin(m);
    w = w - 0.04105 * sin(2 * f + 2 * n);
    w = w - 0.0213 * sin(m - 2 * d);
    w = w - 0.01779 * sin(2 * f + n);
    w = w + 0.01774 * sin(n);
    w = w + 0.00987 * sin(2 * d);
    w = w - 0.00338 * sin(m - 2 * f - 2 * n);
    w = w - 0.00309 * sin(g);
    w = w - 0.0019 * sin(2 * f);
    w = w - 0.00144 * sin(m + n);
    w = w - 0.00144 * sin(m - 2 * f - n);
    w = w - 0.00113 * sin(m + 2 * f + 2 * n);
    w = w - 0.00094 * sin(m - 2 * d + g);
    w = w - 0.00092 * sin(2 * m - 2 * d);

    s = w / sqrt(u - v * v);  // compute moon's right ascension ...  
    Sky[0] = h + atan(s / sqrt(1 - s * s));

    s = v / sqrt(u);    // declination ...
    Sky[1] = atan(s / sqrt(1 - s * s));

    Sky[2] = 60.40974 * sqrt(u);  // and parallax
}

/* test an hour for an event*/
float test_moon(int k, float t0, float lat, float plx)
{

const static float K1 = 15 * M_PI * 1.0027379 / 180;
static float Rise_az = 0.0, Set_az = 0.0;

    float ha[3] = { 0.0, 0.0, 0.0 };
    float a, b, c, d, e, s, z;
    float hr, min, time;
    float az, hz, nz, dz;

    if (RAn[2] < RAn[0])
  RAn[2] = RAn[2] + 2 * M_PI;

    ha[0] = t0 - RAn[0] + (k * K1);
    ha[2] = t0 - RAn[2] + (k * K1) + K1;

    ha[1] = (ha[2] + ha[0]) / 2;  // hour angle at half hour
    Dec[1] = (Dec[2] + Dec[0]) / 2; // declination at half hour

    s = sin(DR * lat);
    c = cos(DR * lat);

    /* refraction + sun semidiameter at horizon + parallax correction*/
    z = cos(DR * (90.567 - 41.685 / plx));

    if (k <= 0)     // first call of function
  VHz[0] = s * sin(Dec[0]) + c * cos(Dec[0]) * cos(ha[0]) - z;

    VHz[2] = s * sin(Dec[2]) + c * cos(Dec[2]) * cos(ha[2]) - z;

    if (sgn(VHz[0]) == sgn(VHz[2]))
  return VHz[2];    // no event this hour

    VHz[1] = s * sin(Dec[1]) + c * cos(Dec[1]) * cos(ha[1]) - z;

    a = 2 * VHz[2] - 4 * VHz[1] + 2 * VHz[0];
    b = 4 * VHz[1] - 3 * VHz[0] - VHz[2];
    d = b * b - 4 * a * VHz[0];

    if (d < 0)
  return VHz[2];    /* no event this hour*/

    d = sqrt(d);
    e = (-b + d) / (2 * a);

    if ((e > 1) || (e < 0))
  e = (-b - d) / (2 * a);

    time = ((float) k) + e + 1 / 120; /* time of an event + round up*/
    hr = floor(time);
    min = floor((time - hr) * 60);

    hz = ha[0] + e * (ha[2] - ha[0]); /* azimuth of the moon at the event*/
    nz = -cos(Dec[1]) * sin(hz);
    dz = c * sin(Dec[1]) - s * cos(Dec[1]) * cos(hz);
    az = atan2(nz, dz) / DR;
    if (az < 0)
  az = az + 360;

    if ((VHz[0] < 0) && (VHz[2] > 0)) {
  Rise_time[0] = (int) hr;
  Rise_time[1] = (int) min;
  Rise_az = az;
  Moonrise = 1;
    }

    if ((VHz[0] > 0) && (VHz[2] < 0)) {
  Set_time[0] = (int) hr;
  Set_time[1] = (int) min;
  Set_az = az;
  Moonset = 1;
    }

    return VHz[2];
}

/* Local Sidereal Time for zone*/
float lst(const float lon, const float jd, const float z)
{
    float s =
  24110.5 + 8640184.812999999 * jd / 36525 + 86636.6 * z +
  86400 * lon;
    s = s / 86400;
    s = s - floor(s);
    return s * 360 * DR;
}

/* 3-point interpolation*/
float interpolate(const float f0, const float f1, const float f2,
       const float p)
{
    float a = f1 - f0;
    float b = f2 - f1 - a;
    float f = f0 + p * (2 * a + b * (2 * p - 1));

    return f;
}


/* calculate moonrise and moonset times*/
void riseset(const float lat, const float lon, const int day,
       const int month, const int year, const int TIMEZONE )//
{
    int i, j, k;
    float ph;
    // guido: julian day has been converted to int from float
//    float jd = (julian_day(day, month, year)) - 2451545;  // Julian day relative to Jan 1.5, 2000
    float jd = (julian_day(day, month, year)) - 2451545;  // Julian day relative to Jan 1.5, 2000
    float mp[3][3];
    float lon_local = lon;

    if ((sgn(-TIMEZONE) == sgn(lon)) && (TIMEZONE != 0))//
  Serial.println("WARNING: time zone and longitude are incompatible!");

    for (i = 0; i < 3; i++) {
  for (j = 0; j < 3; j++)
      mp[i][j] = 0.0;
    }

    lon_local = lon / 360;
    float tz = -((float)TIMEZONE) / 24;
    float t0 = lst(lon_local, jd, tz);  /* local sidereal time*/

    jd = jd + tz;   /* get moon position at start of day*/

    for (k = 0; k < 3; k++) {
  moon(jd);
  mp[k][0] = Sky[0];
  mp[k][1] = Sky[1];
  mp[k][2] = Sky[2];
  jd = jd + 0.5;
    }

    if (mp[1][0] <= mp[0][0])
  mp[1][0] = mp[1][0] + 2 * M_PI;

    if (mp[2][0] <= mp[1][0])
  mp[2][0] = mp[2][0] + 2 * M_PI;

    RAn[0] = mp[0][0];
    Dec[0] = mp[0][1];

    Moonrise = 0;   /* initialize*/
    Moonset = 0;

    for (k = 0; k < 24; k++)  /* check each hour of this day*/
    {
  ph = ((float) (k + 1)) / 24;

  RAn[2] = interpolate(mp[0][0], mp[1][0], mp[2][0], ph);
  Dec[2] = interpolate(mp[0][1], mp[1][1], mp[2][1], ph);

  VHz[2] = test_moon(k, t0, lat, mp[1][2]);

  RAn[0] = RAn[2];  // advance to next hour
  Dec[0] = Dec[2];
  VHz[0] = VHz[2];
    }

}

float get_phase(const DateTime now, const int TIMEZONE) {/*TZOffset*/
  //float phase = (julian_day(now.day(),now.month(), now.year()) - 2451550.1);
  //float phase = (julian_day(now.day(),now.month(), now.year()) - 2440594.359028);  //CE 1970 January 07 20:37:00.2 UT  Wednesday - new moon
  float phase;
  
  phase = julian_day(now.day(),now.month(), now.year());
//  phase -= 2455211.8; //CE  2010 January 15 07:12:00.0 UT - new moon
  phase -= 2440594.359028;
  phase += ((now.hour() * 60) + now.minute()) / (float)1440; // Adjust for current time JD returns Midnight. 1140 = minutes in day.
  phase += -((float)TIMEZONE) / 24.0; // Now adjust local to UTC.
  phase = fmod(phase,29.530588853);
  return (phase);
}


/* check for no moonrise and/or no moonset*/
int moon_up(const DateTime now) {
  
  int riseMin=(Rise_time[0]*60)+Rise_time[1];
  int setMin=(Set_time[0]*60)+Set_time[1];
  int nowMin=(now.hour()*60)+now.minute();

  if ((!Moonrise) && (!Moonset)) { // neither moonrise nor moonset
    if (VHz[2] < 0)
      return(0); // down all day
    else
      return(1); // up all day
    }
  
  if (Moonrise && Moonset) {
    if ((setMin > riseMin) && (riseMin < nowMin) && (nowMin < setMin)) {
      return(1); // up
    } 

    if ((setMin < riseMin) && ((nowMin < setMin) || (nowMin > riseMin))) {
      return(1); // up
    } 
  }
  
  if (Moonrise && (!Moonset)) { // Moonrise only
    if (nowMin > riseMin) {
      return(1);
    }
  }
  
  if (Moonset && (!Moonrise)) { // Moonset only
    if (nowMin < setMin) {
      return(1);
    }
  }

  return(0); // if in doubt turn blow it out

}
int moon_phase(){
  /* calculates the age of the moon phase(0 to 7)*/
  /* there are eight stages, 0 is full moon and 4 is a new moon*/
  DateTime now = RTC.now();  
  double jd = 0; // Julian Date
  double ed = 0; //days elapsed since start of full moon
  int b= 0;
  jd = julianDate(now.year(), now.month(), now.day());
  //jd = julianDate(1972,1,1); // used to debug this is a new moon
  jd = int(jd - 2244116.75); // start at Jan 1 1972
  jd /= 29.53; // divide by the moon cycle    
  b = jd;
  jd -= b; // leaves the fractional part of jd
  ed = jd * 29.53; // days elapsed this month
  nfm = String((int(29.53 - ed))); // days to next full moon
  b = jd*8 +0.5;
  b = b & 7; 
  return b;
   
}
double julianDate(int y, int m, int d){
/* convert a date to a Julian Date}*/
  int mm,yy;
  double k1, k2, k3;
  double j;
  
  yy = y- int((12-m)/10);
  mm = m+9;
  if(mm >= 12) {
    mm = mm-12;
  }
  k1 = 365.25 *(yy +4172);
  k2 = int((30.6001 * mm) + 0.5);
  k3 = int((((yy/100) + 4) * 0.75) -38);
  j = k1 +k2 + d + 59;
  j = j-k3; // j is the Julian date at 12h UT (Universal Time)

  return j;
}
void Affichage_Sun(void){
  DateTime now = RTC.now();
  TimeMins = (now.hour() * 60) + now.minute(); 
  if(TimeMins>Sunset&&TimeMins<Sunrise){
          /*Affichage heure Sunrise*/ 
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(80,20);
          if(SunriseHour<10);
          u8g.print("0");
          u8g.print(SunriseHour);
          u8g.print (":");
          if (SunriseMin <10) 
          u8g.print("0");
          u8g.print (SunriseMin);
  }
   if(TimeMins>Sunrise&&TimeMins<heureMidi){
          /* affichage heure zenith*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(80,20 );
          if(zenith_Hour<0)
          u8g.print("0");
          u8g.print(zenith_Hour);
          u8g.print(":");
          if (zenith_Min<10) 
          u8g.print("0");
          u8g.print (zenith_Min);
   }      
     if(TimeMins>heureMidi&&TimeMins>Sunrise){
          /*Affichage heure Sunset*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(80,20);
          if(SunsetHour<10)
          u8g.print("0");
          u8g.print (SunsetHour);
          u8g.print (":"); 
          if (SunsetMin <10) 
          u8g.print("0");
          u8g.print (SunsetMin); 
       }
   }
   void Affichage_Moon(void){
  DateTime now = RTC.now();
  TimeMins = (now.hour() * 60) + now.minute(); 
  int riseMin=(Rise_time[0]*60)+Rise_time[1];
  int setMin=(Set_time[0]*60)+Set_time[1];
  int  minuitLunaire = (riseMin + setMin)/2 ;
    
  if(TimeMins>Moonset&&TimeMins<Moonrise){
          /*Affichage heure Moonrise*/ 
          u8g.setFont(u8g_font_6x10); 
          u8g.setPrintPos(80,30 );
          if(moonriseHour<10)
          u8g.print("0");
          u8g.print(moonriseHour);
          u8g.print(":");
          if (moonriseMin <10) 
          u8g.print("0");
          u8g.print (moonriseMin);
  }      
   if(TimeMins> Moonrise && TimeMins<minuitLunaire){
    
          /* affichage minuit lunaire*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(80,30 );
          if(lunaire_Hour<0)
          u8g.print("0");
          u8g.print(lunaire_Hour);
          u8g.print(":");
          if (lunaire_Min<10) 
          u8g.print("0");
          u8g.print (lunaire_Min);
         }  
       
     if(TimeMins>minuitLunaire && TimeMins> Moonrise){
      
          /*Affichage heure Moonset*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(80,30);
          if(moonsetHour<10)
          u8g.print("0");
          u8g.print (moonsetHour);
          u8g.print (":"); 
          if (moonsetMin <10) 
          u8g.print("0");
          u8g.print (moonsetMin);
          
       }
   }
void drawMoon(void){
    DateTime now = RTC.now(); 
    time = ((now.hour() * 100) + now.minute());
    int mp = moon_phase();
    switch (mp){
    case 0:
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(2,51);
    valeur_Moon = 255;/* 100% Pleine Lune*/
    
break;
    case 1:
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(2,51);
    valeur_Moon = 191;/* 75% lune gibbeuse croissante*/
  break;
    case 2: 
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(2,51);
    valeur_Moon = 128;/* 50% premier quartier de lune */
  break; 
    case 3:
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(2,51);
    valeur_Moon = 64;/* 25%  lune premier croissant*/
  break;
    case 4: 
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(2,51);
    valeur_Moon = 0;/*0% lune noir */
  break;
    case 5: 
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(2,51);
    valeur_Moon = 64;/*25%  dernier croissant */
  break;
    case 6:
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(2,51);
    valeur_Moon = 128;/*50% dernier quartier */
   break;
    case 7:
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(2,51);
    valeur_Moon = 191;/*75% premier decroissant*/
   break; 
  }
    const char* newNfm = (const char*) nfm.c_str();  
    
}      
void print_time(const DateTime now) {
    Serial.print(now.year(), DEC);
    Serial.print('/');
    if (now.year() < 10)
    Serial.print("0");
    Serial.print(now.month(), DEC);
    Serial.print('/');
    if (now.day() < 10)
    Serial.print("0");
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    if (now.hour() < 10)
    Serial.print("0");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    if (now.minute() < 10)
    Serial.print("0");
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    if (now.second() < 10)
    Serial.print("0");
    Serial.print(now.second(), DEC);
}

void print_moonrise (void) {
    if (Moonrise) {
    if (Rise_time[0] < 10) {
      Serial.print("0");
    }
    Serial.print(Rise_time[0]);
    Serial.print(":");
    if (Rise_time[1] < 10) {
      Serial.print("0");
    }
    Serial.print(Rise_time[1]);
    } else {
    Serial.print("  none");
  }
}

void print_moonset (void) {
    if (Moonset) {
    if (Set_time[0] < 10) {
      Serial.print("0");
    }
    Serial.print(Set_time[0]);
    Serial.print(":");
    if (Set_time[1] < 10) {
      Serial.print("0");
    }
    Serial.print(Set_time[1]);
    } else {
    Serial.print("  none");
  }
}

void print_phase(const DateTime now) {
    Serial.print(get_phase(now, TIMEZONE),4);
}

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];
    int riseMin=(Rise_time[0]*60)+Rise_time[1];
    int setMin=(Set_time[0]*60)+Set_time[1];
    int minuit_lunaire_Min=(riseMin+setMin)/2;
    zenithMin = (Sunset+Sunrise)/2;
    zenith_Min = (zenithMin)%60;
    zenithHour = (Sunset+Sunrise)/2;
    zenith_Hour = (zenithHour)/60;
    minuit_lunaire_Min =(riseMin+setMin)/2;
    lunaire_Min = (minuit_lunaire_Min)%60;
    minuit_lunaire_Hour =(riseMin+setMin)/2;
    lunaire_Hour = (minuit_lunaire_Hour)/60;
    TimeMins = (now.hour() * 60) + now.minute();
    uint16_t time = now.hour() * 60 + now.minute();
    uint16_t angle = map(time, Sunrise, Sunset, 0, 180);
    Affichage_Sun();
    Affichage_Moon();
    setPwmLune(); 
     
    /*evite de depasser l'angle*/ 
     if(angle < 0)
     angle = 0;
    else if(angle > 180) 
     angle = 180;
    EEPROM.update(13,angle);//Angle du soleil info ecran secondaire
    margeAube = (Sunset - Sunrise)/180*6; /*calcul de la durer de uint16_t angle multiplier par 6° angle Aube Civil*/
    heureMidi = (Sunrise + Sunset)/2;
    margeCrepuscule =(Sunset - Sunrise)/180*6; /*calcul de la durer de uint16_t angle multiplier par 6° angle Crepuscule Civil*/
    /* pwm Sunrise/Sunset Jaune */
    if(TimeMins < heureMidi ){
    pwm2 = map ( TimeMins, Sunrise - margeAube, heureMidi, 0, valeur_Sun);
    }
    else {
    pwm2 = map ( TimeMins, heureMidi, Sunset + margeCrepuscule, valeur_Sun, 0);
    }
    if(pwm2<0) {
        pwm2=0;
    }
    analogWrite(5,pwm2);/* PIN 5 timer 16 bits*/
   
    /* pwm Sunrise/Sunset Horticole */
    if(TimeMins < heureMidi ){
    pwm3 = map ( TimeMins, Sunrise, heureMidi, 0, valeur_Sun);
    }
    else {
    pwm3 = map ( TimeMins, heureMidi, Sunset, valeur_Sun, 0);
    }
    if(pwm3<0) {
        pwm3=0;
    }
    analogWrite(9,pwm3);/* PIN 9 timer 8 bits*/
    myLord.Season(SeasonTime);// Computes Season
    SeasonTime[2]= SeasonHour; 
    SeasonTime[1]= SeasonMin;
    SeasonTime[3] = now.day();
    SeasonTime[4] = now.month();
    SeasonTime[5] = now.year();
    SeasonHour = now.hour();
    SeasonMin =  now.minute();
    /* Computes Season */    
    current_season = myLord.Season(SeasonTime);
  if (current_season == 0){sea=0;}
  if (current_season == 1){sea=1;} 
  if (current_season == 2){sea=2;}
  if (current_season == 3){sea=3;} 
      
    /* Select Icon*/
    
      switch (sea) {
      case 0: // Hiver 
      u8g.setFont(u8g_font_6x10);
      u8g.setPrintPos(75,40); 
      u8g.print("Hiver    ");
      break;
      case 1: // Printemps
      u8g.setFont(u8g_font_6x10);
      u8g.setPrintPos(75,40);
      u8g.print("Printemps");
      break;
      case 2:// Eté
      u8g.setFont(u8g_font_6x10);
      u8g.setPrintPos(75,40);
      u8g.print("Ete      ");
      break;
      case 3:// Automne
      u8g.setFont(u8g_font_6x10);
      u8g.setPrintPos(75,40);
      u8g.print("Automne  ");
 } // .end Switch Select 
    
    /* date  mois jour * Rectif Heure */
    u8g.setFont(u8g_font_6x13);   
    u8g.setPrintPos(2,10); 
    if (now.day() < 10) u8g.print("0");
    u8g.print(now.day());
    u8g.print("/");
    if (now.month() < 10) u8g.print("0");
    u8g.print(now.month());
    u8g.print("/");
    u8g.setPrintPos(40,10);
    u8g.print(daysOfTheWeek[zis]);

    u8g.setFont(u8g_font_6x13);
    u8g.setPrintPos(80,10);
    if (now.hour() < 10) u8g.print("0");
    u8g.print(now.hour());
    u8g.setPrintPos(92,10);
    if (now.second()%2 != 1)
    u8g.print(":");
    u8g.setPrintPos(112,10);
    u8g.setFont(u8g_font_6x10);
    if(now.second()<10)u8g.print("0");
    u8g.print(now.second());
    u8g.setPrintPos(98,10);
    u8g.setFont(u8g_font_6x13); 
    if (now.minute() < 10) u8g.print("0");
    u8g.print(now.minute());
    
    /* affichage angle Draw_soleil */
    u8g.setFont(u8g_font_6x10);
    u8g.setPrintPos(2,60 );
    u8g.print("angle: ");// soleil
    u8g.setPrintPos(50,60 );
    u8g.print(angle);//soleil
    
    /* Affichage pwm */
    u8g.setFont(u8g_font_6x10);
    u8g.setPrintPos(0,20);
    u8g.print("Sun: ");
    u8g.print(pwm2);
    u8g.setPrintPos(0,40);
    u8g.print("Hort: ");
    u8g.print(pwm3);
    /* affichage angle_Stepper  */ 

    u8g.setFont(u8g_font_6x10);
    u8g.setPrintPos(80,60 );
    u8g.print("st: ");// stepper
    u8g.setPrintPos(100,60 );
    u8g.print(degre);//stepper
    
    TimeMins = (now.hour() * 60) + now.minute();
    /*If it's after sunrise and before sunset, switch our relay on*/
    if (TimeMins >= Sunrise && TimeMins <=Sunset-1) { 
            //digitalWrite (A3, HIGH);// Relay
            //analogWrite(backlight,255);/* lcd rétroéclairage On st7920*/
            //u8g.setColorIndex(1); /* Pixel On sh1103*/
      }
       else {  /*otherwise switch it off*/
            //digitalWrite (A3,LOW);//Relay
            //analogWrite(backlight,0);/* lcd rétroéclairage Off st7920*/
            //u8g.setColorIndex(0);/* Pixel Off sh1103*/
       }
  
 /* forecast meteo*/
      reading_hour = now.hour();
  if (reading_hour != last_reading_hour) { // If the hour has advanced, then shift readings left and record new values at array element [23]
    for (int i = 0; i < 23;i++){
      reading[i].pressure     = reading[i+1].pressure;
      reading[i].temperature  = reading[i+1].temperature;
      reading[i].wx_state_1hr = reading[i+1].wx_state_1hr;
      reading[i].wx_state_3hr = reading[i+1].wx_state_3hr;
    }
    reading[23].pressure     = read_pressure(); // Update time=now with current value of pressure
    reading[23].wx_state_1hr = current_wx;
    reading[23].wx_state_3hr = current_wx;
    last_reading_hour        = reading_hour;
    hr_cnt++;
    wx_average_1hr = reading[22].wx_state_1hr + current_wx;           // Used to predict 1-hour forecast extra text
    wx_average_3hr = 0;
    for (int i=23;i >= 21; i--){                                      // Used to predict 3-hour forecast extra text 
      wx_average_3hr = wx_average_3hr + (int)reading[i].wx_state_3hr; // On average the last 3-hours of weather is used for the 'no change' forecast - e.g. more of the same?
    }
  }  

 // ForecastToImgTxt(get_forecast_text(reading[23].pressure, trend, look_3hr));
 //  weather_description wx_text = get_forecast_text(reading[23].pressure, trend, look_3hr);
 reading[23].pressure = (reading[23].pressure + read_pressure())/2; /* 1hr */              // Update rolling average, gets reset on the hour transition
 float  trend = reading[23].pressure - reading[20].pressure;  /* 3hr */                    // Get short-term trend for the last 3-hour
 weather_description wx_text = get_forecast_text(read_pressure(), trend, look_1hr);
 ForecastToImgTxt(wx_text); /* 1hr &3hr*/
 
      /* affichage pression hpa*/
      u8g.setFont(u8g_font_6x10); 
      u8g.setPrintPos(2,50);
      u8g.print("hpa: ");
      u8g.setPrintPos(30,50);
      u8g.print(read_pressure());
      
      
 
  }                  
int calculPwm( int TimeMins, int riseMin, int setMin) { 
  DateTime now = RTC.now();
   TimeMins =  (now.hour() * 60) + now.minute(); 
   riseMin = Rise_time[0] * 60 + Rise_time[1];
   setMin  = Set_time[0]*60 + Set_time[1];
  int pwm = 0;
  int minuitLunaire = 0; 
    int minuit_lunaire_Min=(riseMin+setMin)/2;
    minuit_lunaire_Min =(riseMin+setMin)/2;
    lunaire_Min = (minuit_lunaire_Min)%60;
    minuit_lunaire_Hour =(riseMin+setMin)/2;
    lunaire_Hour = (minuit_lunaire_Hour)/60;
    
  // gestion du cas où le levé est plus tard que le couché  pour la lune
       if( riseMin > setMin) 
       setMin+= 24 * 60; // ajout de 24h...
       //minuitLunaire = minuitLunaire *2;// ajout de 24h...
       
      if( TimeMins < riseMin )
      TimeMins += 24 * 60; // ajout de 24h...
     // fin de la gestion
  
    minuitLunaire=(riseMin+setMin)/2;
      
  /* phase montante*/
  if(TimeMins > riseMin && TimeMins <minuitLunaire) {//<=au lieu de <
    pwm = map( TimeMins, riseMin,minuitLunaire , 0, valeur_Moon); 
  }

  /* phase descendante */
  if(TimeMins > minuitLunaire && TimeMins < setMin) {
    pwm = map( TimeMins, minuitLunaire, setMin, valeur_Moon, 0); 
  }
    
  return pwm;
      
  }
void setPwmLune() {
  DateTime now = RTC.now();
  TimeMins = (now.hour() * 60) + now.minute();
  int riseMin = Rise_time[0] * 60 + Rise_time[1]; // Attention variables globales à modifier avec des fonctions...
  int setMin = Set_time[0]*60 + Set_time[1]; // Attention variables globales ...
  int pwmLune = calculPwm ( TimeMins, riseMin, setMin );
  u8g.setFont(u8g_font_6x10);
  u8g.setPrintPos(0,30);
  u8g.print("Lune: ");
  u8g.print(pwmLune);
  analogWrite(PINPWMLUNE, pwmLune);
}
void setup(void) {
      draw_Bonsai();//Boot Bitmap logo 
      //analogWrite(backlight, 255);/*Retroeclairage PIN 6 */
      delay(5000);
      Serial.begin(9600);
      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__)));
  }
    /*Timelord initialisation*/
      myLord.TimeZone(TIMEZONE * 60);
      myLord.Position(LATITUDE, LONGITUDE);
      CalcSun ();
      Wire.begin();
      SI1145.Begin();
      float p,t;
      Serial.println(F("BME280 test"));
      bool status;
    
      /* default settings*/
      status = bme.begin(0x76);  
      if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (isnan(bme.readPressure())) { Serial.println(bme.readPressure());
        } //while (1);
      delayTime = 1000;
  }
      DateTime();
    
      for (int i = 0; i <= 23; i++){ // At the start all array values are the same as a baseline 
      reading[i].pressure     = read_pressure();       // A rounded to 1-decimal place version of pressure
      reading[i].temperature  = bme.readTemperature(); // Although not used, but avialable
      reading[i].humidity     = bme.readHumidity();    // Although not used, but avialable for BMP280
      reading[i].wx_state_1hr = unknown;               // To begin with  
      reading[i].wx_state_3hr = unknown;               // To begin with 
  }                                                  // Note that only 0,5,11,17,20,21,22,23 are used as display positions
      last_reading_hour = reading_hour;
      wx_average_1hr = 0; // Until we get a better idea
      wx_average_3hr = 0; // Until we get a better idea
   
    /* pins assignation*/
     /*push button on encoder connected to A0 (and GND)*/
      pinMode(A0,INPUT);
      digitalWrite(A0,HIGH);
      /* pin PWM blanche Sun*/  
      pinMode (5,OUTPUT);
      analogWrite(pwm2,LOW);// commande pwm Jaune Sun  
      /* pin PWM bleu lune*/
      pinMode (8,OUTPUT); 
      analogWrite(PINPWMLUNE,LOW);// commande pwm bleu lune PINPWMLUNE
      /* pin pwm horticole*/ 
      pinMode (9,OUTPUT); 
      analogWrite(pwm3,LOW);// commande pwm blanche rouge Horticole
      
      // Pins commande stepper 
      pinMode(stepPin,OUTPUT);//10
      pinMode(dirPin,OUTPUT); //12
      pinMode(enPin,OUTPUT);  //11
      digitalWrite(dirPin,HIGH);
       
  }
void drawFrame1() {// forescast météo 
  float trend  = reading[23].pressure - reading[20].pressure; /* Trend over the last 3-hours*/
  ForecastToImgTxt(get_forecast_text(reading[23].pressure, trend, look_3hr));/* From forecast and trend determine what image to display*/
  weather_description wx_text = get_forecast_text(read_pressure(), trend, look_1hr);
  reading[23].pressure = (reading[23].pressure + read_pressure())/2; /* 1hr*/
  ForecastToImgTxt(wx_text); 
  byte sel = 1;
  if      (wx_text == GoodClearWeather)           {image = sunny_img;       current_wx = sunny;        weather_text = "Good clear weather"; sel = 1;}
  else if (wx_text == BecomingClearer)            {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Becoming clearer";sel = 2;}
  else if (wx_text == NoChange)                   {image = cloudy_img;      current_wx = cloudy;       weather_text = "No change, clearing"; sel = 3;}
  else if (wx_text == ClearSpells)                {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Clear spells"; sel = 2;}
  else if (wx_text == ClearingWithin12hrs)        {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Clearing within 12-hrs";sel = 2;}
  else if (wx_text == ClearingAndColder)          {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Clearing and colder";sel = 2;}
  else if (wx_text == GettingWarmer)              {image = mostlysunny_img; current_wx = mostlysunny;  weather_text = "Getting warmer";sel = 2;}
  else if (wx_text == WarmerIn2daysRainLikely)    {image = rain_img;        current_wx = rain;         weather_text = "Warmer in 2-days, rain likely";sel = 4;}
  else if (wx_text == ExpectRain)                 {image = rain_img;        current_wx = rain;         weather_text = "Expect rain";sel = 2;}
  else if (wx_text == WarmerRainWithin36hrs)      {image = rain_img;        current_wx = rain;         weather_text = "Warmer, rain within 36-hrs";sel = 4;}
  else if (wx_text == RainIn18hrs)                {image = rain_img;        current_wx = rain;         weather_text = "Rain in 18-hrs";sel = 4;}
  else if (wx_text == RainHighWindsClearAndCool)  {image = rain_img;        current_wx = rain;         weather_text = "Rain, high winds, clear and cool";sel = 4;}
  else if (wx_text == GalesHeavyRainSnowInWinter) {image = tstorms_img;     current_wx = tstorms;      weather_text = "Gales, heavy rain, in winter snow";sel = 5;}
  /* Select Icon */
  switch (sel) {
    case 1: /* Soleil*/
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(25,51);
    if(frame==0)
    u8g.drawXBMP(57, 25,u8g_logo_width, u8g_logo_height, u8g_Sun_1_bits );
    else if (frame == 1)
    u8g.drawXBMP(57, 25,u8g_logo_width, u8g_logo_height,u8g_Sun_2_bits  );
      break;
    case 2: /* Ensoleillee*/
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(25,51);
    u8g.drawXBMP( 57, 25,u8g_logo_width, u8g_logo_height, u8g_ensoleillee_bits);
      break;
    case 3:/* Nuageux*/
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(25,51);
    u8g.drawXBMP( 57, 25,u8g_logo_width, u8g_logo_height, u8g_nuageux_bits);
      break;
    case 4:/* Pluie*/
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(25,51);
    u8g.drawXBMP( 57, 25,u8g_logo_width, u8g_logo_height, u8g_pluie_bits);
      break;
    case 5:/* Tempete*/
    u8g.setFont(u8g_font_04b_03);
    u8g.setPrintPos(25,51);
    u8g.drawXBMP( 57, 25,u8g_logo_width, u8g_logo_height, u8g_orageux_bits);
     
     } // .end Switch Select
}

void turntable() {
 DateTime now = RTC.now();
  
    // center / 
    int x2=128/2;  
    int y2=64/2;  
    // radius / 
    int r2=22;
    // angle/
 u8g.setFont(u8g_font_6x10);
 u8g.setPrintPos(1,50);
 u8g.print("degre");//turntable
 u8g.setPrintPos(2,60);
 u8g.print(degre);//turntable
 u8g.setPrintPos(99,50);
 u8g.print("steps");
 u8g.setPrintPos(103,60);
 u8g.print(stepper); 
   // affichage position turntable ecran /
 u8g.setFont(u8g_font_6x10);
 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*degre*2*3.14/360), y2-r2*cos(1*degre*2*3.14/360));  
 u8g.drawCircle(x2, y2, r2); 
 }
 void commande(){
      DateTime now = RTC.now();
      int dayOfTheWeek = now.dayOfTheWeek();
      zis = now.dayOfTheWeek();
      switch(dayOfTheWeek){
  case 0:
    Serial.println("Dimanche");
    if( daysOfTheWeek[now.dayOfTheWeek()]&& "Dim"){
        degre = 0;// visu table
        degre_1 = degre/2; 
        EEPROM.update(22,degre_1);
        
    }    
    break;
  case 1:
    Serial.println("Lundi");
    if( daysOfTheWeek[now.dayOfTheWeek()]&& "Lun"){
        degre = 60;//visu table 
        degre_1 = degre/2;
        EEPROM.update(22,degre_1);
    }
    break;
  case 2:
    Serial.println("Mardi");
    if( daysOfTheWeek[now.dayOfTheWeek()]&& "Mar"){
        degre = 120;//visu table 
        degre_1 = degre/2;
        EEPROM.update (22,degre_1);
    }
    break;
  case 3:
    Serial.println("Mercredi");
    if( daysOfTheWeek[now.dayOfTheWeek()]&& "Mer"){
        degre = 180;// visu table
        degre_1 = degre/2;
        EEPROM.update(22,degre_1);
    } 
    break;
  case 4:
    Serial.println("Jeudi");
    if( daysOfTheWeek[now.dayOfTheWeek()]&& "Jeu"){
        degre = 240;// visu table 
        degre_1 = degre/2;
        EEPROM.update(22,degre_1);
    }    
    break;
  case 5:
    Serial.println("Vendredi");
    if( daysOfTheWeek[now.dayOfTheWeek()]&& "Ven"){
        degre = 300;//visu table 
        degre_1= degre/2;
        EEPROM.update(22,degre_1);
    }    
    break;
  case 6:
    Serial.println("Samedi");
    if( daysOfTheWeek[now.dayOfTheWeek()]&& "Sam"){
        degre = 360;//visu table
        degre_1= degre/2;
        EEPROM.update(22,degre_1);
      }
      
    }
     moteur();//moteur nema 17  
 }
 void moteur(){// stepper nema 17
  DateTime now = RTC.now();
  zis = now.dayOfTheWeek();
  int n;
  float stepPerDegre = 0.45; //ajustement pour la couronne dentelée // full step nema = 1.8
  stepper = degre/stepPerDegre;//nbr de steps
  degre_1 = (EEPROM.read(22));
  degre = degre_1*2;
  
  currentDegre_1 =  (EEPROM.read(23)); 
  currentDegre = currentDegre_1*2;// EEPROM maxi 255,currentAngle *2;
  
  if( currentDegre != degre ){
        
  if( currentDegre < degre){

  digitalWrite(dirPin,HIGH);
  digitalWrite(enPin,LOW);
  n = degre - currentDegre;
  numstep = n / stepPerDegre;
 }
  else if( currentDegre > degre){

  digitalWrite(dirPin,LOW);
  digitalWrite(enPin,LOW);
  n = currentDegre - degre;
  if( degre == 0){
  n = currentDegre;
 }
  numstep = n / stepPerDegre;

 }

 for(int x = 0; x < numstep; x++) {
 digitalWrite(stepPin,HIGH);
 delayMicroseconds(800);//1000
 digitalWrite(stepPin,LOW);
 delayMicroseconds(800);
         
 }
 currentDegre_1 = degre_1;
 EEPROM.update(23,currentDegre_1);

 }
   delay(500);//500
   Serial.println("Deblocage axe");
   digitalWrite( enPin, HIGH ); // logique inversée
  } 

 int max_day(){
  int ma_valeur_de_maxday=0;
    DateTime now = RTC.now();
      
   if (now.month() == 4 || now.month() == 6 || now.month() == 9 || now.month() == 11){  //30 jours =   Avril, Juin,Septembre,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 loop(void) {
      u8g.setFont(u8g_font_6x10);
      DateTime now = RTC.now();
      int year = now.year();
      int month = now.month();
      int day = now.day();
      int hour = now.hour();
      int minute = now.minute();
      int seconde = now.second(); 
      int riseMin=(Rise_time[0]*60)+Rise_time[1];
      int setMin=(Set_time[0]*60)+Set_time[1];
      TimeMins = (now.hour() * 60) + now.minute();
      /* Variables */
      float F_TIMEZONE    = EEPROM.read(4);
      float F_LATITUDE    = EEPROM.read(3);
      float F_LATITUDE_1  = EEPROM.read(6);
      float F_LONGITUDE   = EEPROM.read(2);
      float F_LONGITUDE_1 = EEPROM.read(5); 
      float F_Long        = EEPROM.read(2)+ (float)(EEPROM.read(5)/100.);
      float F_Lat         = EEPROM.read(3)+ (float)(EEPROM.read(6)/100.);
      TIMEZONE = F_TIMEZONE;
      LATITUDE = F_Lat;
      LONGITUDE= F_Long;
      /*Timelord initialisation*/
      myLord.TimeZone(TIMEZONE * 60);
      myLord.Position(LATITUDE, LONGITUDE);
      /*  Moon Rise initialisation */
      riseset(LATITUDE, LONGITUDE, now.day(), now.month(), now.year(), TIMEZONE);
      /* BME 280 */
      bme.readPressure();
      bme.readTemperature();
      bme.readHumidity();
      Moonset = Set_time[0]*60 + Set_time[1];
      moonsetHour = Set_time[0];
      moonsetMin = Set_time[1];
      Moonrise = Rise_time[0]*60 + Rise_time[1];
      moonriseHour = Rise_time[0];
      moonriseMin = Rise_time[1];
      TimeMins = (now.hour() * 60) + now.minute();
      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(" (");
      int dayOfTheWeek = now.dayOfTheWeek();
      zis = now.dayOfTheWeek();
      Serial.print(daysOfTheWeek[zis]);
      Serial.println(") ");
      u8g.setFont(u8g_font_6x10);
      commande();
     
    
      
      pushlength = pushlengthset;
      pushlength = getpushlength();
      delay (10);

      if (pushlength < pushlengthset) 
    {
      if((buttonstate == LOW)&&(old_buttonstate==HIGH)){/* anti rebond */
    }
      state = state+1  ;
      if (state > 5) state = 0;    
      delay(10);
      momentaprindere = millis();
    }
      old_buttonstate = val;/*old_buttonstate = buttonstate;*/
    
      if ((millis() - momentaprindere > tpaprindere) and (state != 0))/*delay pour revenir à state 0 moment d'allumage>type d'allumage*/
    {
      state = 0;
    }
    
      if(state == 1){
      draw1();
    }

      if(state == 2){
      draw2();
    }
      if (state == 3){
      draw3();
    }    
      if (state == 4){
      draw4();
    }
      if (state == 5){
      draw5();
    }
      if (state == 0){
      draw0();
    }
  /*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();
         setFuseautemp = EEPROM.read(4);
         setLongitudetemp = EEPROM.read(2);
         setLongitudetemp_1 = EEPROM.read(5);
         setLatitudetemp = EEPROM.read(3);
         setLatitudetemp_1 = EEPROM.read(6);
         setLatitude();
         setLatitude_1();
         setLongitude();
         setLongitude_1();
         setFuseau();
         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 draw0(void) {   // écran principal 
           /* picture loop */
          u8g.firstPage(); 
      do {
          draw();
          drawMoon();// Moon  affichage
         } while( u8g.nextPage() );
          frame ++;
          if(frame>1)
          frame = 0;
     /* rebuild the picture after some delay */
          delay(100);
           
        }
        void draw1(void) {/*écran secondaire Sun */
          u8g.firstPage();
      do {
          drawFrame1() ;
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,10);
          u8g.print("SunAngle");
          /* affichage heure zenith*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(95,10 );
          if(zenith_Hour<0)
          u8g.print("0");
          u8g.print(zenith_Hour);
          u8g.print(":");
          if (zenith_Min<10) 
          u8g.print("0");
          u8g.print (zenith_Min);
            /*affichage Angle*/
          u8g.setPrintPos(55,62);
          u8g.print(angle);//angle (EEPROM.read(13))
          u8g.setPrintPos(1,20);
          u8g.print(pwm2);//(EEPROM.read(20));
          u8g.setPrintPos(1,30);
          u8g.print(valeur_Sun);//(EEPROM.read(20));
          angle = (EEPROM.read(13));
          
          /*evite de depasser l'angle*/ 
          if(angle < 0)
          angle = 0;
          else if(angle > 180)
          angle = 180;  
          u8g.drawLine(20, 50, 110, 50);/*droite du bas de l'écran*/
          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.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
          DateTime now = RTC.now();                                                                //x1=57,y1=43,r_1=35,u8g_logo_width = 16,u8g_logo_height = 16,
          CalcSun ();
          myLord.SunRise(sunTime); // Computes Sun Rise.
          myLord.SunSet(sunTime); 
          
        /* levée et couché du soleil*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(5,62);
          if(SunriseHour<10);
          u8g.print("0");
          u8g.print(SunriseHour);
          u8g.print (":");
          if (SunriseMin <10) 
          u8g.print("0");
          u8g.print (SunriseMin);
          u8g.setPrintPos(95,62);
          if(SunsetHour<10)
          u8g.print("0");
          u8g.print (SunsetHour);
          u8g.print (":"); 
          if (SunsetMin <10) 
          u8g.print("0");
          u8g.print (SunsetMin);
         }
     while ( u8g.nextPage() );
       frame ++;
          if(frame>1)
          frame = 0;
     /* rebuild the picture after some delay */
          delay(100);       
      }
           
       void draw2(void){/*écran secondaire LUNE */
            u8g.firstPage();
      do {
          
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(0,10); 
          u8g.print("Moon");
              /*pwm Lune*/
          DateTime now = RTC.now();
          TimeMins = (now.hour() * 60) + now.minute();
          int riseMin = Rise_time[0] * 60 + Rise_time[1]; // Attention variables globales à modifier avec des fonctions...
          int setMin = Set_time[0]*60 + Set_time[1]; // Attention variables globales ...
          int minuitLunaire= 0 ;
          int pwmLune = 0;
          pwmLune = calculPwm ( TimeMins, riseMin, setMin );
          
           
          // gestion du cas où le levé est plus tard que le couché  pour la lune
        if( riseMin > setMin) 
        setMin += 24 * 60; // ajout de 24h...
               
        if( TimeMins < riseMin) 
        TimeMins += 24 * 60; // ajout de 24h...
       
  //fin de gestion
        minuitLunaire = (riseMin + setMin)/2 ;
      
          u8g.setPrintPos(0,20);
          u8g.print("lune: ");
          u8g.print(pwmLune);
          /*switch case moon*/
          u8g.setPrintPos(0,30);
          u8g.print(valeur_Moon);
          /* affichage minuit lunaire*/
          u8g.setPrintPos(95,10 );
          if(lunaire_Hour<0)
          u8g.print("0");
          u8g.print(lunaire_Hour);
          u8g.print(":");
          if (lunaire_Min<10) 
          u8g.print("0");
          u8g.print (lunaire_Min);
          u8g.setPrintPos(95,30);
          u8g.print(minuitLunaire);
          u8g.setPrintPos(5,62);
          if(moonriseHour<10)
          u8g.print("0");
          u8g.print(moonriseHour);
          u8g.print(":");
          if (moonriseMin <10) 
          u8g.print("0");
          u8g.print (moonriseMin);
          u8g.setPrintPos(95,62);
          if(moonsetHour<10)
          u8g.print("0");
          u8g.print (moonsetHour);
          u8g.print (":"); 
          if (moonsetMin <10) 
          u8g.print("0");
          u8g.print (moonsetMin);
          
          /*switch case phase Moon*/
          int mp = moon_phase();
          switch (mp){
          case 0:
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_pleine_LUNE_bits);
                  
          break;
          case 1:
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_premier_croissant_bits);
                
          break;
          case 2: 
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_LUNE_QUART_bits);
                
          break; 
          case 3:
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_lune_dernier_croissant_bits);
        
          break;
          case 4: 
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height,u8g_lune_noir_bits);
                
          break;
          case 5: 
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_dernier_decroissant_bits);
                
          break;
          case 6:
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_quartier_decroissant_bits);
                
          break;
          case 7:
          u8g.setFont(u8g_font_04b_03);
          u8g.setPrintPos(2,28);
          u8g.drawXBMP(57,25,u8g_logo_width, u8g_logo_height, u8g_premier_decroissant_bits);
                
          break; 
  }
    const char* newNfm = (const char*) nfm.c_str();  
  } 
          while ( 
          u8g.nextPage() ); 
          }
        void draw3(void) {/*écran secondaire Turntable */
          u8g.firstPage();
       do {
          DateTime now = RTC.now();
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,10); 
          u8g.print("Turntable");
          turntable();
        }     while (
          u8g.nextPage() );
        }  
        void draw4(void) {/*écran secondaire Arrosage*/ 
          u8g.firstPage();
        do {
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,10); 
          u8g.print("Arrosage");
          /* Computes Season */    
        current_season = myLord.Season(SeasonTime);
        if (current_season == 0){sea=0;}
        if (current_season == 1){sea=1;} 
        if (current_season == 2){sea=2;}
        if (current_season == 3){sea=3;} 
           /* Select Icon saisons */
          switch (sea) {
          case 0: /* Hiver*/ 
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,20); 
          u8g.print("Hiver    ");
          break;
          case 1: /* Printemps*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,20);
          u8g.print("Printemps");
          break;
          case 2:/* Eté*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,20);
          u8g.print("Ete      ");
          break;
          case 3:/* Automne*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,20);
          u8g.print("Automne  ");
          } // .end Switch Select 
        } 
        
          while (
          u8g.nextPage() );
                 
      }
      void draw5(void) {/*écran secondaire Reglages*/ 
          u8g.firstPage();
        do {
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,10); 
          u8g.print("Reglages");
          /*Affichage Timezone*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,20);
          u8g.print("utc:"); 
          /*Reglage Timezone*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos( 30,20 );
          u8g.print(EEPROM.read(4));
          /*Affichage Longitude*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,30);
          u8g.print("lon:");
          /*Reglage Longitude*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(30,30 );
          float F_Long =  (EEPROM.read(2))+ (float)(EEPROM.read(5)/100.);
          u8g.print((float)F_Long); 
          /*Affichage Latitude*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(2,40);
          u8g.print("lat:"); 
          /*Reglage Latitude*/
          u8g.setFont(u8g_font_6x10);
          u8g.setPrintPos(30,40 );
          float F_Lat =  (EEPROM.read(3))+ (float)(EEPROM.read(6)/100.);
          u8g.print((float)F_Lat);
          } 
           while (
          u8g.nextPage() );
                 
      }
int setFuseau() {
  pushlength = pushlengthset;
  pushlength = getpushlength ();
  if (pushlength != pushlengthset) {
    return setFuseautemp;
  }
  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);
  }
  setFuseautemp = setFuseautemp + knobval;
  if (setFuseautemp < 1) {/*0*/
    setFuseautemp = 0; 
  }
  if (setFuseautemp > 2) {/*3*/
    setFuseautemp = 3;
  }
  itoa(setFuseautemp, tmp_string, 10);
  EEPROM.update(4,setFuseautemp);
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_6x10);
    u8g.drawStr( 0, 20, "Set Timezone");
    u8g.drawStr(35, 40, tmp_string);
  } while ( u8g.nextPage() );
  setFuseau();
}
int setLongitude() {
  pushlength = pushlengthset;
  pushlength = getpushlength ();
  if (pushlength != pushlengthset) {
    return setLongitudetemp;
  }
  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);
  }
  setLongitudetemp = setLongitudetemp + knobval;
  if (setLongitudetemp < 1) {/*0*/
    setLongitudetemp = 0; 
  }
  if (setLongitudetemp > 99) {/*100*/
    setLongitudetemp = 100;
  }
  itoa(setLongitudetemp, tmp_string, 10);
  EEPROM.update(2,setLongitudetemp);
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_6x10);
    u8g.drawStr( 0, 20, "Set Longitude Degres");
    u8g.drawStr(35, 40, tmp_string);
  } while ( u8g.nextPage() );
  setLongitude();
}
int setLongitude_1() {
  pushlength = pushlengthset;
  pushlength = getpushlength ();
  if (pushlength != pushlengthset) {
    return setLongitudetemp_1;
  }
  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);
  }
  setLongitudetemp_1 = setLongitudetemp_1 + knobval;
  if (setLongitudetemp_1 < 1) {/*0*/
    setLongitudetemp_1 = 0; 
  }
  if (setLongitudetemp_1 > 99) {/*100*/
    setLongitudetemp_1 = 100;
  }
  itoa(setLongitudetemp, tmp_string, 10);
  itoa(setLongitudetemp_1, tmp_string, 10);
  EEPROM.update(2,setLongitudetemp);
  EEPROM.update(5,setLongitudetemp_1);
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_6x10);
    u8g.drawStr( 0, 20, "Set Longitude Mins");
    u8g.drawStr(35, 40, tmp_string);
  } while ( u8g.nextPage() );
  setLongitude_1();
}
int setLatitude() {
  pushlength = pushlengthset;
  pushlength = getpushlength ();
  if (pushlength != pushlengthset) {
    return setLatitudetemp;
  }
  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);
  }
  setLatitudetemp = setLatitudetemp + knobval;
  if (setLatitudetemp < 1) {/*0*/
    setLatitudetemp = 0; 
  }
  if (setLatitudetemp > 99) {/*100*/
    setLatitudetemp = 100;
  }
  itoa(setLatitudetemp, tmp_string, 10);
  EEPROM.update(3,setLatitudetemp);
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_6x10);
    u8g.drawStr( 0, 20, "Set Latitude Degres");
    u8g.drawStr(35, 40, tmp_string);
  } while ( u8g.nextPage() );
  setLatitude();
}
int setLatitude_1() {
  pushlength = pushlengthset;
  pushlength = getpushlength ();
  if (pushlength != pushlengthset) {
    return setLatitudetemp_1;
  }
  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);
  }
  setLatitudetemp_1 = setLatitudetemp_1 + knobval;
  if (setLatitudetemp_1 < 1) {/*0*/
    setLatitudetemp_1 = 0; 
  }
  if (setLatitudetemp_1 > 99) {/*100*/
    setLatitudetemp_1 = 100;
  }
  itoa(setLatitudetemp, tmp_string, 10);
  itoa(setLatitudetemp_1, tmp_string, 10);
  EEPROM.update(3,setLatitudetemp);
  EEPROM.update(6,setLatitudetemp_1);
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_6x10);
    u8g.drawStr( 0, 20, "Set Latitude Mins");
    u8g.drawStr(35, 40, tmp_string);
  } while ( u8g.nextPage() );
  setLatitude_1();
}
void draw_Bonsai(void){
 /* picture loop*/
  u8g.firstPage();
  do {
     u8g.drawBitmapP(0, 0, 16, 64, bonsai_bitmap);
     } while ( u8g.nextPage() );
  /* rebuild the picture after some delay*/
  delay(100);
}
//sets the clock
void setclock (){
   
   /*Timelord initialisation*/
   myLord.TimeZone(TIMEZONE * 60);
   myLord.Position(LATITUDE, LONGITUDE);
   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, tmp_string, 10); 
  u8g.firstPage(); 
  do {
    u8g.setFont(u8g_font_6x10);
    u8g.drawStr( 0, 20, "Set Annee");
    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.setFont(u8g_font_6x10);
    u8g.drawStr( 0, 20, "Set Mois");
    u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() ); 
    setmonth();
}

int setday () {
  if (setmonthtemp == 4 || setmonthtemp == 6 || setmonthtemp == 9 || setmonthtemp == 11) { //30 days hath September, April June and November
    maxday = 30;
  }
  else {
  maxday = 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.
    maxday = 29;
  }
  if (setmonthtemp ==2 && setyeartemp % 4 !=0) {
    maxday = 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 > maxday) {
      setdaytemp = maxday;
    }
  itoa(setdaytemp, tmp_string, 10);  
    u8g.firstPage(); 
  do {
    u8g.setFont(u8g_font_6x10);
    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.setFont(u8g_font_6x10);
    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.setFont(u8g_font_6x10);
    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.setFont(u8g_font_6x10);
    u8g.drawStr( 0, 20, "Set Minutes");
    u8g.drawStr(25, 40, tmp_string);
  } while( u8g.nextPage() ); 
    setmins();
}









#113641 course du soleil

Posté par michel sur 25 mai 2021 - 05:34 dans Conseils et aide aux débutants, livres et kits en robotique

Sandro ,

c'était bien cela minuitLunaire pas à ça place tu avais vu juste .

je continu a tester .

merci ,




#113638 course du soleil

Posté par michel sur 25 mai 2021 - 09:42 dans Conseils et aide aux débutants, livres et kits en robotique

void draw(void) {
setPwmLune(); 
}                  
int calculPwm( int TimeMins, int riseMin, int setMin) { 
  DateTime now = RTC.now();
   TimeMins =  (now.hour() * 60) + now.minute(); 
   riseMin = Rise_time[0] * 60 + Rise_time[1];
   setMin  = Set_time[0]*60 + Set_time[1];
  int pwm = 0;
  
  
    int minuit_lunaire_Min=(riseMin+setMin)/2;
    minuit_lunaire_Min =(riseMin+setMin)/2;
    lunaire_Min = (minuit_lunaire_Min)%60;
    minuit_lunaire_Hour =(riseMin+setMin)/2;
    lunaire_Hour = (minuit_lunaire_Hour)/60;
    minuitLunaire=(riseMin+setMin)/2;
  // gestion du cas où le levé est plus tard que le couché  pour la lune
    
      
      if( riseMin > setMin) 
       setMin+= 24 * 60; // ajout de 24h...
        
       
      if( TimeMins < riseMin )
      TimeMins += 24 * 60; // ajout de 24h...
     // fin de la gestion
  
  int minuitLunaire = (riseMin + setMin) / 2;  
  
  
  /* phase montante*/
  if(TimeMins > riseMin && TimeMins <=minuit Lunaire) {//<=au lieu de <
    pwm = map( TimeMins, riseMin,minuitLunaire , 0, valeur_Moon); 
  }

  /* phase descendante */
  if(TimeMins > minuitLunaire && TimeMins < setMin) {
    pwm = map( TimeMins, minuitLunaire, setMin, valeur_Moon, 0); 
  }
    
  return pwm;
      
  }
void setPwmLune() {
  DateTime now = RTC.now();
  TimeMins = (now.hour() * 60) + now.minute();
  int riseMin = Rise_time[0] * 60 + Rise_time[1]; // Attention variables globales à modifier avec des fonctions...
  int setMin = Set_time[0]*60 + Set_time[1]; // Attention variables globales ...
  int minuitLunaire ;
  int pwmLune = calculPwm ( TimeMins, riseMin, setMin );
  u8g.setFont(u8g_font_6x10);
  u8g.setPrintPos(0,30);
  u8g.print("Lune: ");
  u8g.print(pwmLune);
  analogWrite(PINPWMLUNE, pwmLune);

}

merci Sandro :j'ai changer minuitLunaire de place , c'est correct . 

je vais tester cela tout à l'heure .

je vais refaire un programme juste avec la fonction lune comme ça je pourrais te donner le code complet .

merci pour ton aide .

Bonne journée.




#113636 course du soleil

Posté par michel sur 25 mai 2021 - 06:54 dans Conseils et aide aux débutants, livres et kits en robotique

Bonjour Sandro ,

toutes les variables qui se ressemble c'est pour afficher l'heure de minuitLunaire en H:M;

je ne pense pas avoir changer le code de Mike . juste remplacer midi par minuit .

et pour la phase descendante à la place montante ? 

tu a une idée ,pour la ressoudre .

d'avance merci .




#113632 course du soleil

Posté par michel sur 24 mai 2021 - 02:41 dans Conseils et aide aux débutants, livres et kits en robotique

bonjour Mike et Sandro,

 

quand riseTime > setTime (aujourd'hui riseTime 17h16 ,set Time 4h21 j+1) la rampe pwm(0 à 255) s'allume et indique déjà " 121" et non "1 " ou " 0" selon le calcul du map .

j'ai trouvé pourquoi Pwm indique "121" en fait elle est en phase descendante et non en phase montante .

 dans mon programme  c'est minuitLunaire qui commande , < minuitLunaire = phase montante , > minuitLunaire = phase descendante ,

je vous ai mis juste les fonctions du programme (trop long le programme complet) .

d'avance merci .         

 
 
void draw(void) {
setPwmLune(); 
}                  
int calculPwm( int TimeMins, int riseMin, int setMin) { 
  DateTime now = RTC.now();
   TimeMins =  (now.hour() * 60) + now.minute(); 
   riseMin = Rise_time[0] * 60 + Rise_time[1];
   setMin  = Set_time[0]*60 + Set_time[1];
  int pwm = 0;
  int minuitLunaire = (riseMin + setMin) / 2;
  
    int minuit_lunaire_Min=(riseMin+setMin)/2;
    minuit_lunaire_Min =(riseMin+setMin)/2;
    lunaire_Min = (minuit_lunaire_Min)%60;
    minuit_lunaire_Hour =(riseMin+setMin)/2;
    lunaire_Hour = (minuit_lunaire_Hour)/60;
    minuitLunaire=(riseMin+setMin)/2;
  // gestion du cas où le levé est plus tard que le couché  pour la lune
    
      
      if( riseMin > setMin) 
       setMin+= 24 * 60; // ajout de 24h...
        
       
      if( TimeMins < riseMin )
      TimeMins += 24 * 60; // ajout de 24h...
     // fin de la gestion
  
    
  
  
  /* phase montante*/
  if(TimeMins > riseMin && TimeMins <=minuit Lunaire) {//<=au lieu de <
    pwm = map( TimeMins, riseMin,minuitLunaire , 0, valeur_Moon); 
  }

  /* phase descendante */
  if(TimeMins > minuitLunaire && TimeMins < setMin) {
    pwm = map( TimeMins, minuitLunaire, setMin, valeur_Moon, 0); 
  }
    
  return pwm;
      
  }
void setPwmLune() {
  DateTime now = RTC.now();
  TimeMins = (now.hour() * 60) + now.minute();
  int riseMin = Rise_time[0] * 60 + Rise_time[1]; // Attention variables globales à modifier avec des fonctions...
  int setMin = Set_time[0]*60 + Set_time[1]; // Attention variables globales ...
  int minuitLunaire ;
  int pwmLune = calculPwm ( TimeMins, riseMin, setMin );
  u8g.setFont(u8g_font_6x10);
  u8g.setPrintPos(0,30);
  u8g.print("Lune: ");
  u8g.print(pwmLune);
  analogWrite(PINPWMLUNE, pwmLune);

}






#113623 course du soleil

Posté par michel sur 23 mai 2021 - 05:23 dans Conseils et aide aux débutants, livres et kits en robotique

bonjour Mike 118 ,

je reviens sur le code #200 

la fonction 

// gestion du cas où le levé est plus tard que le couché comme pour la lune on décale de 24h pour faciliter les calculs
  if ( riseTime > setTime)
    setTime += 24 * 60; // ajout de 24h...
  if ( currentTime < riseTime )
    currentTime += 24 * 60; // ajout de 24h ...
  // fin de la gestion 

quand riseTime < setTime tout ce passe correctement .

quand riseTime > setTime (aujourd'hui riseTime 17h16 ,set Time 4h21 j+1) la rampe pwm s'allume et indique déja" 121" et non "1 " ou " 0" selon le calcul du map .

si tu as eu idée , je suis preneur .

bonne soirée,




#111239 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 23 septembre 2020 - 02:41 dans Conseils et aide aux débutants, livres et kits en robotique

Mike ,

je vois bien que je t'énerve parce que je ne comprend pas  .

j'en suis profondément désolé .

merci pour tes efforts et tant pis pour moi je n'arrive pas à faire ce programme .

Je laisse tomber .

bonne soirée .




#111236 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 23 septembre 2020 - 01:08 dans Conseils et aide aux débutants, livres et kits en robotique

Mike ,

't' was not declared in this scope sur Sunrise(t); dans void loop()

#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <TimeLib.h>
int Sunrise;
int SunriseHour;
int SunsetHour;
int SunriseMin;
int SunsetMin;

const char* ssid     = "freeboxbabette";                 // SSID of local network
const char* password = "FC56BF8323";                    // Password on network
String APIKEY = "8b3016c8fecf7dad2d84dfba699ae0ba";                                 
String CityID = "6454924";                                 //Your City ID

WiFiClient client;
char servername[]="api.openweathermap.org";              // remote server we will connect to
String result;

int  counter = 60;                                      

String weatherDescription ="";
String weatherLocation = "";
String Country;
String weatherID;
float Temperature;
float Humidity;
float Pressure;
double Latitude = 0.0;
double Longitude = 0.0;
//uint32_t t Sunrise;

LiquidCrystal_I2C lcd(0x3F, 20, 4);    // Address of your i2c LCD back pack should be updated.

void setup() {
  Serial.begin(115200);
  int cursorPosition=0;
  lcd.begin();
  lcd.backlight();
  lcd.print("   Connecting");  
  Serial.println("Connecting");
  WiFi.begin(ssid, password);
 
             while (WiFi.status() != WL_CONNECTED)
            {
            delay(500);
            lcd.setCursor(cursorPosition,2);
            lcd.print(".");
            cursorPosition++;
            }
  lcd.clear();
  lcd.print("   Connected!");
  Serial.println("Connected");
  delay(1000);
}

void loop() {
    Sunrise(t);
    if(counter == 60)                                 //Get new data every 10 minutes
    {
      counter = 0;
      displayGettingData();
      delay(1000);
      getWeatherData();
    }else
    {
      counter++;
      displayWeather(weatherLocation,weatherDescription);
      delay(5000);
      displayConditions(Temperature,Humidity,Pressure,Latitude,Longitude);
      delay(5000);
    }
}

void getWeatherData()                                //client function to send/receive GET request data.
{
  if (client.connect(servername, 80))   
          {                                         //starts client connection, checks for connection
          client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
          client.println("Host: api.openweathermap.org");
          client.println("User-Agent: ArduinoWiFi/1.1");
          client.println("Connection: close");
          client.println();
          }
  else {
         Serial.println("connection failed");        //error message if no client connect
          Serial.println();
       }

  while(client.connected() && !client.available())
  delay(1);                                          //waits for data
  while (client.connected() || client.available())    
       {                                             //connected or data available
         char c = client.read();                     //gets byte from ethernet buffer
         result = result+c;
       }

client.stop();                                      //stop client
result.replace('[', ' ');
result.replace(']', ' ');
Serial.println(result);
char jsonArray [result.length()+1];
result.toCharArray(jsonArray,sizeof(jsonArray));
jsonArray[result.length() + 1] = '\0';
StaticJsonBuffer<1024> json_buf;
JsonObject &root = json_buf.parseObject(jsonArray);

if (!root.success())
  {
    Serial.println("parseObject() failed");
  }
//uint32_t t = root["sunrise"];
String location = root["name"];
String country = root["sys"]["country"];
float humidity = root["main"]["humidity"];
String weather = root["weather"]["main"];
String description = root["weather"]["description"];
float pressure = root["main"]["pressure"];
long time = root["time"];
double latitude = root["coord"]["lat"];
double longitude = root["coord"]["lon"];
weatherDescription = description;
weatherLocation = location;
Country = country;
Temperature = temperature;
Humidity = humidity;
Pressure = pressure;
Latitude = latitude;
Longitude = longitude;


}

void displayWeather(String location,String description)
{
 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(location);
  lcd.print(", ");
  lcd.print(Country);
  lcd.setCursor(0,1);
  lcd.print(description);               
 
}

 lcd.print;
}
void displayConditions(float Temperature,float Humidity, float Pressure,double latitude,double longitude)
{
 lcd.clear();                            //Print Temperature
 lcd.print("T:");
 lcd.print(Temperature,1);
 lcd.print((char)223);
 lcd.print("C ");
                                         
 lcd.print(" H:");                       //Print Humidity
 lcd.print(Humidity,0);
 lcd.print(" %");
 
 lcd.setCursor(0,1);                     //Print Pressure
 lcd.print("P: ");
 lcd.print(Pressure,1);
 lcd.print(" hPa");
 
 lcd.setCursor(0,2);                    //Print Latitude
 lcd.print("Lat:");
 lcd.print(latitude, 2);
 
 lcd.setCursor(10,2);                   //Print Longitude
 lcd.print("Lon:");
 lcd.print(longitude, 2);
 
}

void displayGettingData()
{
  lcd.clear();
  lcd.print("Getting data");
}
void Sunrise(uint32_t t){
  uint32_t t = root["sunrise"];
  char buff[32];
  sprintf( buff,"%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));
  Serial.println("sunrise");
  Serial.println(buff);
  SunriseHour = (buff ,hour(t)+timezone);
  SunriseMin = (buff,minute(t));
  Serial.println("sunriseMin");
  Serial.println (SunriseHour*60+SunriseMin);
 
}
 
 
 



#111233 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 23 septembre 2020 - 10:44 dans Conseils et aide aux débutants, livres et kits en robotique

bonjour Mike,

toujours un soucis  Sunrise(uint32_t t);   expected primary-expression before 't'

#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <TimeLib.h>
int Sunrise;
int SunriseHour;
int SunsetHour;
int SunriseMin;
int SunsetMin;

const char* ssid     = "freeboxbabette";                 // SSID of local network
const char* password = "FC56BF8323";                    // Password on network
String APIKEY = "8b3016c8fecf7dad2d84dfba699ae0ba";                                 
String CityID = "6454924";                                 //Your City ID

WiFiClient client;
char servername[]="api.openweathermap.org";              // remote server we will connect to
String result;

int  counter = 60;                                      

String weatherDescription ="";
String weatherLocation = "";
String Country;
String weatherID;
float Temperature;
float Humidity;
float Pressure;
double Latitude = 0.0;
double Longitude = 0.0;
//uint32_t t Sunrise;

LiquidCrystal_I2C lcd(0x3F, 20, 4);    // Address of your i2c LCD back pack should be updated.

void setup() {
  Serial.begin(115200);
  int cursorPosition=0;
  lcd.begin();
  lcd.backlight();
  lcd.print("   Connecting");  
  Serial.println("Connecting");
  WiFi.begin(ssid, password);
 
             while (WiFi.status() != WL_CONNECTED)
            {
            delay(500);
            lcd.setCursor(cursorPosition,2);
            lcd.print(".");
            cursorPosition++;
            }
  lcd.clear();
  lcd.print("   Connected!");
  Serial.println("Connected");
  delay(1000);
}

void loop() {
    Sunrise(uint32_t t);   expected primary-expression before 't'
    if(counter == 60)                                 //Get new data every 10 minutes
    {
      counter = 0;
      displayGettingData();
      delay(1000);
      getWeatherData();
    }else
    {
      counter++;
      displayWeather(weatherLocation,weatherDescription);
      delay(5000);
      displayConditions(Temperature,Humidity,Pressure,Latitude,Longitude);
      delay(5000);
    }
}

void getWeatherData()                                //client function to send/receive GET request data.
{
  if (client.connect(servername, 80))   
          {                                         //starts client connection, checks for connection
          client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
          client.println("Host: api.openweathermap.org");
          client.println("User-Agent: ArduinoWiFi/1.1");
          client.println("Connection: close");
          client.println();
          }
  else {
         Serial.println("connection failed");        //error message if no client connect
          Serial.println();
       }

  while(client.connected() && !client.available())
  delay(1);                                          //waits for data
  while (client.connected() || client.available())    
       {                                             //connected or data available
         char c = client.read();                     //gets byte from ethernet buffer
         result = result+c;
       }

client.stop();                                      //stop client
result.replace('[', ' ');
result.replace(']', ' ');
Serial.println(result);
char jsonArray [result.length()+1];
result.toCharArray(jsonArray,sizeof(jsonArray));
jsonArray[result.length() + 1] = '\0';
StaticJsonBuffer<1024> json_buf;
JsonObject &root = json_buf.parseObject(jsonArray);

if (!root.success())
  {
    Serial.println("parseObject() failed");
  }
uint32_t t = root["sunrise"];
String location = root["name"];
String country = root["sys"]["country"];
float humidity = root["main"]["humidity"];
String weather = root["weather"]["main"];
String description = root["weather"]["description"];
float pressure = root["main"]["pressure"];
long time = root["time"];
double latitude = root["coord"]["lat"];
double longitude = root["coord"]["lon"];
weatherDescription = description;
weatherLocation = location;
Country = country;
Temperature = temperature;
Humidity = humidity;
Pressure = pressure;
Latitude = latitude;
Longitude = longitude;


}

void displayWeather(String location,String description)
{
 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(location);
  lcd.print(", ");
  lcd.print(Country);
  lcd.setCursor(0,1);
  lcd.print(description);               
 
}

 lcd.print;
}
void displayConditions(float Temperature,float Humidity, float Pressure,double latitude,double longitude)
{
 lcd.clear();                            //Print Temperature
 lcd.print("T:");
 lcd.print(Temperature,1);
 lcd.print((char)223);
 lcd.print("C ");
                                         
 lcd.print(" H:");                       //Print Humidity
 lcd.print(Humidity,0);
 lcd.print(" %");
 
 lcd.setCursor(0,1);                     //Print Pressure
 lcd.print("P: ");
 lcd.print(Pressure,1);
 lcd.print(" hPa");
 
 lcd.setCursor(0,2);                    //Print Latitude
 lcd.print("Lat:");
 lcd.print(latitude, 2);
 
 lcd.setCursor(10,2);                   //Print Longitude
 lcd.print("Lon:");
 lcd.print(longitude, 2);
 
}

void displayGettingData()
{
  lcd.clear();
  lcd.print("Getting data");
}
void Sunrise(uint32_t t){
  uint32_t t = root["sunrise"];
  char buff[32];
  sprintf( buff,"%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));
  Serial.println("sunrise");
  Serial.println(buff);
  SunriseHour = (buff ,hour(t)+timezone);
  SunriseMin = (buff,minute(t));
  Serial.println("sunriseMin");
  Serial.println (SunriseHour*60+SunriseMin);
 
}
 
 



#111229 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 22 septembre 2020 - 04:49 dans Conseils et aide aux débutants, livres et kits en robotique

Bonjour Mike,

je n'ai toujours pas trouver comment faire .

uint32_t (= unsigned long) ; comme ça il me dit '=' pas bon

uint32_t ( unsigned long) ;'(' pas bon

uint32_t  unsigned long) ; ')' pas bon

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

unsigned long t ;
uint32_t  unsigned long ; declaration does not declare anything [-fpermissive]
uint32_t (= unsigned long) ;

j'ai passer toute l' aprés-midi sans résultat .

voila bonne soirée .




#111211 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 21 septembre 2020 - 04:05 dans Conseils et aide aux débutants, livres et kits en robotique

Bonjour Mike ,

tu m'a dit de venir quand j’étais bloquer .

CE CODE FONCTIONNE j'ai bien date,mois,année,heure,minute,seconde(sunrise)

 
#include <TimeLib.h>
#include <ArduinoJson.h>

int timezone = +2;
int root;
int SunriseHour;
int SunriseMin;

void setup() {

  Serial.begin(115200);
 
}

void loop() {
  Sunrise();
 
}
 void Sunrise(){
  const char* json = "{\"country\":\"JP\",\"sunrise\":1600665442,\"sunset\":1369821049,\"timezone\":7200}";
  DynamicJsonBuffer jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(json);
  unsigned long t = root["sunrise"];
  char buff[32];
  sprintf(buff, "%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));
  Serial.println("sunrise");
  Serial.println(buff);
  SunriseHour = (buff ,hour(t)+timezone);
  SunriseMin = (buff,minute(t));
  Serial.println("sunriseMin");
  Serial.println (SunriseHour*60+SunriseMin);
 
}
 

j'ai voulu le mettre dans mon code avec le wifi et la j'ai une panne "expected primary-expression before ',' à la ligne

sprintf( buff,"%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));

dans void Sunrise()

d'avance merci

#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <TimeLib.h>

int SunriseHour;
int SunsetHour;
int SunriseMin;
int SunsetMin;

const char* ssid     = "freeboxbabette";                 // SSID of local network
const char* password = "FC56BF8323";                    // Password on network
String APIKEY = "8b3016c8fecf7dad2d84dfba699ae0ba";                                 
String CityID = "6454924";                                 //Your City ID

WiFiClient client;
char servername[]="api.openweathermap.org";              // remote server we will connect to
String result;

int  counter = 60;                                      

String weatherDescription ="";
String weatherLocation = "";
//uint32_t Sunrise;
String Country;
String weatherID;
float Temperature;
float Humidity;
float Pressure;
double Latitude = 0.0;
double Longitude = 0.0;

LiquidCrystal_I2C lcd(0x3F, 20, 4);    // Address of your i2c LCD back pack should be updated.

void setup() {
  Serial.begin(115200);
  int cursorPosition=0;
  lcd.begin();
  lcd.backlight();
  lcd.print("   Connecting");  
  Serial.println("Connecting");
  WiFi.begin(ssid, password);
 
             while (WiFi.status() != WL_CONNECTED)
            {
            delay(500);
            lcd.setCursor(cursorPosition,2);
            lcd.print(".");
            cursorPosition++;
            }
  lcd.clear();
  lcd.print("   Connected!");
  Serial.println("Connected");
  delay(1000);
}

void loop() {
    Sunrise();
    if(counter == 60)                                 //Get new data every 10 minutes
    {
      counter = 0;
      displayGettingData();
      delay(1000);
      getWeatherData();
    }else
    {
      counter++;
      displayWeather(weatherLocation,weatherDescription);
      delay(5000);
      displayConditions(Temperature,Humidity,Pressure,Latitude,Longitude);
      delay(5000);
    }
}

void getWeatherData()                                //client function to send/receive GET request data.
{
  if (client.connect(servername, 80))   
          {                                         //starts client connection, checks for connection
          client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
          client.println("Host: api.openweathermap.org");
          client.println("User-Agent: ArduinoWiFi/1.1");
          client.println("Connection: close");
          client.println();
          }
  else {
         Serial.println("connection failed");        //error message if no client connect
          Serial.println();
       }

  while(client.connected() && !client.available())
  delay(1);                                          //waits for data
  while (client.connected() || client.available())    
       {                                             //connected or data available
         char c = client.read();                     //gets byte from ethernet buffer
         result = result+c;
       }

client.stop();                                      //stop client
result.replace('[', ' ');
result.replace(']', ' ');
Serial.println(result);
char jsonArray [result.length()+1];
result.toCharArray(jsonArray,sizeof(jsonArray));
jsonArray[result.length() + 1] = '\0';
StaticJsonBuffer<1024> json_buf;
JsonObject &root = json_buf.parseObject(jsonArray);

if (!root.success())
  {
    Serial.println("parseObject() failed");
  }

String location = root["name"];
String country = root["sys"]["country"];
//unsigned long t = root["sys"]["sunrise"];
float temperature = root["main"]["temp"];
float humidity = root["main"]["humidity"];
String weather = root["weather"]["main"];
String description = root["weather"]["description"];
float pressure = root["main"]["pressure"];
long time = root["time"];
double latitude = root["coord"]["lat"];
double longitude = root["coord"]["lon"];
weatherDescription = description;
weatherLocation = location;
Country = country;
Temperature = temperature;
Humidity = humidity;
Pressure = pressure;
Latitude = latitude;
Longitude = longitude;


}

void displayWeather(String location,String description)
{
 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(location);
  lcd.print(", ");
  lcd.print(Country);
  lcd.setCursor(0,1);
  lcd.print(description);               //print sunrise
 
 
}

void displayConditions(float Temperature,float Humidity, float Pressure,double latitude,double longitude)
{
 lcd.clear();                            //Print Temperature
 lcd.print("T:");
 lcd.print(Temperature,1);
 lcd.print((char)223);
 lcd.print("C ");
                                         
 lcd.print(" H:");                       //Print Humidity
 lcd.print(Humidity,0);
 lcd.print(" %");
 
 lcd.setCursor(0,1);                     //Print Pressure
 lcd.print("P: ");
 lcd.print(Pressure,1);
 lcd.print(" hPa");
 
 lcd.setCursor(0,2);                    //Print Latitude
 lcd.print("Lat:");
 lcd.print(latitude, 2);
 
 lcd.setCursor(10,2);                   //Print Longitude
 lcd.print("Lon:");
 lcd.print(longitude, 2);
 
}

void displayGettingData()
{
  lcd.clear();
  lcd.print("Getting data");
}
void Sunrise(){
  int root;
  unsigned long t = root["sunrise"];
  char buff[32];
  sprintf( buff,"%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));
  Serial.println("sunrise");
  Serial.println(buff);
  SunriseHour = (buff ,hour(t)+timezone);
  SunriseMin = (buff,minute(t));
  Serial.println("sunriseMin");
  Serial.println (SunriseHour*60+SunriseMin);
 
}
 
 
 
 
 
 
 
 
 
 



#111169 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 20 septembre 2020 - 04:15 dans Conseils et aide aux débutants, livres et kits en robotique

reBonjour,Mike

j'ai fait ce code cela fonctionne très bien dans son contexte mais impossible de le mettre dans mon code .

 ne crois pas que je me repose sur toi .

j'ai chercher toute l’après-midi mais rien à faire je ne trouve pas .

bonne soirée.

Serial.println :

sunrise
20.09.2020 07:16:15 sunrise +2
 

#include <TimeLib.h>
#include <ArduinoJson.h>

void setup() {

  Serial.begin(115200);
 
  const char* json = "{\"country\":\"JP\",\"sunrise\":1600578975,\"sunset\":1369821049,\"timezone\":7200}";
  int timezone = +2;

  DynamicJsonBuffer jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(json);

  unsigned long t = root["sunrise"];

  char buff[32];
  sprintf(buff, "%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t)+timezone, minute(t), second(t));
  Serial.println("sunrise");
  Serial.print(buff);
}

void loop() {
 
}



#111165 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 20 septembre 2020 - 10:30 dans Conseils et aide aux débutants, livres et kits en robotique

bonjour Mike,

je te rappel que je suis amateur et ta librairie je n'y comprend rien du tout .

Bon dimanche .




#111153 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 19 septembre 2020 - 06:22 dans Conseils et aide aux débutants, livres et kits en robotique

Bonjour Mike,

j'ai réussi à afficher le sunrise "1600492508" sur l'ecran mais je ne sais pas comment convertir en

year,month,day,hour,minute,seconde.

d'avance merci .

#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <TimeLib.h>

const char* ssid     = "freeboxbabette";                 // SSID of local network
const char* password = "FC56BF8323";                    // Password on network
String APIKEY = "8b3016c8fecf7dad2d84dfba699ae0ba";                                 
String CityID = "6454924";                                 //Your City ID

WiFiClient client;
char servername[]="api.openweathermap.org";              // remote server we will connect to
String result;

int  counter = 60;                                      

String weatherDescription ="";
String weatherLocation = "";
uint32_t Sunrise;
String Country;
String weatherID;
float Temperature;
float Humidity;
float Pressure;
double Latitude = 0.0;
double Longitude = 0.0;

LiquidCrystal_I2C lcd(0x3F, 20, 4);    // Address of your i2c LCD back pack should be updated.

void setup() {
  Serial.begin(115200);
  int cursorPosition=0;
  lcd.begin();
  lcd.backlight();
  lcd.print("   Connecting");  
  Serial.println("Connecting");
  WiFi.begin(ssid, password);
 
             while (WiFi.status() != WL_CONNECTED)
            {
            delay(500);
            lcd.setCursor(cursorPosition,2);
            lcd.print(".");
            cursorPosition++;
            }
  lcd.clear();
  lcd.print("   Connected!");
  Serial.println("Connected");
  delay(1000);
}

void loop() {
    
    if(counter == 60)                                 //Get new data every 10 minutes
    {
      counter = 0;
      displayGettingData();
      delay(1000);
      getWeatherData();
    }else
    {
      counter++;
      displayWeather(weatherLocation,weatherDescription);
      delay(5000);
      displayConditions(Temperature,Humidity,Pressure,Latitude,Longitude,Sunrise);
      delay(5000);
    }
}

void getWeatherData()                                //client function to send/receive GET request data.
{
  if (client.connect(servername, 80))   
          {                                         //starts client connection, checks for connection
          client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
          client.println("Host: api.openweathermap.org");
          client.println("User-Agent: ArduinoWiFi/1.1");
          client.println("Connection: close");
          client.println();
          }
  else {
         Serial.println("connection failed");        //error message if no client connect
          Serial.println();
       }

  while(client.connected() && !client.available())
  delay(1);                                          //waits for data
  while (client.connected() || client.available())    
       {                                             //connected or data available
         char c = client.read();                     //gets byte from ethernet buffer
         result = result+c;
       }

client.stop();                                      //stop client
result.replace('[', ' ');
result.replace(']', ' ');
Serial.println(result);
char jsonArray [result.length()+1];
result.toCharArray(jsonArray,sizeof(jsonArray));
jsonArray[result.length() + 1] = '\0';
StaticJsonBuffer<1024> json_buf;
JsonObject &root = json_buf.parseObject(jsonArray);

if (!root.success())
  {
    Serial.println("parseObject() failed");
  }

String location = root["name"];
String country = root["sys"]["country"];
uint32_t sunrise = root["sys"]["sunrise"];
float temperature = root["main"]["temp"];
float humidity = root["main"]["humidity"];
String weather = root["weather"]["main"];
String description = root["weather"]["description"];
float pressure = root["main"]["pressure"];
long time = root["time"];
double latitude = root["coord"]["lat"];
double longitude = root["coord"]["lon"];
weatherDescription = description;
weatherLocation = location;
Country = country;
Temperature = temperature;
Humidity = humidity;
Pressure = pressure;
Latitude = latitude;
Longitude = longitude;
Sunrise =  sunrise;

}

void displayWeather(String location,String description)
{
 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(location);
  lcd.print(", ");
  lcd.print(Country);
  lcd.setCursor(0,1);
  lcd.print(description);               //print sunrise
 
 
}

void displayConditions(float Temperature,float Humidity, float Pressure,double latitude,double longitude,uint32_t Sunrise )
{
 lcd.clear();                            //Print Temperature
 lcd.print("T:");
 lcd.print(Temperature,1);
 lcd.print((char)223);
 lcd.print("C ");
                                         
 lcd.print(" H:");                       //Print Humidity
 lcd.print(Humidity,0);
 lcd.print(" %");
 
 lcd.setCursor(0,1);                     //Print Pressure
 lcd.print("P: ");
 lcd.print(Pressure,1);
 lcd.print(" hPa");
 
 lcd.setCursor(0,2);                    //Print Latitude
 lcd.print("Lat:");
 lcd.print(latitude, 2);
 
 lcd.setCursor(10,2);                   //Print Longitude
 lcd.print("Lon:");
 lcd.print(longitude, 2);
        
 lcd.setCursor(0,3);                    //Print Sunrise
 lcd.print(Sunrise);
}

void displayGettingData()
{
  lcd.clear();
  lcd.print("Getting data");
}
 



#111130 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 18 septembre 2020 - 04:34 dans Conseils et aide aux débutants, livres et kits en robotique

avec api : api.openweathermap.org.

Connecting
Connected
{"coord":{"lon":7.25,"lat":43.7},"weather": {"id":801,"main":"Clouds","description":"few clouds","icon":"02d"} ,"base":"stations","main":{"temp":27.62,"feels_like":29.2,"temp_min":26.11,"temp_max":28.33,"pressure":1018,"humidity":58},"visibility":10000,"wind":{"speed":2.1,"deg":200},"clouds":{"all":23},"dt":1600443005,"sys":{"type":1,"id":6515,"country":"FR","sunrise":1600406041,"sunset":1600450573},"timezone":7200,"id":6454924,"name":"Nice","cod":200}

Voila toute la trame API sur le Serial port

 




#111120 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 18 septembre 2020 - 07:08 dans Conseils et aide aux débutants, livres et kits en robotique

Bonjour,Mike

je parler de décoder toujours  la trame json ("sunrise":1600406041,"sunset":1600450573},"timezone":7200,"id":6454924,"name":"Nice","cod":200}

d'avance merci .

il faudrais que je trouve une autre cley api qui me donne d'avantage d'infos ""Moonset,Moonrise" "phase de la lune"

bonne journée.

 




#111109 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 17 septembre 2020 - 04:04 dans Conseils et aide aux débutants, livres et kits en robotique

bonsoir Mike;

j'ai trouvé un code qui fonctionne .

tu pourrais m’aiguillée  pour Sunset / Sunrise s'il te plait .

d'avance merci .

[attachment=12020:IMG_1861.JPG]

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

const char* ssid     = "freeboxbabette";                 // SSID of local network
const char* password = "FC56BF8323";                    // Password on network
String APIKEY = "8b3016c8fecf7dad2d84dfba699ae0ba";                                 
String CityID = "6454924";                                 //Your City ID

WiFiClient client;
char servername[]="api.openweathermap.org";              // remote server we will connect to
String result;

int  counter = 60;                                      

String weatherDescription ="";
String weatherLocation = "";
String Country;
String weatherID;
float Temperature;
float Humidity;
float Pressure;
double Latitude = 0.0;
double Longitude = 0.0;

LiquidCrystal_I2C lcd(0x3F, 20, 4);    // Address of your i2c LCD back pack should be updated.

void setup() {
  Serial.begin(115200);
  int cursorPosition=0;
  lcd.begin();
  lcd.backlight();
  lcd.print("   Connecting");  
  Serial.println("Connecting");
  WiFi.begin(ssid, password);
 
             while (WiFi.status() != WL_CONNECTED)
            {
            delay(500);
            lcd.setCursor(cursorPosition,2);
            lcd.print(".");
            cursorPosition++;
            }
  lcd.clear();
  lcd.print("   Connected!");
  Serial.println("Connected");
  delay(1000);
}

void loop() {
    if(counter == 60)                                 //Get new data every 10 minutes
    {
      counter = 0;
      displayGettingData();
      delay(1000);
      getWeatherData();
    }else
    {
      counter++;
      displayWeather(weatherLocation,weatherDescription);
      delay(5000);
      displayConditions(Temperature,Humidity,Pressure,Latitude,Longitude);
      delay(5000);
    }
}

void getWeatherData()                                //client function to send/receive GET request data.
{
  if (client.connect(servername, 80))   
          {                                         //starts client connection, checks for connection
          client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
          client.println("Host: api.openweathermap.org");
          client.println("User-Agent: ArduinoWiFi/1.1");
          client.println("Connection: close");
          client.println();
          }
  else {
         Serial.println("connection failed");        //error message if no client connect
          Serial.println();
       }

  while(client.connected() && !client.available())
  delay(1);                                          //waits for data
  while (client.connected() || client.available())    
       {                                             //connected or data available
         char c = client.read();                     //gets byte from ethernet buffer
         result = result+c;
       }

client.stop();                                      //stop client
result.replace('[', ' ');
result.replace(']', ' ');
Serial.println(result);
char jsonArray [result.length()+1];
result.toCharArray(jsonArray,sizeof(jsonArray));
jsonArray[result.length() + 1] = '\0';
StaticJsonBuffer<1024> json_buf;
JsonObject &root = json_buf.parseObject(jsonArray);

if (!root.success())
  {
    Serial.println("parseObject() failed");
  }

String location = root["name"];
String country = root["sys"]["country"];
float temperature = root["main"]["temp"];
float humidity = root["main"]["humidity"];
String weather = root["weather"]["main"];
String description = root["weather"]["description"];
float pressure = root["main"]["pressure"];
long time = root["time"];
double latitude = root["coord"]["lat"];
double longitude = root["coord"]["lon"];
weatherDescription = description;
weatherLocation = location;
Country = country;
Temperature = temperature;
Humidity = humidity;
Pressure = pressure;
Latitude = latitude;
Longitude = longitude;
}

void displayWeather(String location,String description)
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(location);
  lcd.print(", ");
  lcd.print(Country);
  lcd.setCursor(0,1);
  lcd.print(description);
 
}

void displayConditions(float Temperature,float Humidity, float Pressure,double latitude,double longitude )
{
 lcd.clear();                            //Print Temperature
 lcd.print("T:");
 lcd.print(Temperature,1);
 lcd.print((char)223);
 lcd.print("C ");
                                         
 lcd.print(" H:");                       //Print Humidity
 lcd.print(Humidity,0);
 lcd.print(" %");
 
 lcd.setCursor(0,1);                     //Print Pressure
 lcd.print("P: ");
 lcd.print(Pressure,1);
 lcd.print(" hPa");
 
 lcd.setCursor(0,2);                    //Print Latitude
 lcd.print("Lat:");
 lcd.print(latitude, 2);
 
 lcd.setCursor(10,2);                   //Print Longitude
 lcd.print("Lon:");
 lcd.print(longitude, 2);
}

void displayGettingData()
{
  lcd.clear();
  lcd.print("Getting data");
}




#111095 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 17 septembre 2020 - 06:48 dans Conseils et aide aux débutants, livres et kits en robotique

bonjour, Mike.

je vais essayer en prenant ton exemple .

je te souhaite une bonne journée.




#111081 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 16 septembre 2020 - 04:17 dans Conseils et aide aux débutants, livres et kits en robotique

BONSOIR Mike;

j'ai vu sur internet ceci : https://itechnofranc...en-micropython/

c'est ce que j'aimerai faire convertir tout ce que j'ai besoin de la cley api pour pouvoir les utilser dans mon programme eclairage .

mais la c'est du python !!!

d'avance merci .




#111071 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 16 septembre 2020 - 07:31 dans Conseils et aide aux débutants, livres et kits en robotique

Bonjour, Mike ,Sandro,

dans mon éclairage pour Bonsai ou Aquarium je simule le levée et le couché du jour avec des librairies qui utilise une RTC , timezone, longitude et latitude .

en décodant la trame du json je pourrais exploitée ces données pour mon éclairage sans trop de composants.

j'avais pensée à cette solution ?

bonne ou pas .

merci encore en vous souhaitant une bonne journée.Michel




#111053 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 15 septembre 2020 - 03:50 dans Conseils et aide aux débutants, livres et kits en robotique

Bonjour Mike,

j'ai trouvé l'erreur const char* ssid "freeboxbabette" au lieu de "freboxbabette"

maintenant c'est ok .

 

j'ai vu dans Serial {"coord":{"lon":7.25,"lat":43.7},"weather": {"id":801,"main":"Clouds","description":"few clouds","icon":"02d"} ,"base":"stations","main":{"temp":

tu pourrais s'il te plait me dire comment utiliser la longitude et latitude ainsi que le timezone de l API pour pouvoir les afficher , je pense que se sont des valeurs brutes qu'ils faut transformées.

du coup j'ai réussi à faire fonctionner ma station weather de ThingPulse .

je te remerci beaucoup de m'avoir aider .

Bonne soirée.

[attachment=12011:IMG_1859.JPG]

[attachment=12012:IMG_1860.JPG]




#111043 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 14 septembre 2020 - 06:02 dans Conseils et aide aux débutants, livres et kits en robotique

elle reste sur (Connecting ...)




#111040 NodeMCU Weather Station on Arduino IDE

Posté par michel sur 14 septembre 2020 - 05:20 dans Conseils et aide aux débutants, livres et kits en robotique

dans l’écran précédent (j'avais Connecting et ..........................)

et dans le Serial 115200 (Connecting)