L'objectif est ici de disposer de voyants permettant de connaître directement l'état du capteur, sans avoir à consulter l'application sur le smartphone. Un voyant pour l'alimentation (on/off: éteint/vert, batterie faible : rouge, à implémenter après avoir complété le circuit), un voyant pour l'état de connexion bluetooth (bleu), un voyant pour les coups comptés (blanc).
Nous utilisons des LED RGB WS2812 en ruban souple.
Pour que le code fonctionne correctement, il faut patcher la librairie Adafruit comme expliqué dans ce lien.
#include <RFduinoBLE.h> #include "Adafruit_NeoPixel.h" int count = 0; int pwmValue = 0; int isCo = 0; long precTime; Adafruit_NeoPixel strip = Adafruit_NeoPixel(3, 6, NEO_GRB + NEO_KHZ800); int countCallback(uint32_t ulPin) { count++; strip.setPixelColor(2, strip.Color(255, 255, 255)); // Flash geiger strip.show(); delay(50); strip.setPixelColor(2, strip.Color(0, 0, 0)); strip.show(); return 0; } void setup() { pinMode(2, OUTPUT); // Les pins 2 et 3 sont utilisées pour pinMode(3, OUTPUT); // controler la haute tension strip.begin(); strip.show(); strip.setPixelColor(0, strip.Color(0, 255, 0)); // Etat de batterie strip.show(); pinMode(4, INPUT); // La pin 4 compte les impulsions du tube RFduino_pinWakeCallback(4, HIGH, countCallback); RFduinoBLE.deviceName = "OpenGeiger"; // Le nom et la description doivent faire RFduinoBLE.advertisementData = ""; // moins de 18 octets en tout. RFduinoBLE.begin(); precTime = millis(); } void loop() { if (millis() - precTime > 10000) { // Toutes les 10 secondes, on envoi le comptage au smartphone RFduinoBLE.sendInt(count); precTime = millis(); count = 0; } } void RFduinoBLE_onConnect() { isCo = 1; // Un smartphone s'est connecté strip.setPixelColor(1, strip.Color(0, 0, 255)); // Etat bluetooth strip.show(); } void RFduinoBLE_onDisconnect() { isCo = 0; // Un smartphone s'est déconnecté strip.setPixelColor(1, strip.Color(0, 0, 0)); strip.show(); } int getInt(char*data, int len) { int value=0; int p=1; for (int i=len-1 ; i>=0 ; i--) { value += p*(data[i]-'0'); p*=10; } return value; } void RFduinoBLE_onReceive(char *data, int len) { pwmValue = getInt(data, len); int v = (int)(pwmValue*2.55); analogWrite(2, v); analogWrite(3, v); }