#include #include #include #define MQTT_SERVER_NAME "q.m2m.io" #define MQTT_SERVER_PORT 1883 #define MQTT_CLIENTID "Arduino_MEGA" #define MQTT_USER_NAME "1234567890" #define MQTT_USER_PASS "12345678901234567890123456789012" #define MQTT_DOMAIN "domainxx" #define MQTT_TOPIC_LIGHT MQTT_DOMAIN"/"MQTT_CLIENTID"/light" #define MQTT_TOPIC_CTRL MQTT_DOMAIN"/"MQTT_CLIENTID"/control" // MAC Address of Arduino Ethernet Sheild (on sticker on shield) byte MAC_ADDRESS[] = { 0x90, 0xA2, 0x01, 0x02, 0x03, 0x04 }; PubSubClient client; EthernetClient eclient; // Pin 9 is the LED output pin on an arduino UNO // Pin 13 is the LED output pin on an arduino MEGA int PIN_LED = 13; // Analog 0 is the input pin int PIN_LIGHTSENSOR = 0; // defines and variable for sensor/control mode #define MODE_OFF 0 // not sensing light, LED off #define MODE_ON 1 // not sensing light, LED on #define MODE_SENSE 2 // sensing light, LED controlled by software int senseMode = MODE_SENSE; unsigned long time; unsigned long runNumber = 0; char message_buff[100]; void setup() { // initialize the digital pin as an output. pinMode(PIN_LED, OUTPUT); // init serial link for debugging Serial.begin(9600); if (Ethernet.begin(MAC_ADDRESS) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); return; } // print your local IP address: Serial.print("Local IP="); Serial.println(Ethernet.localIP()); client = PubSubClient(MQTT_SERVER_NAME, MQTT_SERVER_PORT, callback, eclient); } void loop() { if (!client.connected()) { Serial.println("Reconnect to mqtt"); // clientID, username, MD5 encoded password if ( client.connect(MQTT_CLIENTID, MQTT_USER_NAME, MQTT_USER_PASS) ) { Serial.println(" Connect client ["MQTT_CLIENTID"] OK"); if ( client.publish(MQTT_TOPIC_LIGHT, "I'm alive "__TIME__)) { Serial.println(" Publishing alive message to ["MQTT_TOPIC_LIGHT"] OK"); if ( client.subscribe(MQTT_TOPIC_CTRL) ) { Serial.println(" Subscribe to ["MQTT_TOPIC_CTRL"] OK"); } else { Serial.println(" subscribe failed"); } } else { Serial.println(" publish failed"); } } else { Serial.println(" connect failed"); } } switch (senseMode) { case MODE_OFF: // light should be off digitalWrite(PIN_LED, LOW); break; case MODE_ON: // light should be on digitalWrite(PIN_LED, HIGH); break; case MODE_SENSE: // light is adaptive to light sensor // read from light sensor (photocell) int lightRead = analogRead(PIN_LIGHTSENSOR); // if there is light in the room, turn off LED // else, if it is "dark", turn it on // scale of light in this circit is roughly 0 - 900 // 500 is a "magic number" for "dark" if (lightRead > 500) { digitalWrite(PIN_LED, LOW); } else { digitalWrite(PIN_LED, HIGH); } // publish light reading every 5 seconds if (millis() > (time + 5000)) { time = millis(); String pubString = "{\"L\": \"" + String(lightRead) + "\", \"R\": \"" + String(runNumber) + "\"}"; pubString.toCharArray(message_buff, pubString.length() + 1); //Serial.println(pubString); client.publish(MQTT_TOPIC_LIGHT, message_buff); ++runNumber; } break; } // MQTT client loop processing client.loop(); } // handles message arrived on subscribed topic(s) void callback(char * topic, byte * payload, unsigned int length) { int i = 0; Serial.println("Message arrived: topic: " + String(topic)); Serial.println("Length: " + String(length, DEC)); // create character buffer with ending null terminator (string) for (i = 0; i < length; i++) { message_buff[i] = payload[i]; } message_buff[i] = '\0'; String msgString = String(message_buff); Serial.println("Payload: " + msgString); if (msgString.equals("{\"command\":{\"lightmode\": \"OFF\"}}")) { senseMode = MODE_OFF; Serial.println("Switching to OFF mode"); } else if (msgString.equals("{\"command\":{\"lightmode\": \"ON\"}}")) { senseMode = MODE_ON; Serial.println("Switching to ON mode"); } else if (msgString.equals("{\"command\":{\"lightmode\": \"SENSE\"}}")) { senseMode = MODE_SENSE; Serial.println("Switching to SENSE mode"); } }