Arduino Pocket Lightning detektor (3 / 5 steg)
Steg 3: Kod och ikoner
Nu kommer den del som gör det hela arbete!
Koden. Eller i ArduinoSpeak (skiss).
UPPDATERING: Jag hittade och korrigerade en liten bugg som skulle orsaka detektorn att frysa när man upptäckt en okänd signal. Jag har också lagt till möjligheten för detektorn spara inställningarna när avstängd genom att lagra värdena i EEPROM. uppdaterade koden är i zip-filen tillsammans med den ursprungliga koden. Uppdaterade koden har EEPROM läggs till i filnamnet i zipfilen.
Jag ingår också sketchup 3d skrivare filerna för fallet.
AS3935 sensorn i princip bara sitter och lyssnar efter lightnig via små induktion antennen på breakout ombord. När den upptäcker något funderare det, blixtnedslag eller buller det utlöser whats kallas en IRQ. Detta är en signal som är svårt kabelansluten till arduino som kan orsaka att det ska sluta och uppmärksamma oavsett vad det gör på gång.
När Arduino ser i IRQ-kanalen ändra det stannar oavsett vilken kod det är igång och hoppar till lite speciell kod som kan läsa data sensorn har lagrat om särskilt händelsen det identifieras och sedan Visa eller agera utifrån vad den hittar.
I vårt fall Arduino sitter och glatt (eller olyckligt, vem vet hur det känns om den..) rör sig en lite moln bitmapp över displayen. Om och om igen... det ser också tillfälligt för att se om en knapp har ben pressas som anger den allsmäktiga användaren vill ändra några inställningar.
Om sensorn Petar arduino i sidan med en IRQ. Arduinoen stannar animera lilla molnet och frågar sensorn vad den vill. Arduinoen uppdaterar sedan visning för att visa vad man har lärt sig.
Skissen också innehåller några rudimentära config inställningar som om vi vill veta lightning avståndet i Miles eller kilometer eller om vi är innanför eller utanför.
Jag har tagit en zip-fil som innehåller alla de filer som jag har skapat i förhållande till detta projekt. den innehåller också biblioteken för lightning detektor styrelsen. Den har allt du behöver att bygga detta på samma sätt som jag har.
Nokia 5110 biblioteken är tillgängliga i Arduino IDE bibliotek manager. Sök bara efter adafruit GFX och LCD.
Här är koden...
------------------------------------------------------------------
#include
#define eeprom_dist 4 //Define eeprom minnesplats att lagra mil eller km beräkning
#define eeprom_level 5 //Define eeprom minnesplats att lagra mil eller km beräkning
#include
/*
* AS3935 kommunicerar med i2c i denna skiss
* och Nokia 5110 använder SPI
*/
#include
#include
#include
Adafruit_PCD8544 display = Adafruit_PCD8544 (8, 5, 4);
#include "I2C.h"
inkludera spela med Fusion AXS3935 bibliotek
#include "PWFusion_AS3935_I2C.h"
avbryta trigger globala var
flyktiga int8_t AS3935_ISR_Trig = 0;
definiera vissa värden används av panel och knappar
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
definierar för hårdvara config
#define SI_PIN 9
#define IRQ_PIN 2 / / digital stift 2 och 3 finns tillgängliga för avbrott kapacitet
#define AS3935_ADD 0x03 / / x03-standard PWF SEN-39001-R01 config
#define AS3935_CAPACITANCE 104 / / <--SET detta värde till numret som anges på brädan
definierar för allmänna chip inställningar
#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;
int dist = 0;
int tt = 0;
prototyper
void AS3935_ISR();
---data som bygger på skärmen ikoner
PWF_AS3935_I2C lightning0 ((uint8_t) IRQ_PIN, (uint8_t) SI_PIN, (uint8_t) AS3935_ADD);
CONST unsigned char PROGMEM lightning_bmp [32] = {
0x01, 0xE0, 0x02, 0x20, 0x0C, 0x18, 0x12, 0x24, 0x21, 0x06, 0x10, 0x02, 0x1F, 0xFC, 0x01, 0xF0,
0x01, 0xC0, 0x03, 0x80, 0x07, 0xF8, 0x00, 0xF0, 0x00, 0xC0, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00
};
CONST unsigned char PROGMEM cloud [32] = {
0x01, 0xE0, 0x02, 0x20, 0x0C, 0x18, 0x12, 0x24, 0x21, 0x06, 0x10, 0x02, 0x1F, 0xFC, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
CONST unsigned char PROGMEM lightning [32] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x01, 0xF0,
0x01, 0xC0, 0x03, 0x80, 0x07, 0xF8, 0x00, 0xF0, 0x00, 0xC0, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00
};
int read_buttons()
{
adc_key_in = analogRead(0); läsa värdet från knappanelen. Värden som returneras om en knapp blir pressade och som en det var...
om (adc_key_in > 1000) return btnNONE;
om (adc_key_in == 0) återvända btnLEFT;
om (adc_key_in > 310 och adc_key_in < 330) återvänder btnDOWN;
om (adc_key_in > 120 och adc_key_in < 145) återvända btnUP;
om (adc_key_in > 480 och adc_key_in < 550) återvända btnRIGHT;
om (adc_key_in > 700 och adc_key_in < 800) återvänder btnSELECT;
återvända btnNONE; När alla andra misslyckas, tillbaka detta...
}
---på config-menyn
void menyn)
{
Delay(400);
medan (read_buttons()! = 4) {
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.println("Enter=Return");
display.setCursor(0,8);
display.println ("upp = Mi");
display.setCursor(0,18);
display.println ("ner = KM");
display.setCursor(0,28);
display.println("left=indoors");
display.setCursor(0,38);
display.println ("rätt = utomhus");
display.display();
om (read_buttons() == 1) {
mi = 0;
EEPROM.write(eeprom_dist,0); Skriva för (1) mil / (0) Kilometer beräkning till EEPROM för återkallelse efter avstängning
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.println ("Set till KM");
display.display();
Delay(1000);
Menu();
}
om (read_buttons() == 2) {
mi = 1;
EEPROM.write(eeprom_dist,1); Skriva för mil/Kilometer beräkning till EEPROM för återkallelse efter power off
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.println ("Set till Miles");
display.display();
Delay(1000);
Menu();
}
om (read_buttons() == 0) {
lightning0. AS3935_SetIndoors();
dist = 0;
EEPROM.write(eeprom_level,0); Skriva för (0) inomhus / utomhus (1) på AS3935 till EEPROM för återkallande efter power off
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.println("Indoor");
display.setCursor(0,20);
display.println("operation");
display.display();
Delay(1000);
Menu();
}
om (read_buttons() == 3) {
lightning0. AS3935_SetOutdoors();
dist = 1;
EEPROM.write(eeprom_level,1); Skriva för (0) inomhus / utomhus (1) på AS3935 till EEPROM för återkallande efter power off
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.println("Outdoor");
display.setCursor(0,20);
display.println("operation");
display.display();
Delay(1000);
Menu();
}
}
hemkomst.
}
void setup()
{
mi = EEPROM.read(eeprom_dist); Läs lagras inställningarna från EEPROM
dist = EEPROM.read(eeprom_level); Läs lagras inställningarna från EEPROM
pinMode(6,OUTPUT);
Serial.BEGIN(115200);
display.BEGIN();
init gjort
Du kan ändra kontrasten runt för att anpassa displayen
för bästa visning!
display.setContrast(25);
display.display(); Visa splashscreen
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.println ("Raht Lightning Detector");
display.setTextSize(1);
display.drawBitmap (35, 22, lightning_bmp, 16, 16, 1);
display.setTextColor(BLACK);
display.display();
Flash();
display.display();
Delay(3000);
för den I2C biblioteket: (aktiverar pullups, som hastigheten till 400kHz)
I2c.BEGIN();
I2c.pullup(true);
I2c.setSpeed(1);
Delay(2);
lightning0. AS3935_DefInit(); Ange register till försummelsen
nu uppdatera sensor cal för din ansökan och driva upp chip
lightning0. AS3935_ManualCal (AS3935_CAPACITANCE, AS3935_OUTDOORS, AS3935_DIST_EN);
AS3935_ManualCal parametrar:
--> kapacitans, i pF (markerade på paketet)
--> inomhus/utomhus (AS3935_INDOORS:0 / AS3935_OUTDOORS:1)
--> disturbers (AS3935_DIST_EN:1 / AS3935_DIST_DIS:2)
fungerar också befogenheter upp chip
Aktivera avbrott (krok IRQ-stift till Arduino Uno/Mega avbrott ingång: 0 -> stift 2, 1 -> pin 3)
attachInterrupt (0, AS3935_ISR, RISING);
lightning0. AS3935_PrintAllRegs();
AS3935_ISR_Trig = 0; Rensa trigger
}
---Detta bara blir spelade om och om igen... och över... och o...
void loop()
{
display.clearDisplay();
analogWrite(6,60); ---slå på bakgrundsbelysningen
---bygga skärmen
display.setCursor(0,0);
display.println("LastStrike");
display.setCursor(0,8);
display.println ("Dist:" + String(lsDist));
display.setCursor(50,8);
---om vi plocka miles, göra detta
om (mi == 1) {display.println ("Mi");}
annars anta vi vill göra detta...
annat {display.println ("Km");}
display.setCursor(0,17);
display.println("0");
display.setCursor(72,17);
om miles---40 km = aaprox 25 miles
IF(mi==1) {
display.println("25");
}
annat {
---annars bara skala det 40 km
display.println("40");
}
display.setCursor(0,39);
display.println ("Strikes:");
display.setCursor(48,39);
display.println(String(l));
display.setCursor(64,39);
--Placera en indikation på att vi som att inne i det nedre högra hörnet av displayen
om (dist==1){display.println("Out");}
annat {
-- eller Visa sattes för utomhus
display.println("in");}
--dra avståndsskala
display.drawLine (0, 37, 84, 37, svart);
display.drawLine (0, 25, 0, 37, svart);
display.drawLine (21, 21, 35, 37, svart);
display.drawLine (42, 35, 42, 37, svart);
display.drawLine (63, 63, 35, 37, svart);
display.drawLine (83, 83, 25, 37, svart);
display.fillCircle(mapDist,35,2,BLACK);
om (l == 0)
--Vi börjar med inga strejker upptäckt
display.setCursor(9,24);
display.println ("inga slag");
om (l > 0)
-om theres en strejk. Placera en liten zap på avstånd det är...
display.drawBitmap (mapDist, 22, blixtnedslag, 16, 16, 1);
om (mapDist > 20) {
display.setCursor(9,24);
display.println ("fjärran Ligntning");
}
display.display();
IF(0 == AS3935_ISR_Trig) {
Serial.println(read_buttons());
animateCloud();
Serial.println(read_buttons());
om (read_buttons()! = 5) {
Menu();
};
återställa avbrott flagga
AS3935_ISR_Trig = 0;
nu får avbryta källa
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("");
}
annat if(1 == int_src)
{
Flash();
uint8_t lightning_dist_km = lightning0. AS3935_GetLightningDistKm();
display.clearDisplay();
l ++;
display.println ("Lightning!");
om (mi == 1) {
lsDist =(lightning_dist_km * 0.62137);
}
annat {
lsDist=(lightning_dist_km);
}
display.println((lsDist));
mapDist = karta (lsDist, 0, 25, 0, 83);
display.println ("Miles");
display.display();
Flash();
}
annat if(2 == int_src)
{
display.clearDisplay();
display.setCursor(72,0);
display.println("N");
// n++;
display.display();
Delay(1000);
display.setCursor(72,0);
display.println("");
}
annat if(3 == int_src)
{
display.clearDisplay();
display.println ("brus nivå för hög").
display.display();
Delay(500);
}
lightning0. AS3935_PrintAllRegs(); för debug...
}
}
Detta är IRQ-hanterare för AS3935 avbrott, måste returnera void och ta inga argument
alltid göra koden i avbryta hanterare snabb och kort
void AS3935_ISR()
{
AS3935_ISR_Trig = 1;
}
---flash displayen rutin
void flash() {
för (int y = 1; y < 5; y ++) {
digitalWrite(6,LOW);
display.invertDisplay(true);
Delay(100);
digitalWrite(6,HIGH);
display.invertDisplay(false);
Delay(100);
}
}
--göra att moln gå baby!
void animateCloud() {
display.drawBitmap (m, 15, moln, 16, 16, 1);
display.display();
om (m > = 80) {m = 0;}
m ++;
Delay(200);
}