Étape 2: Le croquis
L’ONU sera chargé de faire le dépouillement. Nous allons utiliser la connexion en série (via USB) de l’ONU vers un ordinateur hôte.
Cette esquisse interprétera des comtes de cycles AC sur une base de seconde par seconde (GPS). Chaque fois qu’une seconde a autre que 60 cycles, une ligne avec le delta sera imprimée sur le port série. L’hôte peut regarder le port série et rassembler les deltas à sa guise.
Nous allons également indiquer toute perte de GPS PPS de signalisation, ce qui peut arriver si le GPS perd son fix.
#include <Serial.h> #define PPS_PIN 2 #define AC_PIN 3 #define PPS_IRQ 0 #define AC_IRQ 1 #define NOMINAL_FREQUENCY 60 #define PPS_COMPLAINT_RATE 1500 unsigned long last_pps_complaint; unsigned int ac_cycle_count, last_ac_cycle_count; boolean pps_occurred; void pps_isr() { last_ac_cycle_count = ac_cycle_count; ac_cycle_count = 0; pps_occurred = true; } void ac_isr() { ac_cycle_count++; } void setup() { pinMode(PPS_PIN, INPUT); pinMode(AC_PIN, INPUT_PULLUP); Serial.begin(9600); pps_occurred = false; ac_cycle_count = 0; last_pps_complaint = 0; attachInterrupt(PPS_IRQ, pps_isr, RISING); attachInterrupt(AC_IRQ, ac_isr, RISING); } void loop() { if (pps_occurred) { pps_occurred = false; last_pps_complaint = millis(); // no excuse to complain, actually. int delta = NOMINAL_FREQUENCY - last_ac_cycle_count; if (delta) { Serial.print(delta); Serial.print("\r\n"); } } else { if (millis() - last_pps_complaint > PPS_COMPLAINT_RATE) { last_pps_complaint = millis(); Serial.print("Missed PPS\r\n"); } } }