-
Notifications
You must be signed in to change notification settings - Fork 0
/
arduino.ino
103 lines (95 loc) · 2.53 KB
/
arduino.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
char* ssid = "Auenland"; //Wi-Fi AP Name
char* password = "xxxxxxxx"; //Wi-Fi Password
char* mqtt_server = "192.168.2.102"; //MQTT Server IP
char* mqtt_name = "Livingroom Motion Sensor"; //MQTT device name
char* mqtt_topic = "home/livingroom/sensors/motion"; //MQTT topic for communication
int pirPin = 13; //set the GPIO which you will connect the PIR sensor
bool lowPower = false; //set to true if you want low power use
int delayTime = 2000; //ONLY FOR LOW POWER - how long motion detected should be active
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <PubSubClient.h>
WiFiClient mainESP;
PubSubClient MQTT(mainESP);
char* mqtt_maintopic = mqtt_topic;
void setup() {
pinMode(pirPin, INPUT_PULLUP);
Serial.begin(115200);
}
void loop() {
if (!lowPower && WiFi.status() != WL_CONNECTED)
startWiFi();
Serial.println(digitalRead(pirPin));
if ((digitalRead(pirPin)) == 0)
delay(250);
else {
if (WiFi.status() != WL_CONNECTED)
startWiFi();
MQTT.loop();
if (!MQTT.connected())
reconnect();
MQTT.publish(mqtt_topic, "1");
Serial.println("Message Published: TRUE");
while (digitalRead(pirPin) == 1) {
if (!MQTT.connected())
reconnect();
MQTT.publish(mqtt_topic, "1");
Serial.println("Message Published: TRUE");
delay(5000);
}
if (!MQTT.connected())
reconnect();
if (lowPower)
delay(delayTime);
MQTT.publish(mqtt_topic, "0");
Serial.println("Message Published: FALSE");
MQTT.loop();
delay(5000);
}
if (lowPower) {
WiFi.disconnect();
WiFi.mode(WIFI_OFF);
WiFi.forceSleepBegin();
delay(1);
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect() {
while (!MQTT.connected()) {
Serial.print("Attempting MQTT connection...");
if (MQTT.connect(mqtt_name)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(MQTT.state());
Serial.println(" try again in 5 seconds");
for (int i = 0; i < 5000; i++) {
delay(1);
}
}
}
}
void startWiFi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Connection Failed! Rebooting...");
delay(1000);
ESP.restart();
}
WiFi.hostname(mqtt_name);
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
MQTT.setServer(mqtt_server, 1883);
MQTT.setCallback(callback);
}