<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Danieldsouza</title>
    <description>The latest articles on DEV Community by Danieldsouza (@danieldsouza21).</description>
    <link>https://dev.to/danieldsouza21</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3882169%2Fd50940f6-b12f-4665-899d-7703d85c8cc8.png</url>
      <title>DEV Community: Danieldsouza</title>
      <link>https://dev.to/danieldsouza21</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danieldsouza21"/>
    <language>en</language>
    <item>
      <title>Build a Cloud-Connected Weather Station with Arduino UNO R4 WiFi</title>
      <dc:creator>Danieldsouza</dc:creator>
      <pubDate>Mon, 08 Jun 2026 12:43:34 +0000</pubDate>
      <link>https://dev.to/danieldsouza21/build-a-cloud-connected-weather-station-with-arduino-uno-r4-wifi-47h5</link>
      <guid>https://dev.to/danieldsouza21/build-a-cloud-connected-weather-station-with-arduino-uno-r4-wifi-47h5</guid>
      <description>&lt;p&gt;Learn how to build a real IoT weather station using the Arduino UNO R4 WiFi and BME280 sensor, sending live temperature, humidity, and pressure data to Arduino IoT Cloud — with full code, wiring diagrams, and dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;In this project, you'll build a &lt;strong&gt;cloud-connected weather station&lt;/strong&gt; that measures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Temperature&lt;/strong&gt; (°C / °F)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Humidity&lt;/strong&gt; (%)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atmospheric Pressure&lt;/strong&gt; (hPa)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three readings will be streamed live to the &lt;strong&gt;Arduino IoT Cloud&lt;/strong&gt;, where you can monitor them from anywhere in the world via a browser or the free &lt;strong&gt;Arduino IoT Remote app&lt;/strong&gt; on your phone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Components Required
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Qty&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arduino UNO R4 WiFi&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Built-in ESP32-S3 WiFi module&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BME280 Sensor Module&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Measures temp + humidity + pressure via I²C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Breadboard&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Full or half size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jumper Wires (M-M)&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;For I²C connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USB-A to USB-C Cable&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;For power &amp;amp; programming&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why BME280 over DHT22?&lt;/strong&gt;&lt;br&gt;
The BME280 gives you three measurements (including barometric pressure) over a single I²C bus using just 2 wires, making it more capable and cleaner to wire. The DHT22 only gives temperature and humidity.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Wiring the BME280 to Arduino UNO R4 WiFi
&lt;/h2&gt;

&lt;p&gt;The BME280 uses the &lt;strong&gt;I²C protocol&lt;/strong&gt;, so it only needs 4 wires:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BME280 Pin  →  Arduino UNO R4 WiFi Pin
──────────────────────────────────────
VCC         →  3.3V
GND         →  GND
SDA         →  A4  (I²C Data)
SCL         →  A5  (I²C Clock)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; The BME280 runs on &lt;strong&gt;3.3V&lt;/strong&gt;, not 5V. Connecting it to the 5V pin can damage the sensor permanently.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's the schematic overview:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────┐
│   Arduino UNO R4 WiFi      │
│                            │
│  3.3V ──────────────► VCC  │
│  GND  ──────────────► GND  │  ← BME280
│  A4   ──────────────► SDA  │
│  A5   ──────────────► SCL  │
└────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ☁️ Step 1 — Set Up Arduino IoT Cloud
&lt;/h2&gt;

&lt;p&gt;Before writing any code, you need to configure the &lt;strong&gt;Arduino IoT Cloud&lt;/strong&gt;. It's free for up to 2 devices.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 Create a Free Account
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://cloud.arduino.cc" rel="noopener noreferrer"&gt;cloud.arduino.cc&lt;/a&gt; and sign up or log in.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 Create a New "Thing"
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Things&lt;/strong&gt; in the left sidebar&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;+ Create Thing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name it &lt;code&gt;WeatherStation&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1.3 Add Your Device
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Select Device&lt;/strong&gt; → &lt;strong&gt;Set up a new device&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Arduino board&lt;/strong&gt; and wait for it to detect your UNO R4 WiFi (connected via USB)&lt;/li&gt;
&lt;li&gt;Give your device a name (e.g., &lt;code&gt;MyWeatherStation&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save the Secret Key&lt;/strong&gt; — you'll need this later! It's shown only once.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1.4 Add Cloud Variables
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;+ Add Variable&lt;/strong&gt; and create the following three variables:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Permission&lt;/th&gt;
&lt;th&gt;Update Policy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read Only&lt;/td&gt;
&lt;td&gt;On Change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;humidity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read Only&lt;/td&gt;
&lt;td&gt;On Change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pressure&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read Only&lt;/td&gt;
&lt;td&gt;On Change&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  1.5 Configure WiFi Credentials
&lt;/h3&gt;

&lt;p&gt;In the &lt;strong&gt;Network&lt;/strong&gt; section of your Thing, enter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your &lt;strong&gt;WiFi SSID&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Your &lt;strong&gt;WiFi Password&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Secret Key&lt;/strong&gt; you saved earlier&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2 — Install Required Libraries
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;Arduino IDE 2.x&lt;/strong&gt; and install these libraries via &lt;strong&gt;Tools → Manage Libraries&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Author&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Adafruit BME280 Library&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adafruit&lt;/td&gt;
&lt;td&gt;BME280 sensor driver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Adafruit Unified Sensor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adafruit&lt;/td&gt;
&lt;td&gt;Dependency for BME280&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ArduinoIoTCloud&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Arduino&lt;/td&gt;
&lt;td&gt;Cloud sync (auto-installed by Cloud Editor)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Arduino_ConnectionHandler&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Arduino&lt;/td&gt;
&lt;td&gt;WiFi connection management&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; If you use the &lt;strong&gt;Arduino Cloud Web Editor&lt;/strong&gt;, the &lt;code&gt;ArduinoIoTCloud&lt;/code&gt; library is automatically included. You only need to install the Adafruit libraries manually.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 3 — Full Project Code
&lt;/h2&gt;

&lt;p&gt;The Arduino IoT Cloud auto-generates a &lt;code&gt;thingProperties.h&lt;/code&gt; file that handles all cloud variable declarations and WiFi/authentication. You write the main &lt;code&gt;.ino&lt;/code&gt; sketch file.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;WeatherStation.ino&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="c1"&gt;// Cloud-Connected Weather Station&lt;/span&gt;
&lt;span class="c1"&gt;// Arduino UNO R4 WiFi + BME280 + Arduino IoT Cloud&lt;/span&gt;
&lt;span class="c1"&gt;// Series: IoT Projects #7&lt;/span&gt;
&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"thingProperties.h"&lt;/span&gt;&lt;span class="c1"&gt;         // Auto-generated by Arduino IoT Cloud&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;Wire.h&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt;                    // I²C communication&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;Adafruit_Sensor.h&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt;         // Unified sensor abstraction&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;Adafruit_BME280.h&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt;         // BME280 sensor driver&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// ── Sensor configuration ──────────────────────────────────&lt;/span&gt;
&lt;span class="cp"&gt;#define SEA_LEVEL_PRESSURE_HPA (1013.25)  // Standard sea-level pressure
&lt;/span&gt;
&lt;span class="n"&gt;Adafruit_BME280&lt;/span&gt; &lt;span class="n"&gt;bme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// BME280 instance using default I²C address (0x76)&lt;/span&gt;

&lt;span class="c1"&gt;// ── Read interval ─────────────────────────────────────────&lt;/span&gt;
&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;lastReadTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;READ_INTERVAL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Read every 10 seconds&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Wait for Serial Monitor to open&lt;/span&gt;

  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"================================="&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"  Cloud Weather Station — Boot  "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"================================="&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Initialize BME280 sensor&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;bme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x76&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Try alternate I²C address (some modules use 0x77)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;bme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x77&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" BME280 not found! Check wiring."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" Expected addresses: 0x76 or 0x77"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Halt — no sensor, no point continuing&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" BME280 sensor initialized"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Set BME280 sampling settings for weather monitoring&lt;/span&gt;
  &lt;span class="c1"&gt;// (lower oversampling = faster reads, less power)&lt;/span&gt;
  &lt;span class="n"&gt;bme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setSampling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Adafruit_BME280&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MODE_NORMAL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// Continuous measurement&lt;/span&gt;
    &lt;span class="n"&gt;Adafruit_BME280&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SAMPLING_X2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// Temp oversampling x2&lt;/span&gt;
    &lt;span class="n"&gt;Adafruit_BME280&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SAMPLING_X2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// Pressure oversampling x2&lt;/span&gt;
    &lt;span class="n"&gt;Adafruit_BME280&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SAMPLING_X1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// Humidity oversampling x1&lt;/span&gt;
    &lt;span class="n"&gt;Adafruit_BME280&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;FILTER_X16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// IIR filter for stability&lt;/span&gt;
    &lt;span class="n"&gt;Adafruit_BME280&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;STANDBY_MS_500&lt;/span&gt;     &lt;span class="c1"&gt;// Standby 500ms between reads&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// ── Arduino IoT Cloud init ───────────────────────────────&lt;/span&gt;
  &lt;span class="n"&gt;initProperties&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Defined in thingProperties.h&lt;/span&gt;
  &lt;span class="n"&gt;ArduinoCloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ArduinoIoTPreferredConnection&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Debug level: 2 = moderate verbosity&lt;/span&gt;
  &lt;span class="n"&gt;setDebugMessageLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;ArduinoCloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printDebugInfo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" Connecting to WiFi and Arduino IoT Cloud..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Keep cloud connection alive — MUST be called every loop&lt;/span&gt;
  &lt;span class="n"&gt;ArduinoCloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;millis&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Only read sensors every READ_INTERVAL milliseconds&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;lastReadTime&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;READ_INTERVAL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;lastReadTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;readAndPublishSensorData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// =============================================================&lt;/span&gt;
&lt;span class="c1"&gt;// Reads BME280 data, validates it, and pushes to IoT Cloud&lt;/span&gt;
&lt;span class="c1"&gt;// =============================================================&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;readAndPublishSensorData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readTemperature&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;          &lt;span class="c1"&gt;// °C&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;hum&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readHumidity&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;             &lt;span class="c1"&gt;// %&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;pres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readPressure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// Pa → hPa&lt;/span&gt;

  &lt;span class="c1"&gt;// ── Validate readings ─────────────────────────────────────&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isnan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;isnan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;isnan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pres&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" Invalid sensor reading — skipping update"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// ── Sanity range checks ───────────────────────────────────&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;40.0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;85.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" Temperature out of sensor range!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hum&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;hum&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" Humidity out of range!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// ── Update Cloud variables ────────────────────────────────&lt;/span&gt;
  &lt;span class="c1"&gt;// These names MUST match what you created in IoT Cloud&lt;/span&gt;
  &lt;span class="n"&gt;temperature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;humidity&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hum&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;pressure&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pres&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// ── Debug output ──────────────────────────────────────────&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"─────────────────────────────────"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" Temperature : "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" °C"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" Humidity    : "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" %"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" Pressure    : "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pres&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" hPa"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Derived: estimated altitude above sea level&lt;/span&gt;
  &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;altitude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readAltitude&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SEA_LEVEL_PRESSURE_HPA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" Altitude    : "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;altitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" m (estimated)"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"─────────────────────────────────"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Understanding &lt;code&gt;thingProperties.h&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The Cloud Editor auto-generates this file. Here's what it looks like — &lt;strong&gt;you do not edit this manually&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// AUTO-GENERATED by Arduino IoT Cloud — do not edit&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;ArduinoIoTCloud.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;Arduino_ConnectionHandler.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;THING_ID&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"your-thing-id-here"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;DEVICE_KEY&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"your-secret-key-here"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// From Cloud setup&lt;/span&gt;

&lt;span class="c1"&gt;// Cloud variables — must match what you defined in the dashboard&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;humidity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;pressure&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;initProperties&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;ArduinoCloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setThingId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;THING_ID&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;ArduinoCloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ON_CHANGE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;ArduinoCloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;humidity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="n"&gt;READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ON_CHANGE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;ArduinoCloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pressure&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="n"&gt;READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ON_CHANGE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;WiFiConnectionHandler&lt;/span&gt; &lt;span class="nf"&gt;ArduinoIoTPreferredConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"YOUR_SSID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"YOUR_PASS"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 4 — Build the Cloud Dashboard
&lt;/h2&gt;

&lt;p&gt;Once your board is online and publishing data:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to your &lt;strong&gt;Thing&lt;/strong&gt; → click &lt;strong&gt;Dashboard&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;+ Add Widget&lt;/strong&gt; and add:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Widget&lt;/th&gt;
&lt;th&gt;Cloud Variable&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gauge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set range: −10 to 50 °C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gauge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;humidity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set range: 0–100 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gauge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pressure&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set range: 950–1050 hPa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chart&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shows trend over time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chart&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;humidity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shows trend over time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Arrange and resize&lt;/strong&gt; widgets to your liking&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Share Dashboard&lt;/strong&gt; (top right) to get a public URL&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mobile App:&lt;/strong&gt; Download &lt;a href="https://play.google.com/store/apps/details?id=cc.arduino.cloudiot" rel="noopener noreferrer"&gt;Arduino IoT Remote&lt;/a&gt; (Android / iOS) to monitor from your phone!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 5 — Serial Monitor Output
&lt;/h2&gt;

&lt;p&gt;When everything is working, your Serial Monitor (9600 baud) will show:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=================================
  Cloud Weather Station — Boot  
=================================
BME280 sensor initialized
Connecting to WiFi and Arduino IoT Cloud...
─────────────────────────────────
Temperature: 27.4 °C
Humidity: 61.2 %
Pressure: 1009.87 hPa
Altitude: 28.4 m (estimated)
─────────────────────────────────
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  BME280 Not Detected
&lt;/h3&gt;

&lt;p&gt;Most BME280 modules ship with I²C address &lt;code&gt;0x76&lt;/code&gt;, but some use &lt;code&gt;0x77&lt;/code&gt;. The code already tries both. You can confirm the address with an I²C scanner sketch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// I²C Scanner — paste into a new sketch and upload&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;Wire.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Wire&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Scanning I²C bus..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;byte&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Wire&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beginTransmission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Wire&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;endTransmission&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Found device at 0x"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HEX&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Scan complete."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  WiFi Not Connecting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Double-check SSID and password (case-sensitive)&lt;/li&gt;
&lt;li&gt;The UNO R4 WiFi supports &lt;strong&gt;2.4 GHz only&lt;/strong&gt; — ensure your router isn't on 5 GHz&lt;/li&gt;
&lt;li&gt;Verify the Device Secret Key matches what you saved during setup&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cloud Variables Not Updating
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Make sure &lt;code&gt;ArduinoCloud.update()&lt;/code&gt; is called every loop iteration&lt;/li&gt;
&lt;li&gt;Variables should be declared in &lt;code&gt;thingProperties.h&lt;/code&gt;, not in your main sketch&lt;/li&gt;
&lt;li&gt;Check that variable names in your code &lt;strong&gt;exactly match&lt;/strong&gt; the names in the Cloud dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pressure Readings Look Wrong
&lt;/h3&gt;

&lt;p&gt;Local atmospheric pressure varies with altitude. If your readings seem off, look up your city's actual pressure from a weather service and adjust &lt;code&gt;SEA_LEVEL_PRESSURE_HPA&lt;/code&gt; accordingly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Taking It Further
&lt;/h2&gt;

&lt;p&gt;Here are some ways to extend this project:&lt;/p&gt;

&lt;h3&gt;
  
  
  Add a Local OLED Display
&lt;/h3&gt;

&lt;p&gt;Show data locally even when WiFi is unavailable using a &lt;strong&gt;0.96" SSD1306 OLED&lt;/strong&gt; (I²C):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;Adafruit_SSD1306.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
&lt;/span&gt;&lt;span class="n"&gt;Adafruit_SSD1306&lt;/span&gt; &lt;span class="nf"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SCREEN_WIDTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCREEN_HEIGHT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Wire&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// In setup():&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SSD1306_SWITCHCAPVCC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x3C&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clearDisplay&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// In your read function:&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setTextSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setTextColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SSD1306_WHITE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setCursor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Temp: "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" C"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hum:  "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hum&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" %"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Pres: "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pres&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" hPa"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add IoT Cloud Alerts
&lt;/h3&gt;

&lt;p&gt;In the Arduino IoT Cloud dashboard, use &lt;strong&gt;Triggers&lt;/strong&gt; to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send an &lt;strong&gt;email notification&lt;/strong&gt; when temperature exceeds 35°C&lt;/li&gt;
&lt;li&gt;Send a &lt;strong&gt;push notification&lt;/strong&gt; when humidity drops below 20%&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Log to Google Sheets
&lt;/h3&gt;

&lt;p&gt;Use &lt;strong&gt;IFTTT&lt;/strong&gt; or &lt;strong&gt;Zapier&lt;/strong&gt; with a webhook trigger connected to your Arduino IoT Cloud Thing to log every reading to a Google Sheet automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add a Rain Sensor
&lt;/h3&gt;

&lt;p&gt;Wire an &lt;strong&gt;FC-37 rain sensor&lt;/strong&gt; to analog pin &lt;code&gt;A0&lt;/code&gt; and add a &lt;code&gt;bool isRaining&lt;/code&gt; variable to detect precipitation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#define RAIN_PIN A0
#define RAIN_THRESHOLD 500  // Adjust based on your sensor
&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;detectRain&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rawValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;analogRead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RAIN_PIN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rawValue&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;RAIN_THRESHOLD&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Lower value = wetter&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Full Bill of Materials with Links
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Where to Buy (India)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arduino UNO R4 WiFi&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://robocraze.com/products/original-arduino-uno-ek-r4-wifi-made-in-india" rel="noopener noreferrer"&gt;Robocraze&lt;/a&gt; ·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BME280 Sensor Module&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://robocraze.com/products/7semi-bme280-temperature-humidity-pressure-sensor-breakout-module-i2c-spi" rel="noopener noreferrer"&gt;Robocraze&lt;/a&gt; · &lt;a href="https://amazon.in" rel="noopener noreferrer"&gt;Amazon.in&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.96" OLED Display (optional)&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://robocraze.com" rel="noopener noreferrer"&gt;Robocraze&lt;/a&gt; · &lt;a href="https://probots.co.in" rel="noopener noreferrer"&gt;Probots.co.in&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Breadboard + Jumper Kit&lt;/td&gt;
&lt;td&gt;Local electronics store / online&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Resources &amp;amp; Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.arduino.cc/hardware/uno-r4-wifi" rel="noopener noreferrer"&gt;Arduino UNO R4 WiFi Official Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.arduino.cc/arduino-cloud/guides/overview/" rel="noopener noreferrer"&gt;Arduino IoT Cloud Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.adafruit.com/adafruit-bme280-humidity-barometric-pressure-temperature-sensor-breakout" rel="noopener noreferrer"&gt;Adafruit BME280 Library Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=cc.arduino.cloudiot" rel="noopener noreferrer"&gt;Arduino IoT Remote App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/Up2fUvX9Pfo?si=yTU42IEHOSb17ugm" rel="noopener noreferrer"&gt;Original YouTube Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this project you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wired a &lt;strong&gt;BME280&lt;/strong&gt; sensor to the Arduino UNO R4 WiFi over I²C&lt;/li&gt;
&lt;li&gt;Created a &lt;strong&gt;Thing&lt;/strong&gt; on Arduino IoT Cloud with 3 cloud variables&lt;/li&gt;
&lt;li&gt;Wrote clean, production-ready Arduino code that syncs sensor data to the cloud every 10 seconds&lt;/li&gt;
&lt;li&gt;Built a live &lt;strong&gt;dashboard&lt;/strong&gt; with gauges and trend charts&lt;/li&gt;
&lt;li&gt;Learned to debug common wiring and connectivity issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Arduino UNO R4 WiFi's built-in WiFi and native Arduino IoT Cloud support makes it one of the easiest boards to get started with IoT — no external ESP modules or complex networking libraries needed.&lt;/p&gt;

</description>
      <category>arduino</category>
      <category>iot</category>
      <category>beginners</category>
      <category>raspberrypi</category>
    </item>
    <item>
      <title>Bambu Lab X1E: Professional Prototyping Redefined</title>
      <dc:creator>Danieldsouza</dc:creator>
      <pubDate>Wed, 20 May 2026 12:22:51 +0000</pubDate>
      <link>https://dev.to/danieldsouza21/bambu-lab-x1e-professional-prototyping-redefined-2cfp</link>
      <guid>https://dev.to/danieldsouza21/bambu-lab-x1e-professional-prototyping-redefined-2cfp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8b2zj37k8b8swobz4mu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8b2zj37k8b8swobz4mu.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the fast-paced world of engineering and product design, the bridge between a digital concept and a functional physical prototype needs to be as short as possible. For years, professional 3D printing meant choosing between expensive, temperamental industrial machines or hobby-grade printers that lacked the reliability required for critical workflows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://robocraze.com/products/bambu-lab-x1e-combo-3d-printer" rel="noopener noreferrer"&gt;Bambu Lab X1E Combo&lt;/a&gt; is a machine that redefines the intersection of high-speed manufacturing and enterprise-grade reliability. Whether you are an R&amp;amp;D engineer, a small business owner, or an educator in a STEM lab, understanding why this specific printer stands out is crucial for optimizing your workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Need for Enterprise-Grade Desktop Manufacturing
&lt;/h2&gt;

&lt;p&gt;As 3D printing matures, the requirements for professional users have shifted. It is no longer just about "making something"; it is about making it consistently, securely, and efficiently. &lt;/p&gt;

&lt;h2&gt;
  
  
  Reliability and Material Versatility
&lt;/h2&gt;

&lt;p&gt;Most desktop printers struggle when tasked with high-performance engineering materials like Carbon Fiber-reinforced polymers, Nylon, or PC (Polycarbonate). These materials require precise thermal management. The X1E addresses this with active chamber heating, which ensures that parts don't warp or fail due to internal stresses.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Security Imperative
&lt;/h3&gt;

&lt;p&gt;For many companies, IP protection is paramount. Unlike many cloud-dependent printers, the X1E allows for a fully local network control mode. This means your sensitive design data stays on your local network, satisfying the security requirements of corporate and government R&amp;amp;D environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Features That Set the X1E Apart
&lt;/h2&gt;

&lt;p&gt;The "Combo" aspect of the printer refers to the inclusion of the Automatic Material System (AMS). This is not just a convenience feature; it is an engineering asset.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Active Heating and Controlled Chamber Temperature
&lt;/h3&gt;

&lt;p&gt;The ability to maintain a stable, heated environment is the hallmark of industrial-grade machinery. By keeping the chamber at a consistent, regulated temperature, the X1E ensures that the physical properties of the printed part are uniform throughout. This is essential when producing parts that need to hold structural loads.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Intelligent Material Handling (AMS)
&lt;/h3&gt;

&lt;p&gt;The Bambu Lab AMS allows for multi-material and multi-color printing. In an engineering context, this is often used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Support Materials:&lt;/strong&gt; Printing with breakaway or dissolvable supports (like PETG supports for PLA parts) to achieve complex geometries that are impossible with standard single-nozzle setups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rapid Iteration:&lt;/strong&gt; Loading four different material profiles at once to test various filaments for a prototype without manual swaps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. High-Performance Connectivity and Security
&lt;/h3&gt;

&lt;p&gt;The integration of Ethernet connectivity alongside enterprise-level security protocols makes the X1E a "plug-and-play" asset for IT-managed office environments. &lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices for Integrating the X1E into Your Workflow
&lt;/h2&gt;

&lt;p&gt;To maximize the ROI on a machine like the Bambu Lab X1E, consider the following strategies:&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimize for Production Speed
&lt;/h3&gt;

&lt;p&gt;The X1E is designed for speed without sacrificing quality. However, to maintain accuracy, ensure you are utilizing the correct &lt;a href="https://wiki.bambulab.com/en/software/bambu-studio" rel="noopener noreferrer"&gt;slicer settings&lt;/a&gt; tailored for the high-flow nozzles. Don't just run default profiles; tune your layer heights and wall counts to match the structural requirements of your final part.&lt;/p&gt;

&lt;h3&gt;
  
  
  Material Selection Strategy
&lt;/h3&gt;

&lt;p&gt;Don't print everything in PLA. For functional prototypes that need to last, look into Carbon Fiber-filled nylons or ASA. These materials leverage the X1E's high-temperature capability, providing UV resistance and structural integrity that basic plastics cannot touch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Maintenance Cycles
&lt;/h3&gt;

&lt;p&gt;Even the most advanced printers require upkeep. Refer to our Robocraze guide on 3D printer maintenance to ensure your X1E remains calibrated. Regularly cleaning the carbon rods and checking the nozzle for clogs will keep your machine operating at industrial uptime levels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Is the X1E Right for Your Lab?
&lt;/h2&gt;

&lt;p&gt;The shift toward localized, high-speed manufacturing is transforming how teams approach innovation. When you invest in a machine like the Bambu Lab X1E Combo, you are not just buying a printer; you are buying the capability to fail fast, iterate faster, and deliver production-quality results directly from your desk.&lt;/p&gt;

&lt;p&gt;If your projects demand high-performance materials, stringent security, and minimal downtime, the X1E is arguably the most capable desktop 3D printing solution on the market today.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ready to take your prototyping to the next level? Explore the Bambu Lab X1E Combo at Robocraze and speak with our technical team about how it can fit into your R&amp;amp;D workflow.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For more resources on additive manufacturing, check out the &lt;a href="https://all3dp.com/" rel="noopener noreferrer"&gt;All3DP guide to professional 3D printing&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>3dprinting</category>
      <category>automation</category>
    </item>
    <item>
      <title>Build Your Own Bluetooth-Controlled Car with Arduino: A Complete Step-by-Step Guide</title>
      <dc:creator>Danieldsouza</dc:creator>
      <pubDate>Thu, 16 Apr 2026 12:24:47 +0000</pubDate>
      <link>https://dev.to/danieldsouza21/build-your-own-bluetooth-controlled-car-with-arduino-a-complete-step-by-step-guide-3e8h</link>
      <guid>https://dev.to/danieldsouza21/build-your-own-bluetooth-controlled-car-with-arduino-a-complete-step-by-step-guide-3e8h</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The intersection of robotics and wireless communication is one of the most exciting areas for any aspiring embedded engineer or hobbyist. Whether you are looking to understand motor dynamics or explore how hardware interfaces with mobile applications, building a Bluetooth-controlled car is the quintessential "Hello World" of robotics.&lt;/p&gt;

&lt;p&gt;In this guide, we will walk through the process of assembling a two-wheeled robotic car from scratch using an Arduino Uno, an L293D Motor Driver Shield, and an HC-05 Bluetooth module. By the end of this tutorial, you will have a fully functional vehicle that you can control directly from your Android smartphone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Components: Building the Brain and Body
&lt;/h2&gt;

&lt;p&gt;Before we pick up the screwdriver, let’s look at the "Bill of Materials" (BOM) required for this project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Arduino Uno: The brain of our project. It’s an open-source microcontroller board based on the &lt;a href="https://www.arduino.cc/en/Main/ArduinoBoardUno" rel="noopener noreferrer"&gt;Microchip ATmega328P&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;L293D Motor Driver Shield: This is crucial because microcontrollers cannot provide enough current to drive motors directly. The shield acts as the bridge between high-current motors and low-power logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HC-05 Bluetooth Module: This module enables Serial communication over Bluetooth, allowing us to send commands from a phone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DC Gear Motors &amp;amp; Wheels: We’ll use two 5V-9V DC motors for movement and a single universal (caster) wheel for balance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Acrylic Chassis: A lightweight frame to house all components.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Power Source: Two 9V batteries—one to power the Arduino logic and another dedicated to the motors to prevent voltage drops.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 1: Mechanical Assembly
&lt;/h2&gt;

&lt;p&gt;A solid build starts with a stable frame.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mounting the Motors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start with the acrylic chassis. Peel off any protective film. Position the DC motors on the left and right sides of the chassis. Use the provided fasteners and screws to secure them.&lt;/p&gt;

&lt;p&gt;-&lt;strong&gt;Pro Tip:&lt;/strong&gt; Ensure the motor terminals are facing inward toward the center of the chassis to make wiring cleaner later on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing the Caster Wheel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The caster wheel (universal wheel) provides a third point of contact, ensuring the car remains stable while turning. Use the provided spacers to ensure the caster wheel is at the same height as the main driving wheels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mounting the Arduino Uno&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using M3 screws or double-sided mounting tape, secure the Arduino Uno onto the top of the chassis. Make sure the USB port and DC Jack are easily accessible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: The Wiring &amp;amp; Electronics
&lt;/h2&gt;

&lt;p&gt;Now, let's connect the nervous system of our robot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Attaching the Motor Shield&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Carefully align the pins of the L293D Motor Driver Shield with the headers on the Arduino Uno and press down firmly. This "sandwich" configuration eliminates the need for most jumper wires.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Motor Connections&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Connect the wires from your left motor to the terminal blocks labeled M1 on the shield. Connect the right motor to M2.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direction Logic:&lt;/strong&gt; In our code, we assume the red wire is "Positive." If your car moves backward when it should move forward, simply swap the red and black wires for that specific motor terminal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Bluetooth Module (HC-05) Wiring&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The HC-05 uses UART (Universal Asynchronous Receiver/Transmitter) communication.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VCC to 5V on the shield.&lt;/li&gt;
&lt;li&gt;ND to Ground.&lt;/li&gt;
&lt;li&gt;TX (Transmit) to A0 on the Arduino.&lt;/li&gt;
&lt;li&gt;RX (Receive) to A1 on the Arduino.
Note: While the HC-05 traditionally uses pins 0 and 1, we use Analog pins A0 and A1 with the SoftwareSerial library to keep the hardware serial port free for debugging and code uploading.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: Programming the Arduino
&lt;/h2&gt;

&lt;p&gt;To make the hardware "smart," we need to upload the logic. We will use two primary libraries: AFMotor.h (for the shield) and SoftwareSerial.h (for Bluetooth).&lt;br&gt;
`#include &lt;/p&gt;

&lt;h1&gt;
  
  
  include 
&lt;/h1&gt;

&lt;p&gt;// Initialize Motors on M1 and M2 ports&lt;br&gt;
AF_DCMotor leftMotor(1);&lt;br&gt;
AF_DCMotor rightMotor(2);&lt;/p&gt;

&lt;p&gt;// Define Bluetooth Pins (RX, TX)&lt;br&gt;
SoftwareSerial bluetooth(A0, A1); &lt;/p&gt;

&lt;p&gt;char command;&lt;/p&gt;

&lt;p&gt;void setup() {&lt;br&gt;
  bluetooth.begin(9600); // Standard Baud rate for HC-05&lt;br&gt;
  leftMotor.setSpeed(200); // Set speed from 0 (off) to 255 (max)&lt;br&gt;
  rightMotor.setSpeed(200);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void loop() {&lt;br&gt;
  if (bluetooth.available() &amp;gt; 0) {&lt;br&gt;
    command = bluetooth.read();&lt;br&gt;
    stopMotors(); // Reset state&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;switch (command) {
  case 'F': forward();  break;
  case 'B': backward(); break;
  case 'L': left();     break;
  case 'R': right();    break;
  case 'S': stopMotors(); break;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void forward() {&lt;br&gt;
  leftMotor.run(FORWARD);&lt;br&gt;
  rightMotor.run(FORWARD);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;void stopMotors() {&lt;br&gt;
  leftMotor.run(RELEASE);&lt;br&gt;
  rightMotor.run(RELEASE);&lt;br&gt;
}&lt;br&gt;
// Additional functions for backward, left, and right follow similar logic...`&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: The Mobile App Configuration
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pairing:&lt;/strong&gt; Turn on your car. Go to your phone's Bluetooth settings and pair with "HC-05." The default PIN is usually 1234 or 0000.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connecting:&lt;/strong&gt; Open the app, click the "Settings" icon, and select "Connect to Car."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command Mapping:&lt;/strong&gt; Ensure the app is sending 'F' for forward, 'B' for back, etc. These match the switch-case characters in our Arduino code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 5: Testing and Troubleshooting
&lt;/h2&gt;

&lt;p&gt;Place the car on a flat surface and hit the "Forward" button.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Car goes in circles?&lt;/strong&gt; One of your motor's wires is likely swapped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bluetooth won't connect?&lt;/strong&gt; Check if the LED on the HC-05 is blinking rapidly (searching) or slowly (connected). Ensure the TX/RX pins aren't swapped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Motors stuttering?&lt;/strong&gt; This is usually a power issue. Ensure your motor battery is fresh. Using a &lt;a href="https://en.wikipedia.org/wiki/Lithium-ion_battery" rel="noopener noreferrer"&gt;Rechargeable Li-ion battery&lt;/a&gt; (like an 18650) often provides better current than a standard alkaline 9V.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building a Bluetooth-controlled car is more than just a fun weekend project; it's an introduction to the world of Embedded Systems. You've learned how to manage power, interface with motor drivers, and establish wireless serial communication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's next?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add an &lt;a href="https://robocraze.com/products/hc-sr-04-ultrasonic-sensor" rel="noopener noreferrer"&gt;Ultrasonic Sensor&lt;/a&gt; for autonomous obstacle avoidance.&lt;/li&gt;
&lt;li&gt;Integrate a &lt;a href="https://robocraze.com/products/sg90-micro-servo-motor" rel="noopener noreferrer"&gt;Servo Motor&lt;/a&gt; to move a camera or a sensor head.&lt;/li&gt;
&lt;li&gt;Upgrade to an ESP32 for Wi-Fi control and camera streaming.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>arduino</category>
      <category>robotics</category>
      <category>cpp</category>
    </item>
  </channel>
</rss>
