Övervaka postlådan med Moteino

Hur gör man för att ... ? Hur fungerar ... ? Steg för steg-guider och förklarande artiklar finns i detta forum.
Många guider finner också på vår blogg: https://blog.m.nu/
Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
Användarvisningsbild
Plutonium
Moderator
Inlägg: 1245
Blev medlem: 04 jan 2008, 02:34
Ort: Nossebro
Kontakt:

Övervaka postlådan med Moteino

Inlägg av Plutonium »

Hej.

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.

Bild
Precis uthämtat

Bild

Moteino R4 3 st med pinnar & utan minne,
FTDI Adapter R2 2 st med kabel,
9V Batteri Clip .


Bild
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

Bild
Arbete med själva enheten till postlådan

Bild
Testar räckvidden i fält och resutatet blev ca 85m, då är gatewayen placerad djupt inne i huset i en klädkammare

Bild
Bild
Färdigställer enheten i sin rätta miljö

Bild
Installerad och fungerar

Bild
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);
}
Det koden gör att den säger åt kortet att sova för att spara energi, och den triggas igång så fort brytaren ändrar status. Skickar ett statusmeddelande till gatewayen som i sin tur skickar push- och epostmeddelande.
Svårare än så var det inte och


Och kopplingsschemat följde jag denna bild, jag använder mig av ett 10k resistor.
Bild

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
http://essunga.org
Moderator - Temperatur.nu
Användarvisningsbild
gol
Gillar hemautomation
Inlägg: 39
Blev medlem: 30 apr 2014, 08:11
Ort: Göteborg

Re: Övervaka postlådan med Moteino

Inlägg av gol »

Snyggt jobbat! :D
Kan tipsa om liknande prylar från MySensors.org.
Användarvisningsbild
Plutonium
Moderator
Inlägg: 1245
Blev medlem: 04 jan 2008, 02:34
Ort: Nossebro
Kontakt:

Re: Övervaka postlådan med Moteino

Inlägg av Plutonium »

Tackar!
Det ska jag ta en kik på.


Här kommer bilder på hur Gateway UI ser ut.

Bild
Bild
Bild
Graf så man lätt kan se brevbärarens mönster.
http://essunga.org
Moderator - Temperatur.nu
Användarvisningsbild
NiclasF
Tar hemautomation på allvar
Inlägg: 160
Blev medlem: 24 sep 2011, 00:55
Ort: Stockholm

Re: Övervaka postlådan med Moteino

Inlägg av NiclasF »

Min WMS mk3 har också en sändeffekt på 20dBm vid 5V, precis som Moteino. WMS kan prata direkt med din telldus. Dock kanske inte lika kul :)


Sent from my iPhone using Tapatalk
Användarvisningsbild
Plutonium
Moderator
Inlägg: 1245
Blev medlem: 04 jan 2008, 02:34
Ort: Nossebro
Kontakt:

Re: Övervaka postlådan med Moteino

Inlägg av Plutonium »

Uppdaterat schemat och koden. Hade problem innan att den inte somnade riktigt och på en vecka så hade den tömt mina fyra st AA Lithium batterier som annars ska hålla ut i månader.
Trail and error... Förhoppningsvis ska denna setup funka bättre.

Bild

Kod: Markera allt

#include <RFM69.h>
#include <SPI.h>
#include <LowPower.h>
#include <PinChangeInt.h>        // Two lines to include pinChangeInt library

//======================================================================
// NOTE!  The logic of mailbox OPEN vs CLOSED has been reversed for D4
// D4 = HIGH is Mailbox OPENED (magnetic switch open)
// D4 = LOW  is Mailbox CLOSED (magnetic switch closed)
//======================================================================


#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;
bool stateCheck=LOW;

uint32_t switchTime=0;      // variable to monitor when the switch last changed state (for debouncing)
#define  DEBOUNCE_TIME  50  // give it 50 mS to debounce a noisy switch

// Add function to catch interrupt, doesn't need to do anything as the interrupt is all that's needed to wakeup
void wakeUp(void)   
{
}

void setup()
{

//Setup the pins
  pinMode(LED, OUTPUT);
  pinMode(D4, INPUT_PULLUP);  // TOMWS: Use internal pullup as it's easier than adding an external one...
    
//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);  // TOMWS: This is not necessary if not using this mode
  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) == HIGH)  // If the mailbox is opened
  {
    switchTime = millis();   // record when we saw the switch change state
    stateCheck = LOW;
    if (sentOpen == false)  // have we already sent this?
    {
      // no, send it now
      if (radio.sendWithRetry(GATEWAYID, "MAIL:OPN", 8))
      {
        Serial.println(" nothing...");
        // Blink(LED,3);
      } else
      {
        Serial.println("Sending Open mailboxstatus to gateway..");
      }
      sentOpen = true;
      radio.sleep();  // we're done with the radio, make it sleep to save power immediately
    }
  } else  
  {
    switchTime = millis();   // record when we saw the switch change state
    stateCheck = HIGH;
    if (sentOpen == true)  // have we already sent this?
    {
      delay(10000);
      // no, send it now
      if (radio.sendWithRetry(GATEWAYID, "MAIL:CLS", 8))
      {
        Serial.println(" nothing...");
        
      } else
      {
        Serial.println("Sending closed, once... ");
      }
      sentOpen = false;
      radio.sleep();  // we're done with the radio, make it sleep to save power immediately
    }
  }
   
  while ((switchTime-millis()) < DEBOUNCE_TIME)  // debounce the switch
  {
    if (digitalRead(D4) == stateCheck) switchTime = millis();  // if we sense a 'bounce' reset the timer
  }
  
  Serial.flush();  // need to do before sleeping.
  
  // Allow wake up pin to trigger interrupt on either edge.
  PCintPort::attachInterrupt(D4, wakeUp, CHANGE);  // New code to trap interrupt on pin change
  
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);  // Changed to SLEEP_FOREVER so that only interrupts wake up, no WDT used
  
  // WOKEN UP!  Disable further interrupts until debounced
  PCintPort::detachInterrupt(D4);  // disable interrupts until debounced

}

void Blink(byte PIN, int DELAY_MS) // Local led blinking function
{
 // pinMode(PIN, OUTPUT);
 // digitalWrite(PIN,HIGH);
 // delay(DELAY_MS);
 // digitalWrite(PIN,LOW);
}
http://essunga.org
Moderator - Temperatur.nu
Skriv svar