#include #include #include #include #include #include uint32_t delayMS; //start to count int sending_request_ms = 20000; // WiFi-Credentials const char *ssid = "xxxxxxxxxxxxxx"; const char *password = "xxxxxxxxxxxxxxxx"; // MQTT Broker IP address const char *mqtt_identifier = "xxxxxxxxxxxxx"; const char *mqtt_server = "xxxxxxxxxxxxxxx"; const char *mqtt_user = "xxxxxxxxxxx"; const char *mqtt_pass = "xxxxxxxxxxxxxxxxx"; WiFiClient espClient; PubSubClient client(espClient); char msg[50]; char topic[50]; long lastMsg = 0; bool gotTemp = false; bool gotHum = false; String latestTemp = ""; String latestHum = ""; #define SLAVE_ADDR 0x10 #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_SDA 6 // Yellow wire GP6 #define OLED_SCL 7 // Purple wire GP7 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire1, -1); void setup(void) { Serial.begin(115200); Wire.begin(); Wire1.setSDA(OLED_SDA); Wire1.setSCL(OLED_SCL); Wire1.begin(); if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println("SSD1306 OLED failed to start"); while (1) ; // Stop here if OLED fails } display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 20); display.println("Waiting..."); display.display(); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); delay(2000); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); if (gotTemp && gotHum) { Wire.beginTransmission(SLAVE_ADDR); // Address of the slave Wire.write("Data Aquired"); // Send 5 bytes Wire.endTransmission(); // Stop condition Serial.println("Sent: Data Aquired"); gotTemp = false; gotHum = false; display.clearDisplay(); display.setCursor(0, 40); display.println("Temp in *C: " + latestTemp); display.setCursor(0, 20); display.println("Hum in %: " + latestHum); display.display(); } long now = millis(); if (now - lastMsg > sending_request_ms) { lastMsg = now; Wire.beginTransmission(SLAVE_ADDR); // Address of the slave Wire.write("get"); // Send 5 bytes Wire.endTransmission(); // Stop condition Serial.println("Sent: get"); } } void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(mqtt_identifier, mqtt_user, mqtt_pass)) { Serial.println("connected"); // Subscribe strcpy(topic, mqtt_identifier); strcat(topic, "/humidity"); client.subscribe(topic); strcpy(topic, mqtt_identifier); strcat(topic, "/temperature"); client.subscribe(topic); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void callback(char *incomingTopic, byte *message, unsigned int length) { Serial.print("Message arrived on topic: "); Serial.print(incomingTopic); Serial.print(". Message: "); String messageTemp; for (int i = 0; i < length; i++) { Serial.print((char)message[i]); messageTemp += (char)message[i]; } Serial.println(); String expectedTopicTemperat = String(mqtt_identifier) + "/temperature"; String expectedTopicHumi = String(mqtt_identifier) + "/humidity"; if (String(incomingTopic) == expectedTopicTemperat) { Serial.println("Temperature: " + messageTemp); gotTemp = true; latestTemp = String(messageTemp); } if (String(incomingTopic) == expectedTopicHumi) { Serial.println("Humidity: " + messageTemp); gotHum = true; latestHum = String(messageTemp); } }