Created
January 26, 2020 16:46
-
-
Save choonewza/1ab5f75422122b03251f72f6b24219be to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*Downlink from Lora IoT by CAT is 012020012412105920200124143000 (00yyyyMMddhhmmssyyyyMMddhhmmss) | |
Device : RelayA => 01, RelayB => 02 | |
Start : 2020-01-24 12:10:59 => 20200124121059 | |
Stop : 2020-01-24 14:30:00 => 20200124143000 | |
*/ | |
#include <TimeLib.h> | |
#include <Wire.h> | |
#include <DS3231.h> | |
#include <DHT.h> | |
#include "CatLoRaS76S.h" | |
#include "LedModule.h" | |
#include "DateTimeLib.h" | |
#include "RelayModule.h" | |
#include "Screen.h" | |
#define RED_LED_PIN 13 | |
#define GREEN_LED_PIN 12 | |
#define RELAY_A_PIN 5 | |
#define RELAY_B_PIN 6 | |
#define DHT22_PIN 9 | |
#define LORA_ABP_CLASS "C" | |
#define LORA_DEV_EUI "????????????????" | |
#define LORA_DEV_ADDR "????????" | |
#define LORA_NWKS_KEY "????????????????????????????????" | |
#define LORA_APPS_KEY "????????????????????????????????" | |
String startTimeRelayA = "1970-01-01 00:00:01"; | |
String stopTimeRelayA = "1970-01-01 00:00:01"; | |
String startTimeRelayB = "1970-01-01 00:00:01"; | |
String stopTimeRelayB = "1970-01-01 00:00:01"; | |
LedModule redLed("Red LED", RED_LED_PIN); | |
LedModule greenLed("Green LED", GREEN_LED_PIN); | |
DS3231 clock; | |
RTCDateTime dt; | |
uint8_t seconds = 0; | |
CatLoRaS76S lora; | |
uint8_t intervalLoraTX = 30; | |
uint8_t intervalLoraRX = 1; | |
uint8_t port = 1; | |
String payload = "00"; | |
RelayModule relayA("Relay A", RELAY_A_PIN); | |
RelayModule relayB("Relay B", RELAY_B_PIN); | |
Screen display; | |
String msg; | |
uint8_t msgCount = 0; | |
uint8_t msgDuration = 6; | |
DHT dht(DHT22_PIN, DHT22); | |
uint8_t intervalReadSensor = 15; | |
float temperature; | |
float humidity; | |
void setup() { | |
Serial.begin(115200); | |
delay(2000); | |
// Initialize LED | |
redLed.begin(); | |
greenLed.begin(); | |
redLed.on(); | |
// Initialize Screen | |
display.begin(); | |
display.show("Startup", 2, 20, 0); | |
delay(2000); | |
// Initialize Relay | |
Serial.println("-> Initialize Relay"); | |
display.showTwoLine("Initialize", "-> Relay..."); | |
relayA.begin(); | |
relayB.begin(); | |
relayA.trunOnWhen(startTimeRelayA, stopTimeRelayA); | |
relayB.trunOnWhen(startTimeRelayB, stopTimeRelayB); | |
delay(1000); | |
// Initialize DS3231 | |
Serial.println("-> Initialize DS3231"); | |
display.showTwoLine("Initialize", "-> DS3231..."); | |
clock.begin(); | |
if (clock.isReady() && Serial) { | |
clock.setDateTime(__DATE__, __TIME__); | |
} | |
delay(1000); | |
// Initialize DHT22 | |
Serial.println("-> Initialize Sensor"); | |
display.showTwoLine("Initialize", "-> DHT22"); | |
dht.begin(); | |
readSensor(); | |
delay(1000); | |
// Initialize LoRa | |
Serial.println("-> Initialize Lora"); | |
display.showTwoLine("LoraByCAT", "-> Freq. Setting..."); | |
lora.begin(115200); | |
Serial.println("-> Lora ABP Join"); | |
String loraJoinText = String("-> ABP ") + String(LORA_ABP_CLASS) + String(" Join..."); | |
display.showTwoLine("LoraByCAT", loraJoinText.c_str()); | |
lora.joinABP(String(LORA_ABP_CLASS), | |
String(LORA_DEV_EUI), | |
String(LORA_DEV_ADDR), | |
String(LORA_NWKS_KEY), | |
String(LORA_APPS_KEY)); | |
// start-up success -> red led turn-on; | |
redLed.off(); | |
greenLed.on(); | |
Serial.println("-> Ready Go!"); | |
display.showTwoLine("Ready Go!", ""); | |
delay(2000); | |
} | |
void loop() { | |
dt = clock.getDateTime(); | |
if (dt.second != seconds) { | |
seconds = dt.second; | |
// ----- Show current datetime on terminal | |
String datetime = String(clock.dateFormat("d M Y H:i:s", dt)); | |
Serial.println(datetime); | |
showOnDisplay(datetime); | |
// ----- Read sensor ----- | |
if (seconds % intervalReadSensor == 0) { | |
readSensor(); | |
} | |
// ----- Check datetime for action ----- | |
relayA.doAction(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second); | |
relayB.doAction(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second); | |
// ----- LoRa TX ----- | |
if (seconds % intervalLoraTX == 0) { | |
loraTransmit(); | |
} | |
// ----- LoRa RX ----- | |
if (seconds % intervalLoraRX == 0) { | |
loraReceive(); | |
} | |
} | |
} | |
void showOnDisplay(String datetime) { | |
String temp = String(temperature) + " C"; | |
String humi = String(humidity) + " %"; | |
//delay for show message | |
if (msg != "") { | |
if (msgCount > msgDuration) { | |
msg = ""; | |
msgCount = 0; | |
} | |
msgCount++; | |
} | |
display.mainScreen(datetime, temp, humi, msg); | |
} | |
void readSensor() { | |
temperature = dht.readTemperature(); | |
humidity = dht.readHumidity(); | |
payload = getTemperatureCayenneLPPformat(temperature) + getHumidityCayenneLPPformat(humidity); | |
} | |
void loraTransmit() { | |
msg = String("-> TX : ") + port + " " + payload; | |
lora.transmit(port, payload); | |
} | |
void loraReceive() { | |
String receive = lora.receive(); | |
String msgResult = "-> RX : "; | |
if (receive != "") { | |
unsigned int rxPort = lora.getPortReceive(receive); | |
String rxPayload = lora.getPayloadReceive(receive); | |
if (rxPort != 0 && rxPayload != "") { | |
Serial.println("-----RX From CAT LORA-----"); | |
Serial.println(String("Port = ") + rxPort); | |
Serial.println(String("Payload = ") + rxPayload); | |
/*Downlink from Lora IoT by CAT is 012020012412105920200124143000 (00yyyyMMddhhmmssyyyyMMddhhmmss) | |
Device : RelayA => 01, RelayB => 02 | |
Start : 2020-01-24 12:10:59 => 20200124121059 | |
Stop : 2020-01-24 14:30:00 => 20200124143000 | |
rxPayload = 012020012412105920200124143000; | |
*/ | |
//for device | |
uint8_t device = (uint8_t) rxPayload.substring(0, 2).toInt(); | |
//new start datetime | |
uint16_t sYear = (uint16_t) rxPayload.substring(2, 6).toInt(); | |
uint8_t sMonth = (uint8_t) rxPayload.substring(6, 8).toInt(); | |
uint8_t sDay = (uint8_t) rxPayload.substring(8, 10).toInt(); | |
uint8_t sHour = (uint8_t) rxPayload.substring(10, 12).toInt(); | |
uint8_t sMinute = (uint8_t) rxPayload.substring(12, 14).toInt(); | |
uint8_t sSecond = (uint8_t) rxPayload.substring(14, 16).toInt(); | |
//new stop datetime | |
uint16_t eYear = (uint16_t) rxPayload.substring(16, 20).toInt(); | |
uint8_t eMonth = (uint8_t) rxPayload.substring(20, 22).toInt(); | |
uint8_t eDay = (uint8_t) rxPayload.substring(22, 24).toInt(); | |
uint8_t eHour = (uint8_t) rxPayload.substring(24, 26).toInt(); | |
uint8_t eMinute = (uint8_t) rxPayload.substring(26, 28).toInt(); | |
uint8_t eSecond = (uint8_t) rxPayload.substring(28, 30).toInt(); | |
//set startLedUnixtime and stopLedUnixtime | |
String deviceSelected = "Not Found"; | |
if (device == 1) { | |
deviceSelected = "Relay A"; | |
msgResult += "-> Relay A"; | |
relayA.trunOnWhen(sYear, sMonth, sDay, sHour, sMinute, sSecond, eYear, eMonth, eDay, eHour, eMinute, eSecond); | |
} else if (device == 2) { | |
deviceSelected = "Relay B"; | |
msgResult += "-> Relay B"; | |
relayB.trunOnWhen(sYear, sMonth, sDay, sHour, sMinute, sSecond, eYear, eMonth, eDay, eHour, eMinute, eSecond); | |
} | |
//set datetime format yyyy-MM-dd HH:mm:ss | |
char startLedDateTime[32]; | |
char stopLedDateTime[32]; | |
sprintf(startLedDateTime, "%04d-%02d-%02d %02d:%02d:%02d", sYear, sMonth, sDay, sHour, sMinute, sSecond); | |
sprintf(stopLedDateTime, "%04d-%02d-%02d %02d:%02d:%02d", eYear, eMonth, eDay, eHour, eMinute, eSecond); | |
//Show new datetime | |
Serial.println(String("Device Select : ") + deviceSelected); | |
Serial.println(String("New Start LED : ") + startLedDateTime); | |
Serial.println(String("New Stop LED : ") + stopLedDateTime); | |
msg = msgResult + startLedDateTime + " " + stopLedDateTime; | |
} | |
} | |
} | |
String getTemperatureCayenneLPPformat(float temperature) { | |
String temp = ""; | |
String cayenneLPPformat = ""; | |
String cayenTemp = "0067"; //3digi (2byte) *0.1(10) | |
temp = uint16_t(temperature * 10); | |
char tempHex[5]; | |
sprintf(tempHex, "%04x", temp.toInt()); | |
cayenneLPPformat = cayenTemp + tempHex; | |
return cayenneLPPformat; | |
} | |
String getHumidityCayenneLPPformat(float humidity) { | |
String humi = ""; | |
String cayenneLPPformat = ""; | |
String cayenHumi = "0168"; //2digi (1byte) *0.5(2) | |
humi = uint16_t(humidity * 2); | |
char humiHex[3]; | |
sprintf(humiHex, "%02x", humi.toInt()); | |
cayenneLPPformat = cayenHumi + humiHex; | |
return cayenneLPPformat; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment