diff --git a/Examples/PiGateway/PiGateway_withLCD.ino b/Examples/PiGateway/PiGateway_withLCD.ino index 3a40c97..077ed68 100644 --- a/Examples/PiGateway/PiGateway_withLCD.ino +++ b/Examples/PiGateway/PiGateway_withLCD.ino @@ -1,188 +1,185 @@ -//// ********************************************************************************************************** -//// NEEDED TO COMMENT THIS WHOLE SKETCH OUT BECAUSE OF THE LCD LIBRARY IS CAUSING A CC BUILD FAIL -/// ********************************************************************************************************** -//// GarageMote garage door controller base receiver sketch that works with Moteinos equipped with HopeRF RFM69W/RFM69HW -//// Can be adapted to use Moteinos using RFM12B -//// This is the sketch for the base, not the controller itself, and meant as another example on how to use a -//// Moteino as a gateway/base/receiver -//// 2014-07-14 (C) felix@lowpowerlab.com, http://www.LowPowerLab.com -//// ********************************************************************************************************** -//// Creative Commons Attrib Share-Alike License -//// You are free to use/extend this code/library but please abide with the CCSA license: -//// http://creativecommons.org/licenses/by-sa/4.0/ -//// ********************************************************************************** -// -//#include //get it here: http://github.com/lowpowerlab/rfm69 -//#include //get it here: http://github.com/lowpowerlab/spiflash -//#include //get it here: https://github.com/LowPowerLab/WirelessProgramming -//#include //comes with Arduino IDE (www.arduino.cc) -//#include "ST7036.h" //get it from here: https://bitbucket.org/fmalpartida/st7036-display-driver/src/ -//#include "LCD_C0220BiZ.h" //get it from here: https://bitbucket.org/fmalpartida/st7036-display-driver/src/ -//#include //comes with Arduino -// -////***************************************************************************************************************************** -//// ADJUST THE SETTINGS BELOW DEPENDING ON YOUR HARDWARE/SITUATION! -////***************************************************************************************************************************** -//#define NODEID 1 -//#define NETWORKID 200 -//#define FREQUENCY RF69_915MHZ //Match this with the version of your Moteino! (others: RF69_433MHZ, RF69_868MHZ) -//#define ENCRYPTKEY "sampleEncryptKey" //has to be same 16 characters/bytes on all nodes, not more not less! -//#define IS_RFM69HW //uncomment only for RFM69HW! Leave out if you have RFM69W! -//#define LED 9 -//#define FLASH_CS 8 -//#define SERIAL_BAUD 115200 -//#define SERIAL_EN //comment out if you don't want any serial verbose output -//#define ACK_TIME 30 // # of ms to wait for an ack -//#define BACKLIGHTPIN 5 //3=R,5=G,6=B -////***************************************************************************************************************************** -// -//#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; -//SPIFlash flash(FLASH_CS, 0xEF30); //EF40 for 16mbit windbond chip -// -////initialize LCD -//ST7036 lcd = ST7036(2, 20, 0x78, BACKLIGHTPIN); //row count, column count, I2C addr, pin for backlight PWM -//byte battChar[8] = {0b00000,0b01110,0b11111,0b11111,0b11111,0b11111,0b11111,0}; -//byte rssiChar[8] = {0b00000,0b00100,0b10101,0b01110,0b00100,0b00100,0b00100,0}; -// -//void setup() { -// Serial.begin(SERIAL_BAUD); -// delay(10); -// radio.initialize(FREQUENCY,NODEID,NETWORKID); -//#ifdef IS_RFM69HW -// radio.setHighPower(); //uncomment only for RFM69HW! -//#endif -// radio.encrypt(ENCRYPTKEY); -// char buff[50]; -// sprintf(buff, "\nListening @ %dmhz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915); -// DEBUGln(buff); -// if (flash.initialize()) -// { -// DEBUGln("SPI Flash Init OK!"); -// } -// else -// DEBUGln("SPI Flash Init FAIL! (is chip present?)"); -// -// lcd.init(); -// lcd.setContrast(10); -// lcd.clear(); -// lcd.load_custom_character(0, battChar); -// lcd.load_custom_character(1, rssiChar); -// lcd.setCursor(0,0); -// lcd.print(buff); -//} -// -//byte ackCount=0; -//byte inputLen=0; -//char input[64]; -//byte buff[61]; -//char LO[20]; -//char BAT[20]; -//char temp[25]; -//String inputstr; -//void loop() { -// inputLen = readSerialLine(input, 10, 64, 10); //readSerialLine(char* input, char endOfLineChar=10, byte maxLength=64, uint16_t timeout=10); -// inputstr = String(input); -// inputstr.toUpperCase(); -// -// if (inputLen > 0) -// { -// if (inputstr.equals("KEY?")) -// { -// DEBUG("ENCRYPTKEY:"); -// DEBUG(ENCRYPTKEY); -// } -// -// byte targetId = inputstr.toInt(); //extract ID if any -// byte colonIndex = inputstr.indexOf(":"); //find position of first colon -// if (targetId > 0) inputstr = inputstr.substring(colonIndex+1); //trim "ID:" if any -// if (targetId > 0 && targetId != NODEID && targetId != RF69_BROADCAST_ADDR && colonIndex>0 && colonIndex<4 && inputstr.length()>0) -// { -// -// inputstr.getBytes(buff, 61); -// //DEBUGln((char*)buff); -// //DEBUGln(targetId); -// //DEBUGln(colonIndex); -// if (radio.sendWithRetry(targetId, buff, inputstr.length())) -// { -// DEBUGln("ACK:OK"); -// } -// else -// DEBUGln("ACK:NOK"); -// } -// } -// -// if (radio.receiveDone()) -// { -// int rssi = radio.RSSI; -// DEBUG('[');DEBUG(radio.SENDERID);DEBUG("] "); -// if (radio.DATALEN > 0) -// { -// for (byte i = 0; i < radio.DATALEN; i++) -// DEBUG((char)radio.DATA[i]); -// DEBUG(" [RSSI:");DEBUG(rssi);DEBUG("]"); -// } -// -// CheckForWirelessHEX(radio, flash, false); //non verbose DEBUG -// -// if (radio.ACKRequested()) -// { -// byte theNodeID = radio.SENDERID; -// radio.sendACK(); -// DEBUG("[ACK-sent]"); -// } -// DEBUGln(); -// Blink(LED,3); -// -// lcd.clear(); -// lcd.setCursor(0,0); -// -// //if (radio.DATALEN < RF69_MAX_DATA_LEN) radio.DATA[radio.DATALEN]=0; -// byte matches = sscanf((const char*)radio.DATA, "%s BAT:%s", LO, BAT); -// if (matches==2) -// { -// lcd.print(LO); -// lcd.setCursor(0,14); -// lcd.print(char(0)); -// lcd.setCursor(0,15); -// lcd.print(BAT); -// } -// else lcd.print((const char*)radio.DATA); -// -// lcd.setCursor(1,14); -// lcd.print(char(1)); -// lcd.setCursor(1,16); -// lcd.print(rssi); -// } -//} -// -//void Blink(byte PIN, int DELAY_MS) +// GarageMote garage door controller base receiver sketch that works with Moteinos equipped with HopeRF RFM69W/RFM69HW +// Can be adapted to use Moteinos using RFM12B +// This is the sketch for the base, not the controller itself, and meant as another example on how to use a +// Moteino as a gateway/base/receiver +// 2014-07-14 (C) felix@lowpowerlab.com, http://www.LowPowerLab.com +// ********************************************************************************************************** +// Creative Commons Attrib Share-Alike License +// You are free to use/extend this code/library but please abide with the CCSA license: +// http://creativecommons.org/licenses/by-sa/4.0/ +// ********************************************************************************** + +#include //get it here: http://github.com/lowpowerlab/rfm69 +#include //get it here: http://github.com/lowpowerlab/spiflash +#include //get it here: https://github.com/LowPowerLab/WirelessProgramming +#include //comes with Arduino IDE (www.arduino.cc) +#include "ST7036.h" //get it from here: https://bitbucket.org/fmalpartida/st7036-display-driver/src/ +#include "LCD_C0220BiZ.h" //get it from here: https://bitbucket.org/fmalpartida/st7036-display-driver/src/ +#include //comes with Arduino + +//***************************************************************************************************************************** +// ADJUST THE SETTINGS BELOW DEPENDING ON YOUR HARDWARE/SITUATION! +//***************************************************************************************************************************** +#define NODEID 1 +#define NETWORKID 200 +#define FREQUENCY RF69_915MHZ //Match this with the version of your Moteino! (others: RF69_433MHZ, RF69_868MHZ) +#define ENCRYPTKEY "sampleEncryptKey" //has to be same 16 characters/bytes on all nodes, not more not less! +#define IS_RFM69HW //uncomment only for RFM69HW! Leave out if you have RFM69W! +#define LED 9 +#define FLASH_CS 8 +#define SERIAL_BAUD 115200 +#define SERIAL_EN //comment out if you don't want any serial verbose output +#define ACK_TIME 30 // # of ms to wait for an ack +#define BACKLIGHTPIN 5 //3=R,5=G,6=B +//***************************************************************************************************************************** + +#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; +SPIFlash flash(FLASH_CS, 0xEF30); //EF40 for 16mbit windbond chip + +//initialize LCD +ST7036 lcd = ST7036(2, 20, 0x78, BACKLIGHTPIN); //row count, column count, I2C addr, pin for backlight PWM +byte battChar[8] = {0b00000,0b01110,0b11111,0b11111,0b11111,0b11111,0b11111,0}; +byte rssiChar[8] = {0b00000,0b00100,0b10101,0b01110,0b00100,0b00100,0b00100,0}; + +void setup() { + Serial.begin(SERIAL_BAUD); + delay(10); + radio.initialize(FREQUENCY,NODEID,NETWORKID); +#ifdef IS_RFM69HW + radio.setHighPower(); //uncomment only for RFM69HW! +#endif + radio.encrypt(ENCRYPTKEY); + char buff[50]; + sprintf(buff, "\nListening @ %dmhz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915); + DEBUGln(buff); + if (flash.initialize()) + { + DEBUGln("SPI Flash Init OK!"); + } + else + DEBUGln("SPI Flash Init FAIL! (is chip present?)"); + + lcd.init(); + lcd.setContrast(10); + lcd.clear(); + lcd.load_custom_character(0, battChar); + lcd.load_custom_character(1, rssiChar); + lcd.setCursor(0,0); + lcd.print(buff); +} + +byte ackCount=0; +byte inputLen=0; +char input[64]; +byte buff[61]; +char LO[20]; +char BAT[20]; +char temp[25]; +String inputstr; +void loop() { + inputLen = readSerialLine(input, 10, 64, 10); //readSerialLine(char* input, char endOfLineChar=10, byte maxLength=64, uint16_t timeout=10); + inputstr = String(input); + inputstr.toUpperCase(); + + if (inputLen > 0) + { + if (inputstr.equals("KEY?")) + { + DEBUG("ENCRYPTKEY:"); + DEBUG(ENCRYPTKEY); + } + + byte targetId = inputstr.toInt(); //extract ID if any + byte colonIndex = inputstr.indexOf(":"); //find position of first colon + if (targetId > 0) inputstr = inputstr.substring(colonIndex+1); //trim "ID:" if any + if (targetId > 0 && targetId != NODEID && targetId != RF69_BROADCAST_ADDR && colonIndex>0 && colonIndex<4 && inputstr.length()>0) + { + + inputstr.getBytes(buff, 61); + //DEBUGln((char*)buff); + //DEBUGln(targetId); + //DEBUGln(colonIndex); + if (radio.sendWithRetry(targetId, buff, inputstr.length())) + { + DEBUGln("ACK:OK"); + } + else + DEBUGln("ACK:NOK"); + } + } + + if (radio.receiveDone()) + { + int rssi = radio.RSSI; + DEBUG('[');DEBUG(radio.SENDERID);DEBUG("] "); + if (radio.DATALEN > 0) + { + for (byte i = 0; i < radio.DATALEN; i++) + DEBUG((char)radio.DATA[i]); + DEBUG(" [RSSI:");DEBUG(rssi);DEBUG("]"); + } + + CheckForWirelessHEX(radio, flash, false); //non verbose DEBUG + + if (radio.ACKRequested()) + { + byte theNodeID = radio.SENDERID; + radio.sendACK(); + DEBUG("[ACK-sent]"); + } + DEBUGln(); + Blink(LED,3); + + lcd.clear(); + lcd.setCursor(0,0); + + //if (radio.DATALEN < RF69_MAX_DATA_LEN) radio.DATA[radio.DATALEN]=0; + byte matches = sscanf((const char*)radio.DATA, "%s BAT:%s", LO, BAT); + if (matches==2) + { + lcd.print(LO); + lcd.setCursor(0,14); + lcd.print(char(0)); + lcd.setCursor(0,15); + lcd.print(BAT); + } + else lcd.print((const char*)radio.DATA); + + lcd.setCursor(1,14); + lcd.print(char(1)); + lcd.setCursor(1,16); + lcd.print(rssi); + } +} + +void Blink(byte PIN, int DELAY_MS) +{ + pinMode(PIN, OUTPUT); + digitalWrite(PIN,HIGH); + delay(DELAY_MS); + digitalWrite(PIN,LOW); +} + +//readSerialLine already defined in WirelessHEX69 +// reads a line feed (\n) terminated line from the serial stream +// returns # of bytes read, up to 255 +// timeout in ms, will timeout and return after so long +//byte readSerialLine(char* input, char endOfLineChar=10, byte maxLength=64, uint16_t timeout=10); +//byte readSerialLine(char* input, char endOfLineChar, byte maxLength, uint16_t timeout) //{ -// pinMode(PIN, OUTPUT); -// digitalWrite(PIN,HIGH); -// delay(DELAY_MS); -// digitalWrite(PIN,LOW); -//} -// -////readSerialLine already defined in WirelessHEX69 -//// reads a line feed (\n) terminated line from the serial stream -//// returns # of bytes read, up to 255 -//// timeout in ms, will timeout and return after so long -////byte readSerialLine(char* input, char endOfLineChar=10, byte maxLength=64, uint16_t timeout=10); -////byte readSerialLine(char* input, char endOfLineChar, byte maxLength, uint16_t timeout) -////{ -//// byte inputLen = 0; -//// Serial.setTimeout(timeout); -//// inputLen = Serial.readBytesUntil(endOfLineChar, input, maxLength); -//// input[inputLen]=0;//null-terminate it -//// Serial.setTimeout(0); -//// //Serial.println(); -//// return inputLen; -////} +// byte inputLen = 0; +// Serial.setTimeout(timeout); +// inputLen = Serial.readBytesUntil(endOfLineChar, input, maxLength); +// input[inputLen]=0;//null-terminate it +// Serial.setTimeout(0); +// //Serial.println(); +// return inputLen; +//} \ No newline at end of file