/* Macrocell environmental sensor project EnviSens * * This firmware provides features to use the NodeMCU ESP12 unit as an environmental sensor broker. * It currently collects all the sensor information via I2C from a connected ATMEGA. * * (C) 2019 Macrocell - Environmental sensing solutions * proudly presented by Macrocell - FPGA Innovators */ #include #include #include #include "configuration.h" #include "sensing.h" char data[8]; char sensor_name[5]; float sensor_value; long lastMsg = 0; WiFiClient espClient; PubSubClient client(espClient); Sensor temp = {"temperature (°C)", TOPIC_TEMP, DIFF_TEMP, 0.0, 0.0, -1}; // temperature Sensor hmid = {"humidity (%)", TOPIC_HMID, DIFF_HMID, 0.0, 0.0, -1}; // humidity Sensor abhu = {"absolute humidity (gr/m³)", TOPIC_ABHU, DIFF_ABHU, 0.0, 0.0, -1}; // absolute humidity Sensor heat = {"heat index (°C)", TOPIC_HEAT, DIFF_HEAT, 0.0, 0.0, -1}; // heat index Sensor airq = {"air quality (ppm)", TOPIC_AIRQ, DIFF_AIRQ, 0.0, 0.0, -1}; // air quality void setup() { Serial.begin(SERIAL_BAUDRATE); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); setup_wifi(); client.setServer(MQTT_SERVER, MQTT_PORT); Wire.begin(); // join i2c bus as master } void loop() { if (!client.connected()) { reconnect(client); } client.loop(); digitalWrite(LED_BUILTIN, HIGH); long now = millis(); if (now - lastMsg > OPERATION_PERIOD / 2) { if (OPERATION_BLINK_EN) {digitalWrite(LED_BUILTIN, LOW);} } if (now - lastMsg > OPERATION_PERIOD) { lastMsg = now; if (OPERATION_BLINK_EN) {digitalWrite(LED_BUILTIN, HIGH);} Wire.requestFrom(8, 8); // request 6 bytes from slave device #8 int i = 0; while(Wire.available()) { // slave may send less than requested char c = Wire.read(); // receive a byte as character data[i] = byte(c); i = i + 1; } union sensor_tag {byte sensor_b[4]; float sensor_float;} sensor_union; //DRPS = Drum Revs per Second sensor_name[0] = char(data[0]); sensor_name[1] = char(data[1]); sensor_name[2] = char(data[2]); sensor_name[3] = char(data[3]); sensor_name[4] = '\0'; sensor_union.sensor_b[0] = data[4]; sensor_union.sensor_b[1] = data[5]; sensor_union.sensor_b[2] = data[6]; sensor_union.sensor_b[3] = data[7]; sensor_value = sensor_union.sensor_float; Serial.print("Received sensor reading: "); Serial.print(sensor_name); Serial.print(" - "); Serial.println(sensor_value); if (strcmp(sensor_name, "hmid") == 0){ hmid.value = sensor_value; } else if (strcmp(sensor_name, "temp") == 0){ temp.value = sensor_value; } else if (strcmp(sensor_name, "heat") == 0){ heat.value = sensor_value; } else if (strcmp(sensor_name, "airq") == 0){ airq.value = sensor_value; } else{ Serial.println("ERR: Sensor could not be identified"); } if (!isnan(hmid.value) && !isnan(temp.value) && hmid.value != 0.0 && temp.value != 0.0){ abhu.value = (6.112 * ( pow(2.71828, ((17.67 * temp.value) / (temp.value + 243.5))) * hmid.value * 2.1674)) / (273.15 + temp.value); } publishSensor(client, temp); publishSensor(client, hmid); publishSensor(client, heat); publishSensor(client, abhu); publishSensor(client, airq); } }