Étape 3: Code et icônes
Maintenant vient la partie qui fait tout travailler !
Le code. Ou en ArduinoSpeak (l’esquisse).
Mise à jour : J’ai trouvé et corrigé un petit bug qui pourrait déclencher le détecteur de geler lorsqu’il détecte un signal inconnu. J’ai également ajouté la possibilité pour le détecteur mémoriser les réglages lorsque éteint en stockant les valeurs dans l’EEPROM. le code de mise à jour est dans le fichier zip avec le code d’origine. Le code de mise à jour a l’EEPROM ajouté au nom du fichier dans le fichier zip.
J’ai aussi inclus les fichiers d’imprimante 3d sketchup pour le cas.
Le capteur AS3935 fondamentalement juste s’assoit et écoute pour contacteur via l’antenne d’induction petit sur la carte de dérivation. Lorsqu’il détecte quelque chose, qu’elle estime foudre ou bruit il déclenche whats appelle une IRQ. Il s’agit d’un signal qui est câblé dans l’arduino qui peut faire arrêter et attention, peu importe ce qu’il fait au moment de payer.
Quand l’Arduino voit la ligne IRQ changer il s’arrête quelque code il s’exécute et saute un peu spécial du code qui peut lire les données du capteur a stocké sur l’événement particulier il est détecté et ensuite afficher ou donner suite à ce qu’il trouve.
Dans notre cas l’Arduino est assis et heureusement (ou malheureusement, qui sait qu’il pense de lui.) se déplaçant une bitmap peu de nuages à l’écran. Encore et encore... il ressemble également momentanément pour voir si une touche a été pressée indiquant à l’utilisateur le tout-puissant veut modifier certains paramètres.
Si le capteur pokes l’arduino sur le côté avec une IRQ. L’arduino arrête animant le petit nuage et lui demande le capteur ce qu’il veut. L’arduino puis met à jour l’affichage pour indiquer ce qu’il a appris.
L’esquisse comprend également certains paramètres de configuration rudimentaires comme la question de savoir si nous voulons connaître la distance de la foudre en Miles ou kilomètres ou si nous sommes à l’intérieur ou à l’extérieur.
J’ai inclus un fichier zip qui contient tous les fichiers que j’ai créé dans le cadre de ce projet. Il contient également les bibliothèques pour le jury de détecteur de foudre. Il a tout ce que vous devrez construire ce la même façon que j’ai.
Les bibliothèques de Nokia 5110 sont disponibles dans le gestionnaire de bibliothèques IDE Arduino. Il suffit de chercher adafruit GFX et l’écran LCD.
Voici le code...
------------------------------------------------------------------
#include #define eeprom_dist 4 //Define emplacement de la mémoire eeprom pour stocker mile ou km calcul #define eeprom_level 5 //Define eeprom mémoire emplacement pour stocker le calcul mile ou km #include / * * AS3935 communique avec i2c dans ce sketch * et le Nokia 5110 utilise SPI * / #include #include #include Adafruit_PCD8544 display = Adafruit_PCD8544 (8, 5, 4) ; #include « I2C.h » / / include bibliothèques jouant avec Fusion AXS3935 #include « PWFusion_AS3935_I2C.h » / / interruption trigger volatil global var int8_t AS3935_ISR_Trig = 0 ; définir des valeurs utilisées par le panneau et boutons int adc_key_in = 0 ; int z = 0 ; int mi = 0 ; #define btnLEFT 3 #define btnDOWN 2 #define btnUP 1 #define btnRIGHT 0 #define btnSELECT 4 #define btnNONE 5 / / defines pour config matériel #define SI_PIN 9 #define IRQ_PIN 2 / / broches numériques 2 et 3 sont disponibles pour des capacités d’interruption #define AS3935_ADD 0 x 03 / / x03-config standard de PWF SEN-39001-R01 #define AS3935_CAPACITANCE 104 / / <--définir cette valeur au nombre énumérés ON votre Conseil / / définit des paramètres généraux puce #define AS3935_INDOORS 0 #define AS3935_OUTDOORS 1 #define AS3935_DIST_ DIS 1 #define AS3935_DIST_EN 0 int l = 0 ; int n = 0 ; int lsDist = 0 ; int mapDist = 0 ; int m = 0 ; dist int = 0 ; tt int = 0 ; prototypes void AS3935_ISR() ; ---données qui génère les icônes à l’écran PWF_AS3935_I2C lightning0 (IRQ_PIN (uint8_t), SI_PIN (uint8_t), AS3935_ADD (uint8_t)) ; const unsigned char PROGMEM lightning_bmp [32] = {0 x 01, 0xE0, 0 x 02, 0 x 20, 0x0C, 0 x 18, 0 x 12, 0 x 24, 0 x 21, 0 x 06, 0 x 10, 0 x 02, 0x1F, 0xFC, 0 x 01, 0xF0, 0 x 01, 0xC0, 0 x 03, 0 x 80, 0 x 07, 0xF8, 0 x 00, 0xF0, 0 x 00, 0xC0, 0 x 01, 0 x 80, 0 x 01, 0 x 00, 0 x 01, 0 x 00} ; Nuage de const unsigned char PROGMEM [32] = {0 x 01, 0xE0, 0 x 02, 0 x 20, 0x0C, 0 x 18, 0 x 12, 0 x 24, 0 x 21, 0 x 06, 0 x 10, 0 x 02, 0x1F, 0xFC, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00} ; foudre de PROGMEM const unsigned char [32] = {0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0 x 01, 0xF8, 0 x 01, 0xF0, 0 x 01, 0xC0, 0 x 03, 0 x 80, 0 x 07, 0xF8, 0 x 00, 0xF0, 0 x 00, 0xC0, 0 x 01, 0 x 80, 0 x 01, 0 x 00, 0 x 01, 0 x 00} ; int read_buttons() {adc_key_in = analogRead(0); / / lire la valeur du panneau de boutons. Les valeurs retournées si un bouton est pressé et que l'on c’était... si btnNONE retour (adc_key_in > 1000) ; Si (adc_key_in == 0) return btnLEFT ; Si (adc_key_in > 310 et adc_key_in < 330) retournent btnDOWN ; Si (adc_key_in > 120 et adc_key_in < 145) return btnUP ; Si (adc_key_in > 480 et adc_key_in < 550) return btnRIGHT ; Si (adc_key_in > 700 et adc_key_in < 800) retournent btnSELECT ; Return btnNONE ; Lorsque tous les autres échouent, le retour...} ---la config menu menu Sub () {delay(400) ; tout en (read_buttons()! = 4) {display.clearDisplay() ; display.setCursor(0,0) ; display.setTextSize(1) ; display.println("Enter=Return") ; display.setCursor(0,8) ; display.println ("Up = Mi"); display.setCursor(0,18) ; display.println ("bas = KM"); display.setCursor(0,28) ; display.println("Left=Indoors") ; display.setCursor(0,38) ; display.println ("droite = à l’extérieur") ; Display.Display() ; Si (read_buttons() == 1) {mi = 0 ; EEPROM.write(eeprom_dist,0) ; Écrire le paramètre pour mille (1) / (0) calcul de kilomètre d’EEPROM pour rappel après l’arrêt de display.clearDisplay() ; display.setCursor(0,0) ; display.setTextSize(1) ; Display.println ("Set à KM") ; Display.Display() ; Delay(1000) ; menu() ; } Si (read_buttons() == 2) {mi = 1 ; EEPROM.write(eeprom_dist,1) ; Écrire réglage pour mille/kilomètre calcul EEPROM pour rappel après l’arrêt de display.clearDisplay() ; display.setCursor(0,0) ; display.setTextSize(1) ; Display.println ("Set miles") ; Display.Display() ; Delay(1000) ; menu() ; } Si (read_buttons() == 0) {lightning0. AS3935_SetIndoors() ; Dist = 0 ; EEPROM.write(eeprom_level,0) ; Écrire le paramètre pour intérieur (0) / plein air (1) réglage sur AS3935 d’EEPROM pour rappel après l’arrêt de display.clearDisplay() ; display.setCursor(0,0) ; display.setTextSize(1) ; Display.println("Indoor") ; display.setCursor(0,20) ; Display.println("Operation") ; Display.Display() ; Delay(1000) ; menu() ; } Si (read_buttons() == 3) {lightning0. AS3935_SetOutdoors() ; DIST = 1 ; EEPROM.write(eeprom_level,1) ; Écrire le paramètre pour intérieur (0) / plein air (1) réglage sur AS3935 d’EEPROM pour rappel après l’arrêt de display.clearDisplay() ; display.setCursor(0,0) ; display.setTextSize(1) ; Display.println("Outdoor") ; display.setCursor(0,20) ; Display.println("Operation") ; Display.Display() ; Delay(1000) ; menu() ; retour}} ; } void setup() {mi = EEPROM.read(eeprom_dist) ; //Read paramètres stockés EEPROM dist = EEPROM.read(eeprom_level) ; //Read paramètres stockés EEPROM pinMode(6,OUTPUT) ; Serial.Begin(115200) ; Display.Begin() ; init fait / / vous pouvez changer le contraste autour pour s’adapter à l’écran / / pour le meilleur visionnement! display.setContrast(25) ; Display.Display() ; Voir l’établissement splashscreen display.clearDisplay() ; display.setCursor(0,0) ; display.setTextSize(1) ; Display.println ("détecteur de foudre de Rath") ; display.setTextSize(1) ; display.drawBitmap (35, 22, lightning_bmp, 16, 16, 1) ; display.setTextColor(BLACK) ; Display.Display() ; Flash() ; Display.Display() ; Delay(3000) ; installation pour la la bibliothèque I2C: (activer les tractions, régler la vitesse à 400kHz) I2c.begin() ; I2C.pullup(true) ; I2C.setSpeed(1) ; Delay(2) ; lightning0. AS3935_DefInit() ; registres, par défaut la valeur / / maintenant mise à jour de capteur cal pour votre application et la mise sous tension puce lightning0. AS3935_ManualCal (AS3935_CAPACITANCE, AS3935_OUTDOORS, AS3935_DIST_EN) ; Paramètres AS3935_ManualCal: / /--> capacitance, en pF (marqué sur le paquet) / /--> intérieur/extérieur (AS3935_INDOORS:0 / AS3935_OUTDOORS:1) / /--> perturbateurs (AS3935_DIST_EN:1 / AS3935_DIST_DIS:2) / / fonction également se mette la puce / / activer interruption (crochet broche IRQ à Arduino Uno/Mega interruption entrée: 0 -> pin 2, 1 -> pin 3) attachInterrupt (0, AS3935_ISR, RISING) ; lightning0. AS3935_PrintAllRegs() ; AS3935_ISR_Trig = 0 ; facteur déclenchant} / /---cela juste se joue encore et encore... et plus... et o... void loop() {display.clearDisplay() ; analogWrite(6,60) ; //---turn le rétro-éclairage / /---construire l’écran display.setCursor(0,0) ; display.println("LastStrike") ; display.setCursor(0,8) ; display.println ("Dist:" + String(lsDist)) ; display.setCursor(50,8) ; ---Si nous choisissons miles, faire cela si (mi == 1) {display.println ("Mi");} //otherwise suppose que nous voulons faire... else {display.println ("Km");} display.setCursor(0,17) ; Display.println("0") ; display.setCursor(72,17) ; Si miles---40 km = 25 miles d’aaprox if(mi==1) {display.println("25");} else {/ /---sinon juste redimensionnez-la pour 40 km display.println("40");} display.setCursor(0,39) ; Display.println ("grèves:") ; display.setCursor(48,39) ; Display.println(String(l)) ; display.setCursor(64,39) ; --Placez une indication que nous nous sommes fixés à l’intérieur dans le coin inférieur droit de l’écran si (dist==1){display.println("Out");} d’autre {/ /--ou Show ont été fixées pour l’extérieur display.println("In");} //--draw la display.drawLine d’échelle de distance (0, 84, 37, 37, noir) ; display.drawLine (0, 0, 25, 37, noir) ; display.drawLine (21, 21, 35, 37, noir) ; display.drawLine (42, 42, 35, 37, noir) ; display.drawLine (63, 63, 35, 37, noir) ; display.drawLine (83, 83, 25, 37, noir) ; display.fillCircle(mapDist,35,2,BLACK) ; Si (l == 0) / /--nous commençons par aucun display.setCursor(9,24) de grèves détectés ; Display.println (« aucune grève") ; Si (l > 0) //-if theres une grève. endroit un peu zapper à la distance il est... display.drawBitmap (mapDist, 22, foudre, 16, 16, 1) ; Si (mapDist > 20) {display.setCursor(9,24) ; display.println ("Far chapelet");} display.display() ; if(0 == AS3935_ISR_Trig) {/ / Serial.println(read_buttons()) ; animateCloud(); / / Serial.println(read_buttons()) ; if (read_buttons()! = 5) {menu();}; / / reset interrupt flag AS3935_ISR_Trig = 0; / / maintenant get interrupt source uint8_t int_src = lightning0. AS3935_GetInterruptSrc() ; if(0 == int_src) {display.setCursor(72,0) ; display.println("?") ; display.display(); / / delay(1000) ; display.setCursor(72,0) ; display.println("");} d’autre if(1 == int_src) {flash() ; uint8_t lightning_dist_km = lightning0. AS3935_GetLightningDistKm() ; display.clearDisplay() ; l ++ ; Display.println ("Lightning!!") ; Si (mi == 1) {lsDist =(lightning_dist_km * 0.62137);} else {lsDist=(lightning_dist_km)}; display.println((lsDist)) ; mapDist = carte (lsDist, 0, 0, 25, 83) ; Display.println ("Miles") ; Display.Display() ; Flash() ; } else if(2 == int_src) {/ / display.clearDisplay() ; display.setCursor(72,0) ; display.println("N"); / / n ++; display.display() ; delay(1000) ; display.setCursor(72,0) ; display.println("");} d’autre if(3 == int_src) {display.clearDisplay() ; display.println ("niveau de bruit trop élevé"); display.display() ; delay(500);} / / lightning0. AS3935_PrintAllRegs() ; pour déboguer...} } / / Ceci est gestionnaire d’irq pour AS3935 interruptions, doit retourner void et ne prendre aucun argument / / toujours rendre le code à interrompre des gestionnaires rapide et court AS3935_ISR() Sub {AS3935_ISR_Trig = 1;} //---flash la flash() Sub routine affichage {pour (int y = 1; y < 5; y ++) {digitalWrite(6,LOW) ; display.invertDisplay(true) ; delay(100) ; digitalWrite(6,HIGH) ; display.invertDisplay(false) ; delay(100);}} //--make que cloud allez bébé!! void animateCloud() {display.drawBitmap (m, 15, nuage, 16, 16, 1); display.display() ; if (m > = 80) {m = 0;} m ++; delay(200);}