Jag har i många år funderat och till och med påbörjat detta projekt med att just övervaka påstlådan. Lådan står ca 70m bort och det är fastigheter i mellan, så en kabel går inte att dra dit. Jag köpte mig en trådlös ringklocka för ca 4-5 år sedan och efter månget labbande med antenner m.m. och tillslut så la jag ner det, räckvidden var något begränsad med en sådan sändare.
MEN nu har en kille i USA vid namn Felix utvecklat en väldigt liten pryl som är en "kopia" på arduino med en transceiver den både sänder och tar emot.
Jag läste på lite och drog en slutsats att en sådan ska jag ha, fast det blev tre istället. En aggerar som gateway den andra är i postlådan och den tredje blir ett kommande projekt till växthuset.
17/6 beställdes prylarna från lowpowerlab.com,
29/6 kom paketet hem, så helt överkomlig leveranstid från djupaste staterna.
Så nu började det intressanta och jag har ju grejat lite med arduino så den biten är lite bekant.
Det jag började med att uppdatera mitt Arduino IDE på laptopen samt installerade de biblioteken som behövdes för moteinon. Jag förvånades över hur enkelt det var, allt hoppade igång och det var bara att börja skriva kod (och kopiera lite färdiga exempel här och var).
Bilderna nedan får tala mest för sig själv.
Precis uthämtat
Moteino R4 3 st med pinnar & utan minne,
FTDI Adapter R2 2 st med kabel,
9V Batteri Clip .
Gateway med Felix färdiga .img till raspberryn som ni finner på lowpowerlab.com och lådan är inköpt här på m.nu
Arbete med själva enheten till postlådan
Testar räckvidden i fält och resutatet blev ca 85m, då är gatewayen placerad djupt inne i huset i en klädkammare
Färdigställer enheten i sin rätta miljö
Installerad och fungerar
Får både pushnotis samt ett mail, lätt att man bara ignorerar pushnotisen i all hast därav ett mail också.
Koden:
Kod: Markera allt
#include <RFM69.h>
#include <SPI.h>
#include <LowPower.h>
#include <PinChangeInt.h> // Two lines to include pinChangeInt library
//#include <PinChangeIntConfig.h>
#define NODEID 2 // unique for each node on same network
#define GATEWAYID 1
#define NETWORKID 100 // the same on all nodes that talk to each other
#define FREQUENCY RF69_868MHZ
#define ENCRYPTKEY "sampleEncryptKey" // exactly the same 16 characters/bytes on all nodes!
#define ACK_TIME 30 // max # of ms to wait for an ack
#define LED 9 // Moteinos have LEDs on D9
#define SERIAL_BAUD 115200
#define D4 4
#ifdef SERIAL_EN
#define DEBUG(input) {Serial.print(input); delay(1);}
#define DEBUGln(input) {Serial.println(input); delay(1);}
#else
#define DEBUG(input);
#define DEBUGln(input);
#endif
RFM69 radio;
bool promiscuousMode = false; // Set to 'true' to sniff all packets on the same network
bool sentOpen = true;
int D4Status = 0;
// Add function to catch interrupt, doesn't need to do anything as the interrupt is all that's needed to wakeup
// (although it might want to disable itself if the switch is really noisy)
void wakeUp(void)
{
}
void setup()
{
//Setup the pins
pinMode(LED, OUTPUT);
pinMode(D4, INPUT);
// Allow wake up pin to trigger interrupt on rising edge.
PCintPort::attachInterrupt(D4, wakeUp, RISING); // New code to trap interrupt on pin change
//Start the Serial
Serial.begin(SERIAL_BAUD);
delay(10);
//Initialize the radio
radio.initialize(FREQUENCY,NODEID,NETWORKID);
#ifdef IS_RFM69HW
//radio.setHighPower(); // Uncomment only for RFM69HW!
#endif
radio.encrypt(ENCRYPTKEY); // Turn encryption ON
radio.promiscuous(promiscuousMode);
char buff[50];
sprintf(buff, "\nTransmiting at %d Mhz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
Serial.println(buff);
}
void loop()
{
if (digitalRead(D4) == LOW && sentOpen == false) // If the button connected to Digital Input pin 4 was pushed,
{
delay(10); // Wait 10ms for debounce
if (radio.sendWithRetry(GATEWAYID, "MAIL:OPN", 8))
{
Serial.println(" nothing...");
}
else
{
Serial.println("Sending Open mailboxstatus to gateway..");
sentOpen = true;
Blink(LED,3);
}
}
else if (digitalRead(D4) == HIGH)
{
delay(10); // Wait 10ms for debounce
radio.sleep();
Serial.flush();
// Now go to sleep until the pin change wakes us up!
while (digitalRead(D4) == HIGH && sentOpen == true) // Added in case there are other interrupts spuriously waking the mote
{
if (radio.sendWithRetry(GATEWAYID, "MAIL:CLS", 8))
{
Serial.println(" nothing...");
}
else
{
Serial.println("Sending closed, once... ");
sentOpen = true;
//Blink(LED,3); // Comment out to save batteryjuice
}
Serial.println (" and now powering down!");
sentOpen = false;
delay(10);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Changed to SLEEP_FOREVER so that only interrupts wake up, no WDT used
}
}
}
void Blink(byte PIN, int DELAY_MS) // Local led blinking function
{
pinMode(PIN, OUTPUT);
digitalWrite(PIN,HIGH);
delay(DELAY_MS);
digitalWrite(PIN,LOW);
}
Svårare än så var det inte och
Och kopplingsschemat följde jag denna bild, jag använder mig av ett 10k resistor.
Inköpslista utöver Moteino:
Kjell o Co
Artnr:
39780 Batterihållare 4xR6 (AA) (denna passar nästan perfekt i lådan, man får fila lite i plasten)
89024 Inbyggnadslåda Höjd: 20 mm
42480 AA Litium 4-pack