Salut à tous
J'aborde une phase cruciale de mon existence : le dernier trimestre de ma vie professionnelle.
Il m'est venu à l'idée d'afficher sur mon bureau le décompte de secondes qui va s'écouler jusqu'à ce moment tant attendu.
Une espèce de QUILLE électronique.
Un ARDUINO avec un MAX7219 + afficheur 8x7 segments ?
Oui mais c'est trop facile. Il fallait que je fasse un petit effort supplémentaire.
J'ai donc choisi cette carte :
La "petite" BLUE PILL que l'on peut trouver ICI à un prix plus qu'intéressant.
Pour le même prix qu'une NANO :
- cœur 32bits 72MHz
- large gamme de tension d'utilisation de 2V à 3.6V
- 128Ko de mémoire flash
- 20Ko de SRAM
- unité de calcul CRC, ID unique 96 bits
- deux convertisseurs A/N 1µs 12 bits (jusqu'à 10 voies)
- dontrôleur DMA 7 voies, 3 timers à usage général et 1 timer de contrôle avancé
- 37 ports E/S rapides
- interfaces de débogage fil série (SWD) et JTAG
- interfaces : deux SPI, deux I2C, trois USART, une USB et une CAN
Mon intention est de faire tourner ce petit sketch :
#include <TimeLib.h>
#include "LedControl.h"
#define TIME_HEADER "T" // Header tag for serial time sync message
#define TIME_REQUEST 7 // ASCII bell character requests a time sync message
#define LED PA0
LedControl lc = LedControl(PA1, PA2, PA3, 1);
const unsigned long DEFAULT_TIME = 1543138573; // Nov 25 2018
void processSyncMessage() {
unsigned long pctime;
if(Serial.find(TIME_HEADER)) {
pctime = Serial.parseInt();
Serial.print("PC TIME: ");
Serial.println(pctime);
if( pctime >= DEFAULT_TIME) { // check the integer is a valid time
setTime(pctime); // Sync Arduino clock to the time received on the serial port
}
}
}
time_t requestSync()
{
Serial.write(TIME_REQUEST);
return 0; // the time will be sent later in response to serial mesg
}
void setup() {
Serial.begin(115200);
pinMode(LED, OUTPUT);
lc.shutdown(0, false);
lc.setIntensity(0, 4);
lc.clearDisplay(0);
setTime(DEFAULT_TIME);
setSyncProvider(requestSync);
}
tmElements_t t = {0, 0, 0, 6, 1, 2, 2019-1970};
void loop() {
time_t retirement = makeTime(t); // convert time elements into time_t
if (Serial.available()) {
processSyncMessage();
}
lc.clearDisplay(0);
printNumber(0, retirement-now());
if (timeStatus() == timeSet) {
digitalWrite(LED, HIGH); // LED on if synced
} else {
digitalWrite(LED, LOW); // LED off if needs refresh
}
delay(1000);
}
void printNumber(int addr, long num) {
byte c;
int j;
int d;
num < 1000 ? d = 4 : d = countDigits(num);
for (j = 0; j < d; j++) {
c = num % 10; // Modulo division = remainder
num /= 10; // Divide by 10 = next digit
boolean dp = (j ==3); // Add decimal point at 3rd digit.
lc.setDigit(addr, j, c, dp);
}
}
int countDigits(long num) {
int c = 0;
while (num) {
c++;
num /= 10;
}
return c;
}
Comme vous pouvez le remarquer, la différence par rapport à un sketch ARDUINO ne saute pas aux yeux.
Ceci est normal, car je l'ai développé d'abord sur une NANO.
Seules ces deux lignes diffèrent :
// version NANO
#define LED 13
LedControl lc = LedControl(12, 11, 10, 1);
// version STM32
#define LED PA0
LedControl lc = LedControl(PA1, PA2, PA3, 1);
Comment faire pour exécuter du code ARDUINO sur un STM32 ?
Toutes les explications sont ICI.
Un petit tuto personnel pour aider pas à pas les néophytes ICI.
Le sketch utilise TimeLib et LedControl, deux librairies classiques qui ne devraient à priori pas poser de problème particulier.
Et cela fonctionne !
@+