Table of Contents

Practical Evaluation: Building an End-to-End IoT Temperature Monitoring Stack

Context

Over the past three days, you built a complete IoT data pipeline using an ESP32, an analog soil moisture sensor, WiFi, MQTT, Node-RED, InfluxDB, and Grafana.

You practiced each layer of the IoT stack:

For this evaluation, you will repeat the same IoT stack, but with a different sensor: the DS18B20 digital temperature sensor.

The goal is not to test memorization. You are allowed to use the provided schematic, diagrams, starter code, previous workshop notes, and examples.

The goal is to demonstrate that you understand how the parts of the IoT stack connect and that you can adapt the workflow to a new sensor.

Evaluation Task

Main Objective

Build a working IoT temperature monitoring system using the ESP32 and DS18B20 temperature sensor, then send the temperature data through the full IoT stack:

DS18B20 → ESP32 → WiFi → MQTT → Node-RED → InfluxDB → Grafana

At the end of the evaluation, your system should:

Provided Resources

You may use the following resources during the evaluation:

You are expected to understand and adapt the materials, not reproduce them from memory.

Starter Code

The starter code gives you the basic structure of the program.

It does not contain the complete solution. You must complete the missing parts and adapt the code to your own MQTT topic, pin choices, threshold value, and setup.

#include <WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
 
// TODO: Add WiFi credentials
const char* SSID = "YOUR_WIFI_NAME";
const char* PASSWORD = "YOUR_WIFI_PASSWORD";
 
// TODO: Add MQTT broker address
const char* MQTT_HOST = "YOUR_MQTT_BROKER_IP";
const int MQTT_PORT = 1234;
 
// TODO: Define MQTT topic
const char* MQTT_TOPIC = "workshop/student-name/temperature";
 
// TODO: Define pins
#define ONE_WIRE_BUS 4
#define LED_PIN 2
 
WiFiClient wifi;
PubSubClient mqtt(wifi);
 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature temp_sensor(&oneWire);
 
void setup_wifi() {
  // TODO: Connect to WiFi
 
  // TODO: Print connection status
 
  // TODO: Print assigned IP address
}
 
void reconnect_mqtt() {
  // TODO: Check MQTT connection
 
  // TODO: Reconnect if disconnected
 
  // TODO: Print MQTT connection status
}
 
void setup() {
  Serial.begin(115200);
 
  pinMode(LED_PIN, OUTPUT);
 
  temp_sensor.begin();
 
  setup_wifi();
 
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
}
 
void loop() {
  if (!mqtt.connected()) {
    reconnect_mqtt();
  }
 
  mqtt.loop();
 
  // Request temperature from DS18B20
  temp_sensor.requestTemperatures();
 
  // Read temperature in Celsius
  float temperatureC = temp_sensor.getTempCByIndex(0);
 
  // Check whether the reading is valid
  if (temperatureC == DEVICE_DISCONNECTED_C) {
    Serial.println("Error: DS18B20 sensor not detected or reading failed");
    delay(2000);
    return;
  }
 
  // TODO: Print temperature to Serial Monitor
 
  // TODO: Add LED threshold logic
 
  // TODO: Convert temperature value to MQTT payload
 
  // TODO: Publish temperature to MQTT topic
} 

Starter Code Expectations

Your final code should include:

Hardware and Software

Hardware

The is the list of component that you need in order to complete this evaluation:

Software and Services

Practical Milestones, Requirements, and Deliverables

This section combines the required system behavior, the checkpoint structure, and the expected deliverables.

Each milestone should be demonstrated before moving to the next layer of the IoT stack.

The first milestone focuses only on the physical construction of the circuit. Students should not start debugging code before the sensor, resistors and ESP32 are correctly connected on the breadboard.

Milestone 1: Physical Breadboard Connection of the DS18B20 and ESP32

Required Behavior

1. The student must physically connect the DS18B20 temperature sensor to the ESP32 using the breadboard.

2. The circuit must include the required 4.7kΩ pull-up resistor between the DS18B20 data line and the power line.

At this stage, the focus is only on correct physical wiring.

No sensor reading, WiFi connection, MQTT publishing, Node-RED flow, InfluxDB storage, or Grafana dashboard is required yet.

Required Deliverables

You must show:

Checkpoint Evidence

The student demonstrates that:

Instructor Check

Before the student continues, the instructor should confirm:

Milestone 2: DS18B20 Sensor Reading

Required Behavior

The ESP32 must read temperature data from the DS18B20 sensor.

The temperature value should be read in degrees Celsius.

Example expected Serial Monitor output:

Temperature: 24.75 °C

Required Deliverables

The student or group must show:

Checkpoint Evidence

The student demonstrates that:

Milestone 3: Conditional Logic and LED Control

Required Behavior

The ESP32 must apply a simple condition to the temperature value and control an LED based on that condition.

Example condition:

If temperature is above 30°C, turn the LED on.
Otherwise, turn the LED off.

Students may choose a different threshold, but the threshold must be clearly stated in the code comments or final explanation.

Required Deliverables

The student or group must show:

Checkpoint Evidence

The student demonstrates that:

Milestone 4: WiFi Connection and IP Address

Required Behavior

The ESP32 must connect to the provided WiFi network.

The device should print the assigned IP address to the Serial Monitor after connecting.

Example expected Serial Monitor output:

Connected to WiFi
IP address: 192.168.1.42

Required Deliverables

The student or group must show:

Checkpoint Evidence

The student demonstrates that:

Milestone 5: MQTT Connection and Temperature Publishing

Required Behavior

The ESP32 must publish the temperature value to an MQTT topic.

Suggested topic format:

workshop/student-name/temperature

Example MQTT payload:

24.75

The payload should contain the temperature value as a number or a numeric string that can be processed in Node-RED.

Required Deliverables

The student or group must show:

Checkpoint Evidence

The student demonstrates that:

Milestone 6: Node-RED MQTT Subscription and Value Processing

Required Behavior

Create a Node-RED flow that receives the MQTT temperature data.

The flow must:

Recommended nodes:

Required Deliverables

The student or group must show:

Checkpoint Evidence

The student demonstrates that:

Milestone 7: Grafana Dashboard

Required Behavior

Create a Grafana dashboard that visualizes the temperature data from InfluxDB.

The dashboard should include at least one panel showing temperature over time.

Recommended panel title:

DS18B20 Temperature Reading

The graph should update as new MQTT messages are published and stored.

Required Deliverables

The student or group must show:

Checkpoint Evidence

The student demonstrates that:

Milestone 8: Final System Explanation

Required Behavior

The student must briefly explain the full data path:

DS18B20 → ESP32 → WiFi → MQTT → Node-RED → InfluxDB → Grafana

The explanation does not need to be long. It should show that the student understands what each part of the system does.

Required Deliverables

The student or group must explain:

Checkpoint Evidence

The student demonstrates that: