Created
April 25, 2017 08:15
-
-
Save jukbot/399d36bc28e94be4839cd832b9837293 to your computer and use it in GitHub Desktop.
JukFarm_demo.h
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
#include <Firebase.h> | |
#include <FirebaseArduino.h> | |
#include <FirebaseCloudMessaging.h> | |
#include <FirebaseError.h> | |
#include <FirebaseHttpClient.h> | |
#include <FirebaseObject.h> | |
#include <ESP8266WiFi.h> | |
#include <DHT.h> | |
#include <Wire.h> | |
#include <time.h> | |
#include <Arduino.h> | |
#ifdef ESP8266 | |
extern "C" { | |
#include "user_interface.h" | |
} | |
#endif | |
// Config DHT pin port | |
#define DHTPIN D1 | |
#define DHTTYPE DHT22 | |
// Config wifi network | |
#define WIFI_SSID "JukWifi" | |
#define WIFI_PASSWORD "jukjukjuk" | |
// Config firebase | |
#define FIREBASE_HOST "growth-66f16.firebaseio.com" | |
#define FIREBASE_AUTH "7eSaF9f9VRwxFuzOqQhhZ03r3mVr473atjqCZZRM" | |
// Config device | |
const String deviceNumber = "001"; | |
const String deviceName = "Juk's Farm"; | |
// Config time | |
int timezone = 7; // timezone | |
int dst = 0; // day save time | |
int delayCount = 0; // delayCount to push static data | |
int soilPin = A0; // select the input pin for the potentiometer | |
int soilValue = 0; // variable to store the value coming from soil sensor | |
char ntp_server1[20] = "th.pool.ntp.org"; | |
char ntp_server2[20] = "ntp.ku.ac.th"; | |
char ntp_server3[20] = "time.uni.net.th"; | |
// Set DHT Sensor port | |
DHT dht(DHTPIN, DHTTYPE); | |
void setup() { | |
pinMode(13, OUTPUT); // running light | |
pinMode(12, OUTPUT); // alarm light | |
pinMode(14, OUTPUT); // buzzer | |
rst_info *rsti; | |
Serial.begin(115200); | |
Serial.println(); | |
Serial.print("Booted "); | |
rsti = ESP.getResetInfoPtr(); | |
Serial.printf("RST_INFO = %lu\r\n", rsti->reason); | |
Serial.print("RESET REASON => "); | |
Serial.println(ESP.getResetReason()); | |
delay(1000); | |
if (rsti->reason == REASON_DEEP_SLEEP_AWAKE) { | |
ESP.reset(); | |
} | |
// connect to wifi. | |
WiFi.mode(WIFI_STA); | |
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); | |
Serial.print("Connecting to wifi.."); | |
while (WiFi.status() != WL_CONNECTED) { | |
Serial.print("."); | |
delay(500); | |
} | |
Serial.println(); | |
Serial.print("Connected to: "); | |
Serial.println(WiFi.localIP()); | |
tone(14, 2500, 200); // Send 1KHz sound signal.. | |
tone(14, 1000, 200); // Send 1KHz sound signal.. | |
tone(14, 1500, 200); // Send 1KHz sound signal.. | |
configTime(timezone * 3600, dst, ntp_server1, ntp_server2, ntp_server3); | |
Serial.println("Connecting to time server..."); | |
while (!time(nullptr)) { | |
Serial.print("."); | |
delay(500); | |
} | |
Serial.println(); | |
Serial.println("Now: " + DateString() + " " + TimeStamp()); | |
// Initial connecting to firebase | |
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); | |
Serial.println("Connected to firebase!!"); | |
Firebase.setString("device/" + deviceNumber + "/name", deviceName); | |
dht.begin(); | |
} | |
void loop() { | |
Serial.println("Start reading sensor..."); | |
// Read temp & Humidity for DHT22 | |
float h = dht.readHumidity(); | |
float t = dht.readTemperature(); | |
float hic = dht.computeHeatIndex(t, h, false); // Compute heat index in Celsius (isFahreheit = false) | |
String soil_status = "normal"; | |
// Check if any reads failed and exit early (to try again). | |
if (isnan(h) || isnan(t)) { | |
Serial.println("Failed to read from DHT sensor!"); | |
delay(500); | |
return; | |
} | |
soilValue = analogRead(soilPin); | |
float soil = ((1024-soilValue)*100.0)/1024.0; | |
// Print temp sensor | |
Serial.print("Temp: "); | |
Serial.print(t); | |
Serial.println(" *C "); | |
Serial.print("Humidity: "); | |
Serial.print(h); | |
Serial.println("%"); | |
Serial.print("Heat index: "); | |
Serial.println(hic); | |
Serial.print("Moisture of Soil: "); | |
Serial.print(soil); | |
Serial.println("%"); | |
if(soil < 20) { | |
Serial.println("Soil moisture: Low"); | |
soil_status = "Low Humid"; | |
digitalWrite(12, LOW); | |
} else if(soil >= 21 && soil <= 40) { | |
Serial.println("Soil moisture: Low"); | |
soil_status = "Low Humid"; | |
digitalWrite(12, LOW); | |
} else if(soil >= 41 && soil <= 70) { | |
Serial.println("Soil moisture: Medium"); | |
soil_status = "Normal"; | |
digitalWrite(12, LOW); | |
} else if(soil >= 71 && soil <= 80) { | |
Serial.println("Soil moisture: High"); | |
soil_status = "High Humid"; | |
Alarm(); | |
} else if(soil >= 81) { | |
Serial.println("Soil moisture: High"); | |
soil_status = "High Humid"; | |
Alarm(); | |
tone(14, 2000, 1000); // Send 1KHz sound signal.. | |
//noTone(14); // Stop sound... | |
} | |
// Set temp dynamic value to firebase | |
Firebase.setFloat("temp", t); | |
Firebase.setFloat("humid", h); | |
Firebase.setFloat("soil", soil); | |
Firebase.setString("soil_status", soil_status); | |
digitalWrite(13, HIGH); | |
delay(100); | |
if (Firebase.failed()) { | |
Serial.print("Set dynamic sensor failed:"); | |
Serial.println(Firebase.error()); | |
return; | |
} | |
delayCount += 1000; | |
Serial.println(delayCount); | |
if(delayCount == 600000) { | |
setStaticData(); | |
delayCount = 0; | |
} | |
digitalWrite(13, LOW); | |
} | |
void setStaticData() { | |
// Read temp & Humidity for DHT22 | |
float h = dht.readHumidity(); | |
float t = dht.readTemperature(); | |
soilValue = analogRead(soilPin); | |
float soil = ((1024-soilValue)*100.0)/1024.0; | |
String soil_status = "normal"; | |
// Check if any reads failed and exit early (to try again). | |
if (isnan(h) || isnan(t)) { | |
Serial.println("Failed to read from DHT sensor!"); | |
delay(1000); | |
return; | |
} | |
if(soil < 20) { | |
soil_status = "Low Humid"; | |
} else if(soil >= 21 && soil <= 40) { | |
soil_status = "Low Humid"; | |
} else if(soil >= 41 && soil <= 70) { | |
soil_status = "Normal"; | |
} else if(soil >= 71 && soil <= 80) { | |
soil_status = "High Humid"; | |
} else if(soil >= 81) { | |
soil_status = "High Humid"; | |
} | |
// Set buffer size and create json object | |
StaticJsonBuffer<200> jsonBuffer; | |
JsonObject& sensorData = jsonBuffer.createObject(); | |
sensorData["temperature"] = t; | |
sensorData["humidity"] = h; | |
sensorData["soil"] = soil; | |
sensorData["soil_status"] = soil_status; | |
sensorData["date"] = DateString(); | |
sensorData["time"] = TimeString(); | |
sensorData["timestamp"] = TimeStamp(); | |
// Push sensor data to firebase | |
String pushData = Firebase.push("sensor", sensorData); | |
if (Firebase.failed()) { | |
Serial.print("pushing static data failed:"); | |
Serial.println(Firebase.error()); | |
return; | |
} | |
Serial.println(pushData); | |
} | |
String DateString() { | |
time_t now = time(nullptr); | |
struct tm* newtime = localtime(&now); | |
String tmpNow = ""; | |
tmpNow += String(newtime->tm_mday); | |
tmpNow += "-"; | |
tmpNow += String(newtime->tm_mon + 1); | |
tmpNow += "-"; | |
tmpNow += String(newtime->tm_year + 1900); | |
return tmpNow; | |
} | |
String TimeString() { | |
time_t now = time(nullptr); | |
struct tm* newtime = localtime(&now); | |
String tmpNow = ""; | |
tmpNow += String(newtime->tm_hour); | |
tmpNow += ":"; | |
tmpNow += String(newtime->tm_min); | |
tmpNow += ":"; | |
tmpNow += String(newtime->tm_sec); | |
return tmpNow; | |
} | |
int TimeStamp() { | |
int tmpStp = (int)time(NULL); | |
return tmpStp; | |
} | |
void Alarm() { | |
digitalWrite(12, HIGH); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment