1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
| /// 1307_eeprom_uno_03.ino 9 janvier 2023
// version 03 pour introduire eeprom et procéder à des lectures écritures
// pour test hw-111 qui ne fonctionne pas sur nano
#include <Wire.h> // Bibliothèque pour l'I2C
#include "RTClib.h" // Bibliothèque pour le module RTC
#include <LiquidCrystal_I2C.h> // Bibliothèque pour l'écran
// pour eeprom
// ================= Définitions =====
int colonne = 0 ; // colonne écriture
uint16_t nbDeDump = 1000 ; // nombre de case de dump
uint8_t temoin = 5 ; // valeur à écrire
uint16_t quantite = 10 ; // nb octet à écrire
uint8_t Version = 10 ; // version du programme prévu de 0 à F
uint16_t Offset = 0 ; // décalage de l'écriture du temoin en eeprom
int seconde ; // la secone courante
int minute ; // la minute courante
int heure ; // la heure courante
#include "I2C_eeprom.h"
I2C_eeprom ee ( 0x50 , I2C_DEVICESIZE_24LC256 ) ;
// mes variables
int KA ; // poussoir 1
int KB ; // poussoir 2
int KC ; // poussoir 3
int KD ; // poussoir 4
int touches ; // "clavier" combiné
uint16_t cpt = 0 ; // comptage boucles
uint16_t cpt1 ; // compteur de boucle dump
int reep ; // read eeprom cad lecture EN eeprom
uint16_t Erreurs ; // comptage des erreurs
RTC_DS1307 RTC; // Instance du module RTC de type DS1307
// LiquidCrystal_I2C lcd ; // (0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); ////Instance d'écran
//LiquidCrystal_I2C lcd (0x3F, 2, 1, 0, 4, 5, 6, 7, 3 ) ; // , POSITIVE); ////Instance d'écran
LiquidCrystal_I2C lcd ( 0x27 , 16 , 2 ) ; // afficheur 2 lignes 16 caractères
//
void setup ( void )
{
Serial.begin ( 115200 ) ; // était 115200 bauds
//Initialisation de l'éran
lcd.begin ( 16 , 2 ) ; // 16 col, 2 lignes
lcd.init () ; // initialisation lcd
lcd.clear () ;
lcd.backlight () ;
// lcd.setCursor ( 0 , 0 ) ;
// lcd.setCursor(0, 1);
Wire.begin () ; // Initialise la liaison I2C
RTC.begin () ; // Initialise le module RTC
// Définition ports e/s
pinMode ( 9 , OUTPUT ) ; // borne 9 ou PB1 ou D9 en sortie
pinMode ( 10 , OUTPUT ) ; // borne 10 ou PB2 ou D10 en sortie
digitalWrite ( 9 , LOW ) ; // 0 par défaut
pinMode ( 2 , INPUT_PULLUP ) ; // entrée SW avec pull up borne D2 ou INT0 ou 32
pinMode ( 3 , INPUT_PULLUP ) ; // entrée SW avec pull up borne D3 ou INT1 ou 1
pinMode ( 4 , INPUT_PULLUP ) ; // entrée SW avec pull up borne D4 ou PD4 ou 2
pinMode ( 5 , INPUT_PULLUP ) ; // entrée
//Initialise la date et le jour au moment de la compilation
// /!\ /!\ Les lignes qui suivent sert à définir la date et l'heure afin de régler le module,
// pour les montages suivant il ne faut surtout PAS la mettre, sans à chaque démarrage
// le module se réinitialisera à la date et heure de compilation
// DateTime dt = DateTime ( __DATE__ , __TIME__ ) ; // debug = supprimé
// RTC.adjust ( dt ) ;
Serial.print ( "Source du fichier: " ) ;
Serial.print ( __FILE__ ) ; Serial.println ( "\tGuy du 30 dec 2022" ) ; // mon commentaire initial
Serial.print ( "Version EEPROM: " ) ;
Serial.println ( I2C_EEPROM_VERSION ) ;
ee.begin () ; // initialisation dialogue
}
// ==== Entrée dans la boucle
void loop ()
{
// lcd.setCursor ( 0 , 0 ) ;
DateTime now = RTC.now () ; //Récupère l'heure et le date courante
affiche_date_heure ( now ) ; //Converti la date en langue humaine
// seconde = now.second () ;
// lcd.setCursor ( 14 , 1 ) ;
// lcd.print ( "TATA" ) ;
seconde = now.second () ;
heure = now.hour () ;
minute = now.minute () ;
// lcd.print ( touches , DEC ) ; // clavier décodé
lcd.setCursor ( 0 , 1 ) ;
lcd.print ( Vers2Chiffres ( heure ) ) ; lcd.print ( ":" ) ;
lcd.print ( Vers2Chiffres ( minute ) ) ; lcd.print ( ":" ) ;
lcd.print ( Vers2Chiffres ( seconde ) ) ; lcd.print ( ":" ) ;
if ( touches == 1 ) dumpEeprom () ; // lecture et affichage de eeprom toutes les minutes
lectureClavier () ; //
// lcd.setCursor ( 0 , 0 ) ;
// lcd.print ( "TOTO" ) ;
// lcd.print ( jour ) ;
// lcd.setCursor ( 0 , 1 ) ;
// lcd.print ( "TATA" ) ;
delay ( 1000 ) ; // delais de 1 seconde
allumeBleu () ;
delay ( 500 ) ;
eteintBleu () ;
}
/// ===== fin du loop ====
//Converti le numéro de jour en jour /!\ la semaine commence un dimanche
String donne_jour_semaine ( uint8_t j )
{
switch ( j )
{
case 0: return "DIM";
case 1: return "LUN";
case 2: return "MAR";
case 3: return "MER";
case 4: return "JEU";
case 5: return "VEN";
case 6: return "SAM";
default: return " ";
}
}
/// =============================
// affiche la date et l'heure sur l'écran
void affiche_date_heure ( DateTime datetime )
{
// Date
String jour = donne_jour_semaine ( datetime.dayOfTheWeek ()) + " " +
Vers2Chiffres ( datetime.day () ) + "/" +
Vers2Chiffres ( datetime.month () ) + "/" +
String ( datetime.year () , DEC ) ;
//// ==================
// heure
String heure = "" ;
heure = Vers2Chiffres ( datetime.hour () ) + ":" +
Vers2Chiffres ( datetime.minute () ) + ":" +
Vers2Chiffres ( datetime.second () ) ;
/// ==========
//affichage sur l'écran
// jour = "LUN" ;
// heure = 12 ; // debug
lcd.clear ();
lcd.setCursor ( 0 , 0 ) ;
// lcd.print ( "TOTO" ) ;
lcd.print ( jour ) ;
}
/// ================
//permet d'afficher les nombres sur deux chiffres
String Vers2Chiffres ( byte nombre )
{
String resultat = "";
if ( nombre < 10 ) resultat = "0" ;
return resultat += String ( nombre , DEC ) ;
}
//// =======================
void dumpEeprom () // lecture et affichage de eeprom
{
Serial.println () ; // saut de ligne
Serial.print ( "\tDump de l'eeprom (" ) ; // message
Serial.print ( nbDeDump , DEC ) ; // précise le nombre
Serial.println ( " octets)" ) ; // terminaison message
// for ( cpt1 = 0 ; cpt1 < 10101 ; cpt1 ++ ) // définition de la boucle
for ( cpt1 = 0 ; cpt1 < nbDeDump ; cpt1 ++ ) // définition de la boucle 32767
{
reep = ee.readByte ( cpt1 ) ; // lecture courante
// reep &= 0x0F ; // masquer msb //debug
if ( cpt1 % 100 == 0 )
{
Serial.print ( "\t@ " ) ; Serial.print ( cpt1 , DEC ) ; // adresse
Serial.println () ; // fin de ligne
}
if ( reep == 0 ) Serial.print ( "-" ) ;
if ( cpt1 % 10 == 0 ) Serial.print ( " " ) ; // séparateur dizaines
if ( reep != 0 ) Serial.print ( reep , HEX ) ;
}
Serial.println () ; // saut de ligne terminal
Serial.println ( "Fin du dump" ) ; //
Serial.println () ; //
}
// ===========
void allumeBleu ()
{
digitalWrite ( 9 , HIGH ) ; // allume
}
// ========
void eteintBleu ()
{
digitalWrite ( 9 , LOW ) ; // allume
}
// ========
void lectureClavier () // lecture des boutons
{
KA = digitalRead ( 2 ) ; // lecture poussoir 1
KB = digitalRead ( 3 ) ; // lecture poussoir 2
KC = digitalRead ( 4 ) ; // poussoir 3
KD = digitalRead ( 5 ) ; // poussoir 4
if ( KA == 1 ) KA = 0 ; else KA = 1 ; // inversion
if ( KB == 1 ) KB = 0 ; else KB = 2 ; // inversion et poids 2
if ( KC == 1 ) KC = 0 ; else KC = 4 ; // inversion et poids
if ( KD == 1 ) KD = 0 ; else KD = 8 ; // inversion et poids
touches = KA + KB + KC + KD ; // KC en positon2
lcd.setCursor ( 14 , 1 ) ;
lcd.print ( touches , DEC ) ; // clavier décodé
} |
Partager