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"); } }}