ArduiTemp: Temperature, Arduino, LOLShield

ArduiTempYesterday, an idea just jumped in my mind. I was thinking about using my arduino and my LOLShield to display the local temperature. I tried to figure out how to achieve this the whole day. So I imagined a simple program. First, it will need to find the weather of a given city by requesting an url. Then, parse the information to extract temperature and finally, generate the code to turn on the right leds. The hackaton could begin.

I started digging the problem of compiling my code without any IDE, I found some Makefile but didn’t manage to make them work correctly. There was always something wrong. Finally, I discovered Ino, installed it et tested it with a sample code for the LOLShield. It compiled, uploaded the code: it worked well. I then search for a correct weather API with up to date data. I tested some and found wundergroud API, which corresponded to my need.

I then wrote the program I imagined during the day. I hadn’t encounter any specific problem during this step. I used NodeJs and request to perform retrieve data from the API and generate the code to compile for the arduino.

You can find this quick project on my github account under the name ArduiTemp. It was rewarding managing to produce a working solution in a small amount of time. Even though, I did not manage to use a simple Makefile, it would be interesting to write a correct Makefile from scratch. I think Ino source code could be helpful to achieve this.

Horloge Binaire Via Arduino + LoL Shield

Aujourd’hui, premier mars, je partage avec vous le code permettant l’affichage d’une horloge binaire sur votre LoL Shield contrôlé par Arduino. Cette horloge se divise en trois colonnes correspondant bien évidemment aux heures, minutes et secondes. Chaque colonne fait deux leds de large. Pour être correct, l’heure doit être initialisée à chaque fois que l’on relance le Arduino et il faut alors renvoyer le programme sur celui-ci. Il serait possible de synchroniser automatiquement l’horloge en se servant d’un shield Ethernet pour récupérer l’heure.

Quelques mots sur la fonction millis(). Cette fonction renvoie le nombre de millisecondes écoulées depuis que le Arduino a commencé à exécuter le programme en cours. Ce nombre revient à 0 après environ 50 jours. Ainsi, cette fonction va nous permettre d’incrémenter les secondes. Nous utiliserons le code suivant:

static unsigned long lastTick = 0;

if (millis() – lastTick >= 1000) {
 lastTick = millis();
 seconde++;}

Si le nombre de millisecondes depuis le début du programme moins le moment du dernier test est supérieur ou égale à 1 000, nous stockons le nombre de ms depuis le début du programme dans lastTick et nous incrémentons les secondes, dans le cas contraire, on ne change rien. Ainsi, toutes les 1 000 ms, les secondes seront incrémentées.

Pour la fonction LedSign::Set, la syntaxe est la suivante: LedSign::Set( C, L, E); . Avec C, le numéro de la colonne de la led concernée, L le numéro de la ligne et E l’état: 0 éteinte, 1 allumée. On a C = {0…13}, L = {0…8} et E = {0, 1}.

Voilà donc le code associé; la façon dont il est présenté ne me satisfait pas du tout. Pas évident d’afficher clairement du code avec WordPress…Donc finalement, j’ai trouvé un autre moyen, fournir le code directement dans un fichier texte: Horloge Binaire LoLShield

#include <avr/pgmspace.h>  //AVR library for writing to ROM
#include <Charliplexing.h> //Imports the library, which needs to be
//Initialized in setup.

void setup() {
  LedSign::Init();  //Initializes the screen
}

int seconde = 42;
int minute = 42;
int heure = 11;
int reste_heure,reste_minute, reste_seconde;

void loop() {
 static unsigned long lastTick = 0;

 //Incrémentation des secondes
 if (millis() - lastTick >= 1000) {
   lastTick = millis();
   seconde++;
 }


/*Remise à zéro des variables si celles-ci atteignent ou dépassent 60 pour les minutes et les secondes et 12 pour les heures.*/
 if(seconde >= 60) {
   minute++;
   seconde = 0;
 }

if(minute >= 60) {
 heure++;
 minute = 0;
}

if(heure >= 12) {
 heure = 0;
}

//calcul des leds allumées pour les heures
if(heure/8>=1) {
  LedSign::Set( 1, 5, 1);
  LedSign::Set( 2, 5, 1);
  reste_heure=heure%8;
} else {
  LedSign::Set( 1, 5, 0);
  LedSign::Set( 2, 5, 0);
  reste_heure=heure;
}

 if(reste_heure/4>=1) {
  LedSign::Set( 1, 6, 1);
  LedSign::Set( 2, 6, 1);
  reste_heure=reste_heure%4;
 } else {
  LedSign::Set( 1, 6, 0);
  LedSign::Set( 2, 6, 0);
 }

 if(reste_heure/2>=1) {
  LedSign::Set( 1, 7, 1);
  LedSign::Set( 2, 7, 1);
  reste_heure=reste_heure%2;
 } else {
  LedSign::Set( 1, 7, 0);
  LedSign::Set( 2, 7, 0);
 }

 if(reste_heure/1>=1) {
  LedSign::Set( 1, 8, 1);
  LedSign::Set( 2, 8, 1);
  reste_heure=reste_heure%1;
 } else {
  LedSign::Set( 1, 8, 0);
  LedSign::Set( 2, 8, 0);
 }

//calcul des leds allumées pour les minutes
 if((minute/32)>=1) {
  LedSign::Set( 6, 3, 1);
  LedSign::Set( 7, 3, 1);
  reste_minute=minute%32;
 } else {
  LedSign::Set( 6, 3, 0);
  LedSign::Set( 7, 3, 0);
  reste_minute=minute;
}

 if((reste_minute/16)>=1) {
  LedSign::Set( 6, 4, 1);
  LedSign::Set( 7, 4, 1);
  reste_minute=reste_minute%16;
 } else {
  LedSign::Set( 6, 4, 0);
  LedSign::Set( 7, 4, 0);
 }

 if((reste_minute/8)>=1) {LedSign::Set( 6, 5, 1); LedSign::Set( 7, 5, 1);reste_minute=reste_minute%8;} else {LedSign::Set( 6, 5, 0); LedSign::Set( 7, 5, 0);}

 if((reste_minute/4)>=1) {LedSign::Set( 6, 6, 1); LedSign::Set( 7, 6, 1);reste_minute=reste_minute%4;} else {LedSign::Set( 6, 6, 0); LedSign::Set( 7, 6, 0);}

 if((reste_minute/2)>=1) {LedSign::Set( 6, 7, 1); LedSign::Set( 7, 7, 1);reste_minute=reste_minute%2;} else {LedSign::Set( 6, 7, 0); LedSign::Set( 7, 7, 0);}

 if((reste_minute/1)>=1) {LedSign::Set( 6, 8, 1); LedSign::Set( 7, 8, 1);reste_minute=reste_minute%1;} else {LedSign::Set( 6, 8, 0); LedSign::Set( 7, 8, 0);}




//calcul des leds allumées pour les secondes
 if((seconde/32)>=1) {LedSign::Set( 11, 3, 1); LedSign::Set( 12, 3, 1);reste_seconde=seconde%32;} else {LedSign::Set( 11, 3, 0); LedSign::Set( 12, 3, 0);reste_seconde=seconde;}
 if((reste_seconde/16)>=1) {LedSign::Set( 11, 4, 1); LedSign::Set( 12, 4, 1);reste_seconde=reste_seconde%16;} else {LedSign::Set( 11, 4, 0); LedSign::Set( 12, 4, 0);}
 if((reste_seconde/8)>=1) {LedSign::Set( 11, 5, 1); LedSign::Set( 12, 5, 1);reste_seconde=reste_seconde%8;} else {LedSign::Set( 11, 5, 0); LedSign::Set( 12, 5, 0);}
 if((reste_seconde/4)>=1) {LedSign::Set( 11, 6, 1); LedSign::Set( 12, 6, 1);reste_seconde=reste_seconde%4;} else {LedSign::Set( 11, 6, 0); LedSign::Set( 12, 6, 0);}
 if((reste_seconde/2)>=1) {LedSign::Set( 11, 7, 1); LedSign::Set( 12, 7, 1);reste_seconde=reste_seconde%2;} else {LedSign::Set( 11, 7, 0); LedSign::Set( 12, 7, 0);}
 if((reste_seconde/1)>=1) {LedSign::Set( 11, 8, 1); LedSign::Set( 12, 8, 1);reste_seconde=reste_seconde%1;} else {LedSign::Set( 11, 8, 0); LedSign::Set( 12, 8, 0);}

}