2017. január 21., szombat

Arduino Firebase Communication

This is my first project when I use Arduino board with ESP-01 wifi module.

The project description:

  • The Arduino Nano board communicating with an ESP-01 wifi module and by the ESP-01 the Arduino sending datas to the Google Firebase database. 
Pre-requisites! I'll be using these components:
  • Arduino board (I use a Nano board)
  • Esp8266 Esp-01 wifi module
  • AMS1117 3.3 volt stabilizatior
  • Pir sensor 
  • Apache/PHP webserver or server side javascript compatible webserver
  • Firebase Database
  • 5 volt phone charger
  • Plastic box
Photos:






#include "SoftwareSerial.h"
String ssid ="";

String password="";
String token="";
SoftwareSerial esp(2, 3);// RX, TX

String data;
int loops;
int inputPin = 7;               // choose the input pin (for PIR sensor)
int pirState = LOW;
int val = 0; 
int sendInterval = 20; //sec
String server = "www.tifi.ro"; // www.example.com

String uri = "/ardu/index.php";// our example is /esppost.php

int DHpin = 8;//sensor pin

byte dat [5];

String temp ,hum;

void setup() {

pinMode (DHpin, OUTPUT);
pinMode(inputPin, INPUT);
esp.begin(115200);

Serial.begin(115200);

reset();

connectWifi();

}

//reset the esp8266 module

void reset() {

esp.println("AT+RST");

delay(1000);

if(esp.find("OK") ) Serial.println("Module Reset");

}

//connect to your wifi network

void connectWifi() {

String cmd = "AT+CWJAP=\"" +ssid+"\",\"" + password + "\"";

esp.println(cmd);

delay(4000);

if(esp.find("OK")) {

Serial.println("Connected!");

}

else {

connectWifi();

Serial.println("Cannot connect to wifi"); }

}

byte read_data () {

byte data;

for (int i = 0; i < 8; i ++) {

if (digitalRead (DHpin) == LOW) {

while (digitalRead (DHpin) == LOW); // wait for 50us

delayMicroseconds (30); // determine the duration of the high level to determine the data is '0 'or '1'

if (digitalRead (DHpin) == HIGH)

data |= (1 << (7-i)); // high front and low in the post

while (digitalRead (DHpin) == HIGH);

// data '1 ', wait for the next one receiver

}

} return data; }

void start_test () {

digitalWrite (DHpin, LOW); // bus down, send start signal

delay (30); // delay greater than 18ms, so DHT11 start signal can be detected

digitalWrite (DHpin, HIGH);

delayMicroseconds (40); // Wait for DHT11 response

pinMode (DHpin, INPUT);

while (digitalRead (DHpin) == HIGH);

delayMicroseconds (80);

// DHT11 response, pulled the bus 80us

if (digitalRead (DHpin) == LOW);

delayMicroseconds (80);

// DHT11 80us after the bus pulled to start sending data

for (int i = 0; i < 4; i ++)

// receive temperature and humidity data, the parity bit is not considered

dat[i] = read_data ();

pinMode (DHpin, OUTPUT);

digitalWrite (DHpin, HIGH);

// send data once after releasing the bus, wait for the host to open the next Start signal

}

void loop () {
loops++;
Serial.println(loops);
if(loops == sendInterval)
{
start_test ();

// convert the bit data to string form

//hum = String(dat[0]);

//temp= String(dat[2]);

hum = "test hum";
temp = "test temp";
data = "temp=" + temp + "&hum=" + hum + "&token=" + token;// data sent must be under this form //name1=value1&name2=value2.

httppost();

delay(1000);
}
val = digitalRead(inputPin);  // read input value

  
  if (val == HIGH) {            // check if the input is HIGH
    digitalWrite(13, HIGH);  // turn LED ON
    if (pirState == LOW) {
      // we have just turned on
      Serial.println("Motion detected!");
      data = "event=Motion&token=" + token;// data sent must be under this form //name1=value1&name2=value2.

      httppost();
      // We only want to print on the output change, not state
      pirState = HIGH;
      delay(1000);
    }
  }


  else {
    digitalWrite(13, LOW); // turn LED OFF
    if (pirState == HIGH){
      // we have just turned of
      Serial.println("Motion ended!");
      // We only want to print on the output change, not state
      pirState = LOW;
    }
  }

}

void httppost () {

esp.println("AT+CIPSTART=\"TCP\",\"" + server + "\",80");//start a TCP connection.

if( esp.find("OK")) {

Serial.println("TCP connection ready");

}
//delay(1000);

String postRequest =

"POST " + uri + " HTTP/1.0\r\n" +

"Host: " + server + "\r\n" +

"Accept: *" + "/" + "*\r\n" +

"Content-Length: " + data.length() + "\r\n" +

"Content-Type: application/x-www-form-urlencoded\r\n" +

"\r\n" + data;

String sendCmd = "AT+CIPSEND=";//determine the number of caracters to be sent.

esp.print(sendCmd);

esp.println(postRequest.length() );

delay(2500);

if(esp.find(">")) { Serial.println("Sending.."); esp.print(postRequest);

if( esp.find("SEND OK")) { Serial.println("Packet sent");

while (esp.available()) {

String tmpResp = esp.readString();

Serial.println(tmpResp);

}

// close the connection

esp.println("AT+CIPCLOSE");

}

}}