Skip to content

Instantly share code, notes, and snippets.

@jukbot
Created April 25, 2017 08:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jukbot/399d36bc28e94be4839cd832b9837293 to your computer and use it in GitHub Desktop.
Save jukbot/399d36bc28e94be4839cd832b9837293 to your computer and use it in GitHub Desktop.
JukFarm_demo.h
#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