{"id":52269,"date":"2026-11-01T10:50:48","date_gmt":"2026-11-01T10:50:48","guid":{"rendered":"http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/"},"modified":"2026-11-01T10:50:48","modified_gmt":"2026-11-01T10:50:48","slug":"iot-sensor-node","status":"publish","type":"siratek_tutorial","link":"https:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/","title":{"rendered":"Project, an IoT Sensor Node"},"content":{"rendered":"<body><p><\/p>\n<h2>What you will build<\/h2>\n<p>A small box you put in a room. It measures temperature and humidity, publishes them over Wi-Fi every minute, and tells you when it stops.<\/p>\n<p>Build two and you can compare rooms. Build five and you have a picture of a building. That is what separates this from the weather station: <strong>one node is a gadget, several nodes are information<\/strong>, and the design here is about making a node you would be willing to build five of.<\/p>\n<h2>Before you begin<\/h2>\n<h3>Parts<\/h3>\n<table>\n<thead>\n<tr>\n<th>Part<\/th>\n<th>Siratek product<\/th>\n<th>Its own tutorial<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>ESP32 development board<\/td>\n<td>2590<\/td>\n<td><em>ESP32, Your First Wi-Fi Project<\/em><\/td>\n<\/tr>\n<tr>\n<td>DHT22 temperature and humidity<\/td>\n<td>2870<\/td>\n<td><em>DHT22, Better Accuracy Than the DHT11<\/em><\/td>\n<\/tr>\n<tr>\n<td>USB power supply and cable<\/td>\n<td><\/td>\n<td><em>Powering Your Project<\/em><\/td>\n<\/tr>\n<tr>\n<td>Breadboard and jumper wires<\/td>\n<td><\/td>\n<td><em>Using a Breadboard<\/em><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>A <strong>DHT11<\/strong> works too and costs less. The DHT22 is worth the difference here because the DHT11 reports whole degrees, and comparing two rooms that differ by half a degree needs the decimal.<\/p>\n<p>A <strong>broker<\/strong> is needed. <em>Sending Sensor Data with MQTT<\/em> covers the three options; this page assumes one on your own network, which is the right answer once you have more than one node.<\/p>\n<h3>Why an ESP32 and not an Uno<\/h3>\n<p>Everything in this project could be done with an Uno and a Wi-Fi module, and it would be worse in every way. The ESP32 has the radio built in, is 3.3 V throughout so the sensor connects directly, has memory to spare, and costs less than the parts it replaces.<\/p>\n<p>It is also the only board here that can do the thing that makes a node practical: <strong>deep sleep<\/strong>.<\/p>\n<h3>Design decisions, before any code<\/h3>\n<p>A node that runs for one evening is easy. A node you will build five of and then forget about needs four decisions made deliberately.<\/p>\n<p><strong>1. It must name itself.<\/strong> Five identical nodes publishing to <code>siratek\/temperature<\/code> are useless. Each needs its own topic, and typing a different name into five sketches is how you end up with two nodes called <code>kitchen<\/code>. The sketch below derives a unique id from the chip\u2019s MAC address and publishes under it, with a friendly name you set once.<\/p>\n<p><strong>2. It must say when it dies.<\/strong> A node that stops publishing looks exactly like a node reporting an unchanged temperature. MQTT\u2019s <strong>last will<\/strong> solves this: the broker publishes <code>offline<\/code> on the node\u2019s behalf when it vanishes. Without it, a failed node is invisible.<\/p>\n<p><strong>3. It must survive the network going away.<\/strong> Routers reboot. Wi-Fi drops. A node that needs power-cycling after every blip is not a node you will build five of.<\/p>\n<p><strong>4. It must not need a laptop to diagnose.<\/strong> The onboard LED carries the state, so you can tell from across the room whether a node is connected.<\/p>\n<h2>How it works<\/h2>\n<pre><code>DHT22  -&gt;  ESP32  --Wi-Fi--&gt;  broker  --&gt;  dashboard, phone, logger<\/code><\/pre>\n<p>The node connects outward. Nothing connects to it, which is why it works behind a router with no configuration, and why several things can watch at once.<\/p>\n<p>Topics, with <code>&lt;id&gt;<\/code> being the node\u2019s own identifier:<\/p>\n<table>\n<thead>\n<tr>\n<th>Topic<\/th>\n<th>Carries<\/th>\n<th>Retained<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>siratek\/&lt;id&gt;\/temperature<\/code><\/td>\n<td>Degrees C, one decimal<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td><code>siratek\/&lt;id&gt;\/humidity<\/code><\/td>\n<td>Per cent<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td><code>siratek\/&lt;id&gt;\/status<\/code><\/td>\n<td><code>online<\/code> or <code>offline<\/code><\/td>\n<td><strong>Yes<\/strong><\/td>\n<\/tr>\n<tr>\n<td><code>siratek\/&lt;id&gt;\/name<\/code><\/td>\n<td>The friendly name<\/td>\n<td><strong>Yes<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Retained<\/strong> means the broker keeps the last value and hands it to anything that subscribes later. It is right for the status and the name, which a dashboard needs immediately on connecting, and wrong for readings, where a subscriber should wait for a fresh one rather than being told a value from last Tuesday.<\/p>\n<h3>The LED code<\/h3>\n<table>\n<thead>\n<tr>\n<th>LED<\/th>\n<th>Meaning<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Fast blink<\/td>\n<td>Connecting to Wi-Fi<\/td>\n<\/tr>\n<tr>\n<td>Slow blink<\/td>\n<td>Wi-Fi up, connecting to the broker<\/td>\n<\/tr>\n<tr>\n<td>On, with a brief flick each publish<\/td>\n<td>Running normally<\/td>\n<\/tr>\n<tr>\n<td>Off<\/td>\n<td>Not running<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Two seconds of looking tells you what a serial monitor would.<\/p>\n<h2>Pin reference<\/h2>\n<table>\n<thead>\n<tr>\n<th>Pin<\/th>\n<th>Connect to<\/th>\n<th>Notes<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>DHT22 <code>+<\/code><\/td>\n<td>ESP32 <code>3V3<\/code><\/td>\n<td>The sensor is happy at 3.3 V<\/td>\n<\/tr>\n<tr>\n<td>DHT22 <code>out<\/code><\/td>\n<td>ESP32 <code>GPIO 4<\/code><\/td>\n<td>A general-purpose pin<\/td>\n<\/tr>\n<tr>\n<td>DHT22 <code>-<\/code><\/td>\n<td>ESP32 <code>GND<\/code><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Onboard LED<\/td>\n<td><code>GPIO 2<\/code><\/td>\n<td>Already on the board<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Note what is <strong>not<\/strong> here: no level converter, because the ESP32 and the sensor are both 3.3 V. That is one of the quiet advantages of this board.<\/p>\n<figure class=\"siratek-tutorial-figure\"><img decoding=\"async\" src=\"http:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/iot-sensor-node-overview.svg\" alt=\"A sensor node publishing to a broker over Wi-Fi, with several nodes feeding one dashboard and a retained status topic saying which are online\" loading=\"lazy\"><figcaption>Each node names itself from its MAC address and publishes outward. The retained status topic is what makes a dead node visible.<\/figcaption><\/figure>\n<h2>Build it in stages<\/h2>\n<h3>Stage 1: Wi-Fi alone<\/h3>\n<p>Run the connection sketch from <em>ESP32, Your First Wi-Fi Project<\/em>. Note the signal strength where the node will actually live, not on your desk. Below about -80 dBm, move it or add an antenna before building anything else.<\/p>\n<h3>Stage 2: the sensor alone<\/h3>\n<p>Read the DHT22 to the serial monitor. Two seconds between readings; the DHT22 needs it.<\/p>\n<h3>Stage 3: publish<\/h3>\n<p>Combine them with the MQTT tutorial\u2019s sketch and watch a value arrive in an MQTT client. Stop here and confirm it before adding anything else.<\/p>\n<h3>Stage 4: make it a node<\/h3>\n<p>Add the identity, the will, the reconnection and the LED. The complete sketch below.<\/p>\n<h2>The complete sketch<\/h2>\n<pre><code>\/\/ Siratek: an IoT sensor node.\n\/\/ Publishes temperature and humidity, names itself, and says when it dies.\n\n#include &lt;WiFi.h&gt;\n#include &lt;PubSubClient.h&gt;\n#include &lt;DHT.h&gt;\n\nconst char* ssid     = \"your network name\";\nconst char* password = \"your password\";\n\nconst char* brokerHost = \"192.168.1.10\";   \/\/ your own broker\nconst int   brokerPort = 1883;\n\n\/\/ Set this per node. The id below is derived and is always unique.\nconst char* friendlyName = \"kitchen\";\n\nconst int dhtPin = 4;\nconst int ledPin = 2;\n\nDHT dht(dhtPin, DHT22);\nWiFiClient wifi;\nPubSubClient mqtt(wifi);\n\nchar nodeId[20];\nchar topicTemperature[48];\nchar topicHumidity[48];\nchar topicStatus[48];\nchar topicName[48];\n\nconst unsigned long PUBLISH_EVERY = 60000UL;\nconst unsigned long RETRY_EVERY   = 5000UL;\n\nunsigned long lastPublish = 0;\nunsigned long lastAttempt = 0;\nunsigned long lastBlink = 0;\n\nenum Health { CONNECTING_WIFI, CONNECTING_BROKER, RUNNING };\nHealth health = CONNECTING_WIFI;\n\nvoid buildIdentity() {\n  uint64_t mac = ESP.getEfuseMac();\n  snprintf(nodeId, sizeof(nodeId), \"%s-%04X\",\n           friendlyName, (uint16_t) (mac &gt;&gt; 32));\n\n  snprintf(topicTemperature, sizeof(topicTemperature), \"siratek\/%s\/temperature\", nodeId);\n  snprintf(topicHumidity,    sizeof(topicHumidity),    \"siratek\/%s\/humidity\",    nodeId);\n  snprintf(topicStatus,      sizeof(topicStatus),      \"siratek\/%s\/status\",      nodeId);\n  snprintf(topicName,        sizeof(topicName),        \"siratek\/%s\/name\",        nodeId);\n}\n\nvoid showHealth() {\n  unsigned long interval = 0;\n  switch (health) {\n    case CONNECTING_WIFI:   interval = 150; break;\n    case CONNECTING_BROKER: interval = 600; break;\n    case RUNNING:           digitalWrite(ledPin, HIGH); return;\n  }\n\n  if (millis() - lastBlink &gt;= interval) {\n    lastBlink = millis();\n    digitalWrite(ledPin, !digitalRead(ledPin));\n  }\n}\n\nbool connectBroker() {\n  \/\/ The last three arguments are the will: what the broker publishes\n  \/\/ on our behalf if we disappear without saying goodbye.\n  if (!mqtt.connect(nodeId, NULL, NULL, topicStatus, 0, true, \"offline\")) {\n    Serial.print(F(\"broker connect failed, state \"));\n    Serial.println(mqtt.state());\n    return false;\n  }\n\n  mqtt.publish(topicStatus, \"online\", true);     \/\/ retained\n  mqtt.publish(topicName, friendlyName, true);   \/\/ retained\n  Serial.println(F(\"broker connected\"));\n  return true;\n}\n\nvoid setup() {\n  pinMode(ledPin, OUTPUT);\n  Serial.begin(115200);\n  delay(300);\n\n  buildIdentity();\n  Serial.print(F(\"Siratek node: \"));\n  Serial.println(nodeId);\n\n  dht.begin();\n\n  WiFi.mode(WIFI_STA);\n  WiFi.setAutoReconnect(true);\n  WiFi.begin(ssid, password);\n\n  mqtt.setServer(brokerHost, brokerPort);\n  mqtt.setBufferSize(256);\n\n  lastPublish = millis() - PUBLISH_EVERY;\n}\n\nvoid publishReadings() {\n  float t = dht.readTemperature();\n  float h = dht.readHumidity();\n\n  if (isnan(t) || isnan(h)) {\n    Serial.println(F(\"sensor read failed, not publishing\"));\n    return;\n  }\n\n  char payload[12];\n\n  snprintf(payload, sizeof(payload), \"%.1f\", t);\n  mqtt.publish(topicTemperature, payload);\n\n  snprintf(payload, sizeof(payload), \"%.1f\", h);\n  mqtt.publish(topicHumidity, payload);\n\n  Serial.print(F(\"published \"));\n  Serial.print(t, 1);\n  Serial.print(F(\" C  \"));\n  Serial.print(h, 1);\n  Serial.println(F(\" %\"));\n\n  \/\/ A visible flick, so the LED shows activity without leaving the running state.\n  digitalWrite(ledPin, LOW);\n  delay(30);\n  digitalWrite(ledPin, HIGH);\n}\n\nvoid loop() {\n  if (WiFi.status() != WL_CONNECTED) {\n    health = CONNECTING_WIFI;\n    showHealth();\n    return;                                  \/\/ WiFi reconnects by itself\n  }\n\n  if (!mqtt.connected()) {\n    health = CONNECTING_BROKER;\n    showHealth();\n\n    if (millis() - lastAttempt &gt;= RETRY_EVERY) {\n      lastAttempt = millis();\n      connectBroker();\n    }\n    return;\n  }\n\n  health = RUNNING;\n  showHealth();\n  mqtt.loop();\n\n  if (millis() - lastPublish &gt;= PUBLISH_EVERY) {\n    lastPublish = millis();\n    publishReadings();\n  }\n}<\/code><\/pre>\n<h3>Four details that make this a node rather than a demonstration<\/h3>\n<p><strong>The id is derived, the name is chosen.<\/strong> <code>kitchen-A3F2<\/code> is unique even if you flash the same sketch to five boards and forget to change the name. The friendly name is published retained, so a dashboard can show \u201ckitchen\u201d while the topics stay unambiguous.<\/p>\n<p><strong><code>setAutoReconnect(true)<\/code> and an early return.<\/strong> When Wi-Fi drops, the ESP32 reconnects by itself and the loop simply does nothing useful until it does. No manual reconnection logic, and no blocking.<\/p>\n<p><strong>Retained on status and name, not on readings.<\/strong> A dashboard connecting at midnight should learn immediately which nodes exist and which are alive. It should not be handed a temperature from hours ago as though it were current.<\/p>\n<p><strong>A failed sensor read publishes nothing.<\/strong> Publishing <code>nan<\/code> puts a hole in every chart downstream. Saying nothing for one minute is the better failure.<\/p>\n<h2>Testing it<\/h2>\n<table>\n<thead>\n<tr>\n<th>Try this<\/th>\n<th>It should<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Power it up<\/td>\n<td>Fast blink, slow blink, then steady with a flick each minute<\/td>\n<\/tr>\n<tr>\n<td>Subscribe to <code>siratek\/#<\/code><\/td>\n<td>See the name, the status, then readings<\/td>\n<\/tr>\n<tr>\n<td>Unplug the node<\/td>\n<td><code>offline<\/code> appears on the status topic within the keepalive<\/td>\n<\/tr>\n<tr>\n<td>Plug it back in<\/td>\n<td><code>online<\/code> and readings resume with no intervention<\/td>\n<\/tr>\n<tr>\n<td>Reboot your router<\/td>\n<td>Reconnect by itself once the network returns<\/td>\n<\/tr>\n<tr>\n<td>Unplug the sensor<\/td>\n<td>Node stays online, publishes nothing, says so on serial<\/td>\n<\/tr>\n<tr>\n<td>Flash a second board<\/td>\n<td>A second id appears, distinct from the first<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The third is the one worth watching deliberately. Seeing <code>offline<\/code> arrive without the node having sent it is the moment the will message makes sense.<\/p>\n<h2>Making it yours<\/h2>\n<ul>\n<li><strong>Batteries and deep sleep.<\/strong> The real version of this project. The ESP32 wakes, connects, publishes and sleeps for fifteen minutes, averaging a few milliamps instead of eighty. That changes a node from something plugged in to something you put anywhere. <em>Regulators, Batteries and Solar<\/em> covers the supply; note that reconnecting Wi-Fi on each wake costs a few seconds of full current, so the arithmetic is worth doing.<\/li>\n<li><strong>More sensors per node.<\/strong> A BMP280 on the I2C pins adds pressure for very little. Keep any analog sensor on <code>GPIO 32<\/code> to <code>39<\/code>, because the others stop working with Wi-Fi on.<\/li>\n<li><strong>A dashboard.<\/strong> Node-RED or Home Assistant subscribing to <code>siratek\/#<\/code> will draw charts and send alerts without you writing any more code.<\/li>\n<li><strong>Accept commands.<\/strong> Subscribe to <code>siratek\/&lt;id&gt;\/command<\/code> and the node can be told to publish immediately or change its interval. <em>Sending Sensor Data with MQTT<\/em> has the callback, including why the payload is not a string.<\/li>\n<\/ul>\n<h2>Troubleshooting<\/h2>\n<table>\n<thead>\n<tr>\n<th>Symptom<\/th>\n<th>Likely cause<\/th>\n<th>Check or fix<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Fast blink for ever<\/td>\n<td>Wi-Fi not connecting<\/td>\n<td>2.4 GHz only; check the password<\/td>\n<\/tr>\n<tr>\n<td>Slow blink for ever<\/td>\n<td>Broker unreachable<\/td>\n<td>Check the address; is the broker running?<\/td>\n<\/tr>\n<tr>\n<td>Two nodes keep disconnecting each other<\/td>\n<td>Same client id<\/td>\n<td>The MAC-derived id prevents this<\/td>\n<\/tr>\n<tr>\n<td>Readings arrive, status never does<\/td>\n<td>Not published retained<\/td>\n<td>The <code>true<\/code> argument<\/td>\n<\/tr>\n<tr>\n<td>Dashboard shows a dead node as alive<\/td>\n<td>No will message<\/td>\n<td>Set it on <code>connect()<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>publish()<\/code> returns false<\/td>\n<td>Payload over the buffer<\/td>\n<td><code>setBufferSize(256)<\/code><\/td>\n<\/tr>\n<tr>\n<td>Charts have gaps<\/td>\n<td>Sensor read failures<\/td>\n<td>Expected occasionally; check the wiring<\/td>\n<\/tr>\n<tr>\n<td>Charts have <code>nan<\/code><\/td>\n<td>Publishing failed reads<\/td>\n<td>Check <code>isnan()<\/code> before publishing<\/td>\n<\/tr>\n<tr>\n<td>Node resets when transmitting<\/td>\n<td>Thin USB cable<\/td>\n<td>Shorter cable, better supply<\/td>\n<\/tr>\n<tr>\n<td>Works at the desk, not in the room<\/td>\n<td>Signal strength<\/td>\n<td>Check <code>RSSI<\/code> where it will live<\/td>\n<\/tr>\n<tr>\n<td>Analog sensor reads nothing<\/td>\n<td>ADC2 pin with Wi-Fi on<\/td>\n<td>Use <code>GPIO 32<\/code> to <code>39<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Sources and attribution<\/h2>\n<p>All text, wiring guidance and code in this project are original Siratek work.<\/p>\n<ul>\n<li>Component behaviour is as described in <em>ESP32, Your First Wi-Fi Project<\/em>, <em>Sending Sensor Data with MQTT<\/em> and <em>DHT22, Better Accuracy Than the DHT11<\/em>, including the ADC2 and Wi-Fi conflict, PubSubClient\u2019s buffer size and the DHT22\u2019s two-second interval.<\/li>\n<li>MQTT\u2019s retained messages and last will are defined by the MQTT specification.<\/li>\n<\/ul>\n<p>No third-party tutorial text, diagrams, photographs or code has been reproduced here.<\/p>\n<p><\/p>\n<\/body>","protected":false},"excerpt":{"rendered":"<p>A small box you put in a room. It measures temperature and humidity, publishes them over Wi-Fi every minute, and tells you when it stops.<\/p>\n","protected":false},"featured_media":0,"template":"","siratek_tutorial_level":[],"class_list":["post-52269","siratek_tutorial","type-siratek_tutorial","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Project, an IoT Sensor Node - siratek<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Project, an IoT Sensor Node - siratek\" \/>\n<meta property=\"og:description\" content=\"A small box you put in a room. It measures temperature and humidity, publishes them over Wi-Fi every minute, and tells you when it stops.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/\" \/>\n<meta property=\"og:site_name\" content=\"siratek\" \/>\n<meta property=\"og:image\" content=\"http:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/iot-sensor-node-overview.svg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/iot-sensor-node\\\/\",\"url\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/iot-sensor-node\\\/\",\"name\":\"Project, an IoT Sensor Node - siratek\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/siratek.net\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/iot-sensor-node\\\/#primaryimage\"},\"image\":{\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/iot-sensor-node\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/siratek.net\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/iot-sensor-node-overview.svg\",\"datePublished\":\"2026-11-01T10:50:48+00:00\",\"breadcrumb\":{\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/iot-sensor-node\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/iot-sensor-node\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/iot-sensor-node\\\/#primaryimage\",\"url\":\"https:\\\/\\\/siratek.net\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/iot-sensor-node-overview.svg\",\"contentUrl\":\"https:\\\/\\\/siratek.net\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/iot-sensor-node-overview.svg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/iot-sensor-node\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/siratek.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorials\",\"item\":\"https:\\\/\\\/siratek.net\\\/index.php\\\/tutorials\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Project, an IoT Sensor Node\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/siratek.net\\\/#website\",\"url\":\"https:\\\/\\\/siratek.net\\\/\",\"name\":\"siratek\",\"description\":\"Your Best Electronic Retail Shop\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/siratek.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Project, an IoT Sensor Node - siratek","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/","og_locale":"en_US","og_type":"article","og_title":"Project, an IoT Sensor Node - siratek","og_description":"A small box you put in a room. It measures temperature and humidity, publishes them over Wi-Fi every minute, and tells you when it stops.","og_url":"http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/","og_site_name":"siratek","og_image":[{"url":"http:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/iot-sensor-node-overview.svg","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/","url":"http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/","name":"Project, an IoT Sensor Node - siratek","isPartOf":{"@id":"https:\/\/siratek.net\/#website"},"primaryImageOfPage":{"@id":"http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/#primaryimage"},"image":{"@id":"http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/#primaryimage"},"thumbnailUrl":"http:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/iot-sensor-node-overview.svg","datePublished":"2026-11-01T10:50:48+00:00","breadcrumb":{"@id":"http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/#primaryimage","url":"https:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/iot-sensor-node-overview.svg","contentUrl":"https:\/\/siratek.net\/wp-content\/uploads\/2026\/11\/iot-sensor-node-overview.svg"},{"@type":"BreadcrumbList","@id":"http:\/\/siratek.net\/index.php\/tutorials\/iot-sensor-node\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/siratek.net\/"},{"@type":"ListItem","position":2,"name":"Tutorials","item":"https:\/\/siratek.net\/index.php\/tutorials\/"},{"@type":"ListItem","position":3,"name":"Project, an IoT Sensor Node"}]},{"@type":"WebSite","@id":"https:\/\/siratek.net\/#website","url":"https:\/\/siratek.net\/","name":"siratek","description":"Your Best Electronic Retail Shop","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/siratek.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/siratek_tutorial\/52269","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/siratek_tutorial"}],"about":[{"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/types\/siratek_tutorial"}],"version-history":[{"count":0,"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/siratek_tutorial\/52269\/revisions"}],"wp:attachment":[{"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/media?parent=52269"}],"wp:term":[{"taxonomy":"siratek_tutorial_level","embeddable":true,"href":"https:\/\/siratek.net\/index.php\/wp-json\/wp\/v2\/siratek_tutorial_level?post=52269"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}