Differences

This shows you the differences between two versions of the page.

Link to this comparison view

iothings:laboratoare:2025_code:lab3_3 [2025/10/11 13:19] (current)
dan.tudose created
Line 1: Line 1:
 +<code C main.cpp>​
 +#include <​Arduino.h>​
 +#include <​WiFi.h>​
 +#include <​Wire.h>​
 +#include <​MQTT.h> ​             ​
 +#include <​ArduinoJson.h>​
 +#include <​Adafruit_BME680.h>​
  
 +////////////////​ EDIT THESE ////////////////​
 +const char* WIFI_SSID ​    = "​YOUR_SSID";​
 +const char* WIFI_PASSWORD = "​YOUR_PASSWORD";​
 +const char* MQTT_HOST ​    = "​test.mosquitto.org"; ​  // or your lab broker
 +const uint16_t MQTT_PORT ​ = 1883;
 +const char* BASE_TOPIC ​   = "​iot/​studentname"; ​       // change per student
 +////////////////////////////////////////////​
 +
 +// Sparrow I2C: SDA=21, SCL=22
 +#define SDA_PIN 21
 +#define SCL_PIN 22
 +Adafruit_BME680 bme;  // I2C
 +
 +WiFiClient net;
 +MQTTClient mqtt(1024); ​  // 1KB message buffer
 +
 +void ensureWiFi() {
 +  if (WiFi.status() == WL_CONNECTED) return;
 +  WiFi.mode(WIFI_STA);​
 +  WiFi.begin(WIFI_SSID,​ WIFI_PASSWORD);​
 +  Serial.print("​WiFi connecting"​);​
 +  while (WiFi.status() != WL_CONNECTED) {
 +    delay(400);
 +    Serial.print("​."​);​
 +  }
 +  Serial.printf("​\nIP:​ %s\n", WiFi.localIP().toString().c_str());​
 +}
 +
 +void ensureMQTT() {
 +  if (mqtt.connected()) return;
 +
 +  // Optional Last Will so dashboards see offline state
 +  String willTopic = String(BASE_TOPIC) + "/​bme688/​status";​
 +  mqtt.setWill(willTopic.c_str(),​ "​offline",​ true, 1);
 +
 +  String cid = String("​sparrow-c6-sense-"​) + String((uint32_t)ESP.getEfuseMac(),​ HEX);
 +  Serial.println("​MQTT connecting..."​);​
 +  while (!mqtt.connect(cid.c_str())) {
 +    Serial.print("​."​);​
 +    delay(1000);​
 +  }
 +  Serial.println("​\nMQTT connected"​);​
 +
 +  // Publish "​online"​ status retained
 +  mqtt.publish(willTopic,​ "​online",​ true, 1);
 +}
 +
 +unsigned long lastPub = 0;
 +
 +void setup() {
 +  Serial.begin(115200);​
 +  delay(200);
 +
 +  Wire.begin(SDA_PIN,​ SCL_PIN);
 +
 +  // MQTT broker + transport
 +  mqtt.begin(MQTT_HOST,​ MQTT_PORT, net);
 +
 +  if (!bme.begin(0x76)) {           // Sparrow uses 0x76
 +    Serial.println("​BME688 not found!"​);​
 +    for(;;) { delay(1000);​ }
 +  }
 +  // Reasonable oversampling;​ heater off for simplicity
 +  bme.setTemperatureOversampling(BME680_OS_8X);​
 +  bme.setHumidityOversampling(BME680_OS_2X);​
 +  bme.setPressureOversampling(BME680_OS_4X);​
 +  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);​
 +  bme.setGasHeater(0,​ 0);  // off
 +}
 +
 +void loop() {
 +  ensureWiFi();​
 +  ensureMQTT();​
 +
 +  mqtt.loop(); ​    // process incoming/​keepalive
 +  delay(10);
 +
 +  if (millis() - lastPub > 10000) {
 +    lastPub = millis();
 +
 +    if (!bme.performReading()) {
 +      Serial.println("​BME read failed"​);​
 +      return;
 +    }
 +
 +    // Build JSON (ArduinoJson v7 style, no deprecated StaticJsonDocument)
 +    JsonDocument doc;
 +    doc["​ts"​] ​       = (uint32_t)(millis() / 1000);
 +    doc["​temp_c"​] ​   = bme.temperature;​
 +    doc["​hum_pct"​] ​  = bme.humidity;​
 +    doc["​press_hpa"​] = bme.pressure / 100.0;
 +    doc["​gas_ohm"​] ​  = bme.gas_resistance;​
 +
 +    String payload;
 +    serializeJson(doc,​ payload);
 +
 +    String topic = String(BASE_TOPIC) + "/​bme688";​
 +    bool ok = mqtt.publish(topic,​ payload); ​ // QoS0, non-retained
 +    Serial.printf("​Pub %s => %s (%s)\n",​
 +                  topic.c_str(),​ payload.c_str(),​ ok ? "​OK"​ : "​FAIL"​);​
 +  }
 +}
 +
 +</​code>​
iothings/laboratoare/2025_code/lab3_3.txt · Last modified: 2025/10/11 13:19 by dan.tudose
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0