Add sketches for Motion,OLED,Mailbox motes
This commit is contained in:
parent
b381c06b23
commit
23be1a3ebe
|
|
@ -1,11 +1,14 @@
|
||||||
// Sample RFM69 sender/node sketch for motion sensor
|
// Sample RFM69 sender/node sketch for mailbox motion sensor
|
||||||
// http://www.lowpowerlab.com/mailbox
|
// http://www.lowpowerlab.com/mailbox
|
||||||
// PIR motion sensor connected to D3 (INT1)
|
// PIR motion sensor connected to D3 (INT1)
|
||||||
// When RISE happens on D3, the sketch transmits a "MOTION" msg to receiver Moteino and goes back to sleep
|
// When RISE happens on D3, the sketch transmits a "MOTION" msg to receiver Moteino and goes back to sleep
|
||||||
|
// It then wakes up every 32 seconds and sends a message indicating when the last
|
||||||
|
// motion event happened (days, hours, minutes, seconds ago) and the battery level
|
||||||
// In sleep mode, Moteino + PIR motion sensor use about ~78uA
|
// In sleep mode, Moteino + PIR motion sensor use about ~78uA
|
||||||
|
// Make sure you adjust the settings in the configuration section below !!!
|
||||||
|
|
||||||
// **********************************************************************************
|
// **********************************************************************************
|
||||||
// Copyright LowPowerLab.com
|
// Copyright Felix Rusu, LowPowerLab.com
|
||||||
// Library and code by Felix Rusu - felix@lowpowerlab.com
|
// Library and code by Felix Rusu - felix@lowpowerlab.com
|
||||||
// Get the RFM69 and SPIFlash library at: https://github.com/LowPowerLab/
|
// Get the RFM69 and SPIFlash library at: https://github.com/LowPowerLab/
|
||||||
// **********************************************************************************
|
// **********************************************************************************
|
||||||
|
|
@ -14,22 +17,21 @@
|
||||||
// This program is free software; you can redistribute it
|
// This program is free software; you can redistribute it
|
||||||
// and/or modify it under the terms of the GNU General
|
// and/or modify it under the terms of the GNU General
|
||||||
// Public License as published by the Free Software
|
// Public License as published by the Free Software
|
||||||
// Foundation; either version 2 of the License, or
|
// Foundation; either version 3 of the License, or
|
||||||
// (at your option) any later version.
|
// (at your option) any later version.
|
||||||
//
|
//
|
||||||
// This program is distributed in the hope that it will
|
// This program is distributed in the hope that it will
|
||||||
// be useful, but WITHOUT ANY WARRANTY; without even the
|
// be useful, but WITHOUT ANY WARRANTY; without even the
|
||||||
// implied warranty of MERCHANTABILITY or FITNESS FOR A
|
// implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
// PARTICULAR PURPOSE. See the GNU General Public
|
// PARTICULAR PURPOSE. See the GNU General Public
|
||||||
// License for more details.
|
// License for more details.
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General
|
// You should have received a copy of the GNU General
|
||||||
// Public License along with this program; if not, write
|
// Public License along with this program.
|
||||||
// to the Free Software Foundation, Inc.,
|
// If not, see <http://www.gnu.org/licenses/>.
|
||||||
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
//
|
//
|
||||||
// Licence can be viewed at
|
// Licence can be viewed at
|
||||||
// http://www.fsf.org/licenses/gpl.txt
|
// http://www.gnu.org/licenses/gpl-3.0.txt
|
||||||
//
|
//
|
||||||
// Please maintain this license information along with authorship
|
// Please maintain this license information along with authorship
|
||||||
// and copyright notices in any redistribution of this code
|
// and copyright notices in any redistribution of this code
|
||||||
|
|
@ -40,27 +42,28 @@
|
||||||
#include <LowPower.h> //get library from: https://github.com/LowPowerLab/LowPower
|
#include <LowPower.h> //get library from: https://github.com/LowPowerLab/LowPower
|
||||||
//writeup here: http://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-arduino-library/
|
//writeup here: http://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-arduino-library/
|
||||||
|
|
||||||
|
//*********************************************************************************************
|
||||||
|
// *********** IMPORTANT SETTINGS - YOU MUST CHANGE/ONFIGURE TO FIT YOUR HARDWARE *************
|
||||||
|
//*********************************************************************************************
|
||||||
#define NODEID 55 //unique for each node on same network
|
#define NODEID 55 //unique for each node on same network
|
||||||
#define NETWORKID 250 //the same on all nodes that talk to each other
|
#define NETWORKID 250 //the same on all nodes that talk to each other
|
||||||
#define GATEWAYID 1
|
#define GATEWAYID 1
|
||||||
|
|
||||||
//Match frequency to the hardware version of the radio on your Moteino (uncomment one):
|
//Match frequency to the hardware version of the radio on your Moteino (uncomment one):
|
||||||
//#define FREQUENCY RF69_433MHZ
|
//#define FREQUENCY RF69_433MHZ
|
||||||
//#define FREQUENCY RF69_868MHZ
|
//#define FREQUENCY RF69_868MHZ
|
||||||
//#define IS_RFM69HW //uncomment only for RFM69HW! Leave out if you have RFM69W!
|
|
||||||
|
|
||||||
#define FREQUENCY RF69_915MHZ
|
#define FREQUENCY RF69_915MHZ
|
||||||
|
#define IS_RFM69HW //uncomment only for RFM69HW! Leave out if you have RFM69W!
|
||||||
#define ENCRYPTKEY "sampleEncryptKey" //exactly the same 16 characters/bytes on all nodes!
|
#define ENCRYPTKEY "sampleEncryptKey" //exactly the same 16 characters/bytes on all nodes!
|
||||||
|
#define SENDEVERYXLOOPS 4 //each loop sleeps 8 seconds, so send status message every this many loops (default "4" = 32 seconds)
|
||||||
|
//*********************************************************************************************
|
||||||
|
|
||||||
#define MOTIONPIN 1 //hardware interrupt 1 (D3)
|
#define MOTIONPIN 1 //hardware interrupt 1 (D3)
|
||||||
#define BATTERYSENSE A7 //through 1Meg+470Kohm and 0.1uF cap from battery VCC - this ratio divides the voltage to bring it below 3.3V where it is scaled to a readable range
|
#define BATTERYSENSE A7 //through 1Meg+470Kohm and 0.1uF cap from battery VCC - this ratio divides the voltage to bring it below 3.3V where it is scaled to a readable range
|
||||||
#define LED 9 // Moteinos have LEDs on D9
|
#define LED 9 // Moteinos have LEDs on D9
|
||||||
//#define BLINK_EN //uncomment to make LED flash when messages are sent
|
//#define BLINK_EN //uncomment to make LED flash when messages are sent, leave out if you want low power
|
||||||
|
|
||||||
#define SENDEVERYXLOOPS 4 //each loop sleeps 8 seconds, so send status message every this many loops
|
|
||||||
|
|
||||||
#define SERIAL_BAUD 115200
|
#define SERIAL_BAUD 115200
|
||||||
//#define SERIAL_EN //uncomment this line to enable serial IO debug messages
|
//#define SERIAL_EN //uncomment this line to enable serial IO debug messages, leave out if you want low power
|
||||||
#ifdef SERIAL_EN
|
#ifdef SERIAL_EN
|
||||||
#define DEBUG(input) {Serial.print(input); delay(1);}
|
#define DEBUG(input) {Serial.print(input); delay(1);}
|
||||||
#define DEBUGln(input) {Serial.println(input); delay(1);}
|
#define DEBUGln(input) {Serial.println(input); delay(1);}
|
||||||
|
|
@ -69,7 +72,6 @@
|
||||||
#define DEBUGln(input);
|
#define DEBUGln(input);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int TRANSMITPERIOD = 300; //transmit a packet to gateway so often (in ms)
|
|
||||||
RFM69 radio;
|
RFM69 radio;
|
||||||
volatile boolean motionDetected=false;
|
volatile boolean motionDetected=false;
|
||||||
|
|
||||||
|
|
@ -171,4 +173,4 @@ void Blink(byte PIN, int DELAY_MS)
|
||||||
digitalWrite(PIN,HIGH);
|
digitalWrite(PIN,HIGH);
|
||||||
delay(DELAY_MS);
|
delay(DELAY_MS);
|
||||||
digitalWrite(PIN,LOW);
|
digitalWrite(PIN,LOW);
|
||||||
}
|
}
|
||||||
|
|
@ -1,15 +1,49 @@
|
||||||
// Sample RFM69 sender/node sketch for motion sensor
|
// Sample RFM69 sender/node sketch for the MotionMote
|
||||||
|
// http://lowpowerlab.com/motion
|
||||||
// PIR motion sensor connected to D3 (INT1)
|
// PIR motion sensor connected to D3 (INT1)
|
||||||
// When RISE happens on D3, the sketch transmits a "MOTION" msg to receiver Moteino and goes back to sleep
|
// When RISE happens on D3, the sketch transmits a "MOTION" msg to receiver Moteino and goes back to sleep
|
||||||
// In sleep mode, Moteino + PIR motion sensor use about ~78uA
|
// In sleep mode, Moteino + PIR motion sensor use about ~78uA
|
||||||
// Library and code by Felix Rusu - felix@lowpowerlab.com
|
|
||||||
// Get the RFM69 and SPIFlash library at: https://github.com/LowPowerLab/
|
// Get the RFM69 and SPIFlash library at: https://github.com/LowPowerLab/
|
||||||
|
// Make sure you adjust the settings in the configuration section below !!!
|
||||||
|
|
||||||
|
// **********************************************************************************
|
||||||
|
// Copyright Felix Rusu, LowPowerLab.com
|
||||||
|
// Library and code by Felix Rusu - felix@lowpowerlab.com
|
||||||
|
// **********************************************************************************
|
||||||
|
// License
|
||||||
|
// **********************************************************************************
|
||||||
|
// This program is free software; you can redistribute it
|
||||||
|
// and/or modify it under the terms of the GNU General
|
||||||
|
// Public License as published by the Free Software
|
||||||
|
// Foundation; either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will
|
||||||
|
// be useful, but WITHOUT ANY WARRANTY; without even the
|
||||||
|
// implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
// PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
// License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General
|
||||||
|
// Public License along with this program.
|
||||||
|
// If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
// Licence can be viewed at
|
||||||
|
// http://www.gnu.org/licenses/gpl-3.0.txt
|
||||||
|
//
|
||||||
|
// Please maintain this license information along with authorship
|
||||||
|
// and copyright notices in any redistribution of this code
|
||||||
|
// **********************************************************************************
|
||||||
|
|
||||||
#include <RFM69.h> //get it here: https://www.github.com/lowpowerlab/rfm69
|
#include <RFM69.h> //get it here: https://www.github.com/lowpowerlab/rfm69
|
||||||
#include <SPI.h> //get it here: https://github.com/lowpowerlab/spiflash
|
#include <SPI.h>
|
||||||
#include <LowPower.h> //get library from: https://github.com/LowPowerLab/LowPower
|
#include <LowPower.h> //get library from: https://github.com/lowpowerlab/lowpower
|
||||||
|
//writeup here: http://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-arduino-library/
|
||||||
|
|
||||||
#define NODEID 18 //unique for each node on same network
|
//*********************************************************************************************
|
||||||
|
// *********** IMPORTANT SETTINGS - YOU MUST CHANGE/ONFIGURE TO FIT YOUR HARDWARE *************
|
||||||
|
//*********************************************************************************************
|
||||||
|
#define NODEID 88 //unique for each node on same network
|
||||||
#define NETWORKID 100 //the same on all nodes that talk to each other
|
#define NETWORKID 100 //the same on all nodes that talk to each other
|
||||||
#define GATEWAYID 1
|
#define GATEWAYID 1
|
||||||
//Match frequency to the hardware version of the radio on your Moteino (uncomment one):
|
//Match frequency to the hardware version of the radio on your Moteino (uncomment one):
|
||||||
|
|
@ -17,14 +51,31 @@
|
||||||
//#define FREQUENCY RF69_868MHZ
|
//#define FREQUENCY RF69_868MHZ
|
||||||
#define FREQUENCY RF69_915MHZ
|
#define FREQUENCY RF69_915MHZ
|
||||||
#define ENCRYPTKEY "sampleEncryptKey" //exactly the same 16 characters/bytes on all nodes!
|
#define ENCRYPTKEY "sampleEncryptKey" //exactly the same 16 characters/bytes on all nodes!
|
||||||
//#define IS_RFM69HW //uncomment only for RFM69HW! Leave out if you have RFM69W!
|
#define IS_RFM69HW //uncomment only for RFM69HW! Remove/comment if you have RFM69W!
|
||||||
|
//*********************************************************************************************
|
||||||
|
|
||||||
#define ACK_TIME 30 // max # of ms to wait for an ack
|
#define ACK_TIME 30 // max # of ms to wait for an ack
|
||||||
#define LED 9 // Moteinos have LEDs on D9
|
#define ONBOARDLED 9 // Moteinos have LEDs on D9
|
||||||
#define SERIAL_BAUD 115200
|
#define EXTLED 5 // MotionOLEDMote has an external LED on D5
|
||||||
|
#define BATT_MONITOR A7 // Sense VBAT_COND signal (when powered externally should read ~3.25v/3.3v (1000-1023), when external power is cutoff it should start reading around 2.85v/3.3v * 1023 ~= 880 (ratio given by 10k+4.7K divider from VBAT_COND = 1.47 multiplier)
|
||||||
#define MOTIONPIN 1 //hardware interrupt 1 (D3)
|
#define MOTIONPIN 1 //hardware interrupt 1 (D3)
|
||||||
|
|
||||||
|
//#define SERIAL_EN //comment this out when deploying to an installed SM to save a few KB of sketch size
|
||||||
|
#define SERIAL_BAUD 115200
|
||||||
|
#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;
|
RFM69 radio;
|
||||||
volatile boolean motionDetected=false;
|
volatile boolean motionDetected=false;
|
||||||
|
float batteryVolts = 5;
|
||||||
|
char* BATstr="BAT:5.00v";
|
||||||
|
char sendBuf[32];
|
||||||
|
byte sendLen;
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(SERIAL_BAUD);
|
Serial.begin(SERIAL_BAUD);
|
||||||
|
|
@ -33,10 +84,13 @@ void setup() {
|
||||||
radio.setHighPower(); //uncomment only for RFM69HW!
|
radio.setHighPower(); //uncomment only for RFM69HW!
|
||||||
#endif
|
#endif
|
||||||
radio.encrypt(ENCRYPTKEY);
|
radio.encrypt(ENCRYPTKEY);
|
||||||
|
pinMode(MOTIONPIN, INPUT);
|
||||||
attachInterrupt(MOTIONPIN, motionIRQ, RISING);
|
attachInterrupt(MOTIONPIN, motionIRQ, RISING);
|
||||||
char buff[50];
|
char buff[50];
|
||||||
sprintf(buff, "\nTransmitting at %d Mhz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
|
sprintf(buff, "\nTransmitting at %d Mhz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
|
||||||
Serial.println(buff);
|
DEBUGln(buff);
|
||||||
|
pinMode(ONBOARDLED, OUTPUT);
|
||||||
|
pinMode(EXTLED, OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void motionIRQ()
|
void motionIRQ()
|
||||||
|
|
@ -47,15 +101,30 @@ void motionIRQ()
|
||||||
void loop() {
|
void loop() {
|
||||||
if (motionDetected)
|
if (motionDetected)
|
||||||
{
|
{
|
||||||
if (radio.sendWithRetry(GATEWAYID, "MOTION", 6))
|
digitalWrite(EXTLED, HIGH);
|
||||||
|
//TODO: read several samples and take average
|
||||||
|
//TODO: read analog only every N cycles
|
||||||
|
batteryVolts = analogRead(A7) * 0.00322 * 1.42;
|
||||||
|
dtostrf(batteryVolts, 3,2, BATstr);
|
||||||
|
//sprintf(sendBuf, "MOTION ............................................ BAT:%sv", BATstr);
|
||||||
|
sprintf(sendBuf, "MOTION BAT:%sv", BATstr);
|
||||||
|
sendLen = strlen(sendBuf);
|
||||||
|
|
||||||
|
if (radio.sendWithRetry(GATEWAYID, sendBuf, sendLen))
|
||||||
{
|
{
|
||||||
Serial.println(" ok!");
|
DEBUG("MOTION ACK:OK! RSSI:");
|
||||||
Blink(LED,3);
|
DEBUG(radio.RSSI);
|
||||||
}
|
}
|
||||||
else Serial.println(" nothing...");
|
else DEBUG("MOTION ACK:NOK...");
|
||||||
|
|
||||||
|
DEBUG(" VIN: ");
|
||||||
|
DEBUGln(BATstr);
|
||||||
|
|
||||||
|
radio.sleep();
|
||||||
|
//Blink(EXTLED,50); //Blink(ONBOARDLED,3);
|
||||||
motionDetected=false;
|
motionDetected=false;
|
||||||
|
digitalWrite(EXTLED, LOW);
|
||||||
}
|
}
|
||||||
radio.sleep();
|
|
||||||
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
|
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -65,4 +134,4 @@ void Blink(byte PIN, int DELAY_MS)
|
||||||
digitalWrite(PIN,HIGH);
|
digitalWrite(PIN,HIGH);
|
||||||
delay(DELAY_MS);
|
delay(DELAY_MS);
|
||||||
digitalWrite(PIN,LOW);
|
digitalWrite(PIN,LOW);
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
// Sample RFM69 sender/node sketch for motion sensor
|
||||||
|
// PIR motion sensor connected to D3 (INT1)
|
||||||
|
// When RISE happens on D3, the sketch transmits a "MOTION" msg to receiver Moteino and goes back to sleep
|
||||||
|
// In sleep mode, Moteino + PIR motion sensor use about ~78uA
|
||||||
|
// Library and code by Felix Rusu - felix@lowpowerlab.com
|
||||||
|
// Get the RFM69 and SPIFlash library at: https://github.com/LowPowerLab/
|
||||||
|
|
||||||
|
#include <RFM69.h> //get it here: https://www.github.com/lowpowerlab/rfm69
|
||||||
|
#include <SPI.h> //get it here: https://github.com/lowpowerlab/spiflash
|
||||||
|
#include <LowPower.h> //get library from: https://github.com/LowPowerLab/LowPower
|
||||||
|
|
||||||
|
#define NODEID 18 //unique for each node on same network
|
||||||
|
#define NETWORKID 100 //the same on all nodes that talk to each other
|
||||||
|
#define GATEWAYID 1
|
||||||
|
//Match frequency to the hardware version of the radio on your Moteino (uncomment one):
|
||||||
|
//#define FREQUENCY RF69_433MHZ
|
||||||
|
//#define FREQUENCY RF69_868MHZ
|
||||||
|
#define FREQUENCY RF69_915MHZ
|
||||||
|
#define ENCRYPTKEY "sampleEncryptKey" //exactly the same 16 characters/bytes on all nodes!
|
||||||
|
//#define IS_RFM69HW //uncomment only for RFM69HW! Leave out if you have RFM69W!
|
||||||
|
#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 MOTIONPIN 1 //hardware interrupt 1 (D3)
|
||||||
|
|
||||||
|
RFM69 radio;
|
||||||
|
volatile boolean motionDetected=false;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(SERIAL_BAUD);
|
||||||
|
radio.initialize(FREQUENCY,NODEID,NETWORKID);
|
||||||
|
#ifdef IS_RFM69HW
|
||||||
|
radio.setHighPower(); //uncomment only for RFM69HW!
|
||||||
|
#endif
|
||||||
|
radio.encrypt(ENCRYPTKEY);
|
||||||
|
attachInterrupt(MOTIONPIN, motionIRQ, RISING);
|
||||||
|
char buff[50];
|
||||||
|
sprintf(buff, "\nTransmitting at %d Mhz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
|
||||||
|
Serial.println(buff);
|
||||||
|
}
|
||||||
|
|
||||||
|
void motionIRQ()
|
||||||
|
{
|
||||||
|
motionDetected=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (motionDetected)
|
||||||
|
{
|
||||||
|
if (radio.sendWithRetry(GATEWAYID, "MOTION", 6))
|
||||||
|
{
|
||||||
|
Serial.println(" ok!");
|
||||||
|
Blink(LED,3);
|
||||||
|
}
|
||||||
|
else Serial.println(" nothing...");
|
||||||
|
motionDetected=false;
|
||||||
|
}
|
||||||
|
radio.sleep();
|
||||||
|
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blink(byte PIN, int DELAY_MS)
|
||||||
|
{
|
||||||
|
pinMode(PIN, OUTPUT);
|
||||||
|
digitalWrite(PIN,HIGH);
|
||||||
|
delay(DELAY_MS);
|
||||||
|
digitalWrite(PIN,LOW);
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
|
|
@ -0,0 +1,241 @@
|
||||||
|
// Sample RFM69 sketch for the MotionOLED mote containing the OLED
|
||||||
|
// Passes through any wireless received messages to the serial port & responds to ACKs
|
||||||
|
// Library and code by Felix Rusu - felix@lowpowerlab.com
|
||||||
|
// Get libraries at: https://github.com/LowPowerLab/
|
||||||
|
// Make sure you adjust the settings in the configuration section below !!!
|
||||||
|
|
||||||
|
// **********************************************************************************
|
||||||
|
// Copyright Felix Rusu, LowPowerLab.com
|
||||||
|
// Library and code by Felix Rusu - felix@lowpowerlab.com
|
||||||
|
// **********************************************************************************
|
||||||
|
// License
|
||||||
|
// **********************************************************************************
|
||||||
|
// This program is free software; you can redistribute it
|
||||||
|
// and/or modify it under the terms of the GNU General
|
||||||
|
// Public License as published by the Free Software
|
||||||
|
// Foundation; either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will
|
||||||
|
// be useful, but WITHOUT ANY WARRANTY; without even the
|
||||||
|
// implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
// PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
// License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General
|
||||||
|
// Public License along with this program.
|
||||||
|
// If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
// Licence can be viewed at
|
||||||
|
// http://www.gnu.org/licenses/gpl-3.0.txt
|
||||||
|
//
|
||||||
|
// Please maintain this license information along with authorship
|
||||||
|
// and copyright notices in any redistribution of this code
|
||||||
|
// **********************************************************************************
|
||||||
|
|
||||||
|
#include <RFM69.h> //get it here: https://www.github.com/lowpowerlab/rfm69
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <LowPower.h> //get library from: https://github.com/lowpowerlab/lowpower
|
||||||
|
#include "U8glib.h" //get library from: https://code.google.com/p/u8glib/
|
||||||
|
|
||||||
|
//*********************************************************************************************
|
||||||
|
// *********** IMPORTANT SETTINGS - YOU MUST CHANGE/ONFIGURE TO FIT YOUR HARDWARE *************
|
||||||
|
//*********************************************************************************************
|
||||||
|
#define NODEID 122 //unique for each node on same network
|
||||||
|
#define NETWORKID 100 //the same on all nodes that talk to each other
|
||||||
|
//Match frequency to the hardware version of the radio on your Moteino (uncomment one):
|
||||||
|
//#define FREQUENCY RF69_433MHZ
|
||||||
|
//#define FREQUENCY RF69_868MHZ
|
||||||
|
#define FREQUENCY RF69_915MHZ
|
||||||
|
#define ENCRYPTKEY "sampleEncryptKey" //exactly the same 16 characters/bytes on all nodes!
|
||||||
|
#define IS_RFM69HW //uncomment only for RFM69HW! Remove/comment if you have RFM69W!
|
||||||
|
//*********************************************************************************************
|
||||||
|
|
||||||
|
#define SERIAL_BAUD 115200
|
||||||
|
#define LED 5 // Moteinos have LEDs on D9, but for MotionMote we are using the external led on D5
|
||||||
|
#define BUZZER 6
|
||||||
|
#define BUTTON_INT 1 //user button on interrupt 1
|
||||||
|
#define BUTTON_PIN 3 //user button on interrupt 1
|
||||||
|
|
||||||
|
RFM69 radio;
|
||||||
|
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI SSD1306 OLED 128x64
|
||||||
|
bool promiscuousMode = true; //set to 'true' to sniff all packets on the same network
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(SERIAL_BAUD);
|
||||||
|
radio.initialize(FREQUENCY,NODEID,NETWORKID);
|
||||||
|
#ifdef IS_RFM69HW
|
||||||
|
radio.setHighPower(); //only for RFM69HW!
|
||||||
|
#endif
|
||||||
|
radio.encrypt(ENCRYPTKEY);
|
||||||
|
radio.promiscuous(promiscuousMode);
|
||||||
|
char buff[50];
|
||||||
|
sprintf(buff, "\nListening at %d Mhz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915);
|
||||||
|
Serial.println(buff);
|
||||||
|
pinMode(BUZZER, OUTPUT);
|
||||||
|
|
||||||
|
//configure OLED
|
||||||
|
u8g.setRot180(); //flip screen
|
||||||
|
// assign default color value
|
||||||
|
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
|
||||||
|
u8g.setColorIndex(255); // white
|
||||||
|
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
|
||||||
|
u8g.setColorIndex(3); // max intensity
|
||||||
|
else if ( u8g.getMode() == U8G_MODE_BW )
|
||||||
|
u8g.setColorIndex(1); // pixel on
|
||||||
|
else if ( u8g.getMode() == U8G_MODE_HICOLOR )
|
||||||
|
u8g.setHiColorByRGB(255,255,255);
|
||||||
|
u8g.begin();
|
||||||
|
Serial.flush();
|
||||||
|
pinMode(BUTTON_PIN, INPUT_PULLUP);
|
||||||
|
attachInterrupt(BUTTON_INT, handleButton, FALLING);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define FLAG_INTERRUPT 0x01
|
||||||
|
volatile int mainEventFlags = 0;
|
||||||
|
boolean buttonPressed = false;
|
||||||
|
void handleButton()
|
||||||
|
{
|
||||||
|
mainEventFlags |= FLAG_INTERRUPT;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte ackCount=0;
|
||||||
|
|
||||||
|
#define MSG_MAX_LEN 17 //OLED 1 line max # of chars (16 + EOL)
|
||||||
|
#define HISTORY_LEN 10 //hold this many past messages
|
||||||
|
typedef struct {
|
||||||
|
char data[MSG_MAX_LEN];
|
||||||
|
int rssi;
|
||||||
|
byte from;
|
||||||
|
} Message;
|
||||||
|
Message * messageHistory = new Message[HISTORY_LEN];
|
||||||
|
|
||||||
|
byte lastMessageIndex = HISTORY_LEN;
|
||||||
|
byte currMessageIndex = HISTORY_LEN;
|
||||||
|
byte historyLength = 0;
|
||||||
|
void loop() {
|
||||||
|
if (mainEventFlags & FLAG_INTERRUPT)
|
||||||
|
{
|
||||||
|
LowPower.powerDown(SLEEP_30MS, ADC_OFF, BOD_ON);
|
||||||
|
mainEventFlags &= ~FLAG_INTERRUPT;
|
||||||
|
if (!digitalRead(BUTTON_PIN)) {
|
||||||
|
buttonPressed=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buttonPressed)
|
||||||
|
{
|
||||||
|
buttonPressed = false;
|
||||||
|
Beep(10, false);
|
||||||
|
|
||||||
|
//save non-ACK messages in a circular buffer
|
||||||
|
if (!radio.ACK_RECEIVED && historyLength > 1) //only care if at least 2 messages saved. if only 1 message it should be displayed already
|
||||||
|
{
|
||||||
|
if (currMessageIndex==0)
|
||||||
|
currMessageIndex=historyLength-1;
|
||||||
|
else currMessageIndex--;
|
||||||
|
|
||||||
|
//Serial.print("HIST currIndex/histLen=");Serial.print(currMessageIndex+1);Serial.print("/");Serial.print(historyLength);
|
||||||
|
//Serial.print(" - ");
|
||||||
|
//Serial.println(messageHistory[currMessageIndex].data);
|
||||||
|
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw(messageHistory[currMessageIndex].data, messageHistory[currMessageIndex].rssi, messageHistory[currMessageIndex].from, true);
|
||||||
|
} while(u8g.nextPage());
|
||||||
|
//delay(10); //give OLED time to draw?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (radio.receiveDone())
|
||||||
|
{
|
||||||
|
Serial.print('[');Serial.print(radio.SENDERID);Serial.print("] ");
|
||||||
|
if (promiscuousMode)
|
||||||
|
Serial.print("to [");Serial.print(radio.TARGETID);Serial.print("] ");
|
||||||
|
|
||||||
|
Serial.print((char*)radio.DATA);
|
||||||
|
Serial.print(" [RX_RSSI:");Serial.print(radio.RSSI);Serial.print("]");
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
saveToHistory((char *)radio.DATA, radio.RSSI, radio.SENDERID);
|
||||||
|
Blink(LED,3);
|
||||||
|
Beep(20, true);
|
||||||
|
u8g.firstPage();
|
||||||
|
do {
|
||||||
|
draw((char*)radio.DATA, radio.RSSI, radio.SENDERID, false);
|
||||||
|
} while(u8g.nextPage());
|
||||||
|
//delay(10); //give OLED time to draw?
|
||||||
|
}
|
||||||
|
radio.receiveDone();
|
||||||
|
Serial.flush();
|
||||||
|
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_ON);
|
||||||
|
}
|
||||||
|
|
||||||
|
float batteryVolts = 5;
|
||||||
|
char* BATstr="BAT:5.00v";
|
||||||
|
void draw(char * data, int rssi, byte from, boolean isHist) {
|
||||||
|
char buff[20];
|
||||||
|
// graphic commands to redraw the complete screen should be placed here
|
||||||
|
u8g.setFont(u8g_font_unifont);
|
||||||
|
u8g.drawStr( 0, 10, data);
|
||||||
|
sprintf(buff, "ID:%d", from);
|
||||||
|
u8g.drawStr( 0, 25, buff);
|
||||||
|
sprintf(buff, "RSSI:%d", rssi);
|
||||||
|
u8g.drawStr( 60, 25, buff);
|
||||||
|
|
||||||
|
if (!isHist)
|
||||||
|
{
|
||||||
|
batteryVolts = analogRead(A7) * 0.00322 * 1.42;
|
||||||
|
dtostrf(batteryVolts, 3,2, BATstr);
|
||||||
|
sprintf(buff, "BAT:%sv", BATstr);
|
||||||
|
u8g.drawStr( 0, 55, buff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Beep(byte theDelay, boolean both)
|
||||||
|
{
|
||||||
|
if (theDelay > 20) theDelay = 20;
|
||||||
|
tone(BUZZER, 4200); //4200
|
||||||
|
delay(theDelay);
|
||||||
|
noTone(BUZZER);
|
||||||
|
LowPower.powerDown(SLEEP_15MS, ADC_OFF, BOD_ON);
|
||||||
|
if (both)
|
||||||
|
{
|
||||||
|
tone(BUZZER, 4500); //4500
|
||||||
|
delay(theDelay);
|
||||||
|
noTone(BUZZER);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Blink(byte PIN, int DELAY_MS)
|
||||||
|
{
|
||||||
|
pinMode(PIN, OUTPUT);
|
||||||
|
digitalWrite(PIN,HIGH);
|
||||||
|
delay(DELAY_MS);
|
||||||
|
digitalWrite(PIN,LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void saveToHistory(char * msg, int rssi, byte from)
|
||||||
|
{
|
||||||
|
byte length = strlen(msg);
|
||||||
|
byte i = 0;
|
||||||
|
if (lastMessageIndex >=9) lastMessageIndex = 0;
|
||||||
|
else lastMessageIndex++;
|
||||||
|
currMessageIndex = lastMessageIndex;
|
||||||
|
if (historyLength < HISTORY_LEN) historyLength++;
|
||||||
|
|
||||||
|
//Serial.print("HIST SAVE lastIndex=");Serial.print(lastMessageIndex);Serial.print(" strlen=");Serial.print(length);
|
||||||
|
//Serial.print(" msg=[");
|
||||||
|
|
||||||
|
for (; i<(MSG_MAX_LEN-1) && (i < length); i++)
|
||||||
|
{
|
||||||
|
messageHistory[lastMessageIndex].data[i] = msg[i];
|
||||||
|
Serial.print(msg[i]);
|
||||||
|
}
|
||||||
|
//Serial.print("] copied:");
|
||||||
|
messageHistory[lastMessageIndex].data[i] = '\0'; //terminate string
|
||||||
|
//Serial.println((char*)messageHistory[lastMessageIndex].data);
|
||||||
|
|
||||||
|
messageHistory[lastMessageIndex].rssi = rssi;
|
||||||
|
messageHistory[lastMessageIndex].from = from;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue