Draagbare IoT Weerstation met Arduino Nano 33 IoT
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino Nano 33 IoT | 1 |
| BME weer sensor (BME280) | 1 |
| 0.96 inch OLED display - 128x64 | 1 |
| Plastic behuizing 3.9" x 2.7" | 1 |
| Micro USB kabel | 1 |
| Man-Vrouw breadboard jumper draadjes | 1 set |
| USB Wandlader | 1 |
Nodige tools
- Lijmpistool (standaard)
Apps en online diensten
- Arduino IDE
- Blynk
Over dit project
Veel apps om smartphone met IoT te koppelen, maar meestal teleurstellend. Blynk is anders: flexibel, mooie UI, werkt met allerlei IoT platforms, Android & iOS, gratis voor hobbyisten. Dit project ontdekt Blynk.
Hardware
Eenvoudig: Arduino Nano 33 IoT (WiFi), BME280 sensor (temperatuur, vochtigheid, luchtdruk in één), 1 inch OLED display. Allemaal 3.3V. Display optioneel – doel is data op telefoon. Maar OLED maakt testen makkelijker voordat Blynk/telefoon.
Schema: sensor en display beide I2C. Theoretisch één I2C bus voor meerdere devices, maar library conflicten → twee aparte I2C poorten. Sensor: standaard I2C op analoge pinnen 4 (SDA) en 5 (SCL). Display: secundaire I2C op digitale pinnen 4 (SCL) en 5 (SDA) – let op: omgedraaid!

Behuizing: klein plastic doosje met transparant voorzijde (voor display & WiFi signaal). Weerbestendig, maar sensor buitenlucht via 1/2" gat onderin. Sensor zit net binnen gat. Alles inlijmen met lijmpistool (epoxy beter voor zomerhit).
Voeding via USB kabel: programmeren of voeden via één kabel (PC of USB adapter).
Software
Code is mash-up van library voorbeelden: Adafruit_BME280_Library (sensor), ss_oled (display), Blynk library. Alle drie via Arduino Library Manager te installeren. Experimenteer apart met elke library.
Blynk voorbeelden: examples.blynk.cc. Nano 33 IoT niet standaard ondersteund, maar wel WiFiNINA. Voeg toe:
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>
Extra: #include <avr/dtostrf.h> voor float → string conversie voor OLED. Blynk accepteert zowel strings als getallen, maar grafieken werken alleen met echte nummers.
Luchtdruk normaal gecorrigeerd naar zeeniveau. Op hogere locatie daling druk. Correctie: ~1 inch Hg per 1000 ft hoogte. In mijn code +1.3 voor 1300 ft. Pas aan voor jouw hoogte. Precieze tabellen online.
Weerstation zonder Blynk
Hardware opbouwen, mijn software gebruiken, Blynk.begin() in Setup ucommentariëren. (Zonder geldige Blynk connectie blijft sketch hangen bij Blynk.begin().)
Blynk
Blynk installeren (iOS/Android), documentatie: docs.blynk.cc. Veel opties, verwarrend eerst. Mijn quickstart:
Account aanmaken → nieuw project → authenticatie code (linkt hardware met project). Eerst hardware verbinden via WiFi met Blynk. Test met Blynk Blink sketch (examples.blynk.cc) – board LED (pin 13) aan/uit.
In Blink sketch: vervang ESP8266WiFi.h en BlynkSimpleEsp8266.h door WiFiNINA.h en BlynkSimpleWiFiNINA.h. Voeg WiFi credentials en auth code toe. Serial Monitor openen → connectie naar Blynk cloud zien.
Blynk app: linkerboven = projecten/account, rechtsboven = Edit mode, midden = contextueel.

Onboard LED besturen: Edit mode → toolbox (links swipen) → Button selecteren → op scherm klikken → configureren: Push → Switch mode, Pin → Digital 13 (onboard LED). OK, Edit mode uit → knop werkt.
Weerstation met Blynk
Mijn code openen, Blynk.begin() uncomment, auth code + WiFi credentials invullen, uploaden.

Blynk app: bestaande knop verwijderen (Edit → knop → Delete). Toolbox → Labeled Value (onder Displays). Configureren: Pin → Virtual V3. Label: "Temp /pin.#/ deg.F" (# = 1 decimaal). Grote tekst, Refresh: Push, Kleur: Groen. OK. Labeled Value uitrekken tot ~3/4 scherm. Edit mode uit → temperatuur zichtbaar.
Virtual Pins: Blynk gebruikt virtual pins voor variabelen. Display widget kan analoge/digitale pin lezen, maar meestal wil je variabele tonen → variabele een virtual pin nummer toewijzen. In code: temperatuur → V3.
Refresh Interval: Push = Arduino stuurt data (hier iedere minuut). Pull = app pollt hardware.
Nog 2 Labeled Values: Vochtigheid % (V4, goud, 1 decimaal), Luchtdruk in Hg (V5, rood, 2 decimalen).
Grafiek: SuperChart widget. Naar beneden uitrekken. Config: X-as tonen, resoluties: live, 1u, 6u, 1d, 1wk, 1mnd, 3mnd. 3 datastromen (V3, V4, V5). Y-as schaling: hoogte. Temp: 67-100, Vocht: 34-66, Druk: 0-33. Kleuren matchen. Y-as tonen. Klaar.
Delen: Edit mode → Project Settings (middenboven) → Sharing aan → link genereren → QR code. Nieuwe gebruiker: Blynk app (geen account nodig) → QR code laden.
Blynk is vrijwel gratis: 2500 energie punten gratis. Dit project past. Delen/uitbreiden kan kosten (~$6 voor 5000 punten).
Code
Tiny Internet Weather Station
/* Arduino Nano 33 IoT met BME280, 0.96" 128x64 OLED, WiFi + Blynk */
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BME280.h>
#include <avr/dtostrf.h>
#include <ss_oled.h>
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>
char auth[] = "YourBlynkProjectCode";
char ssid[] = "YourWifiID";
char pass[] = "YourWiFiPassword";
Adafruit_BME280 bme;
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
#define SDA_PIN 5
#define SCL_PIN 4
#define RESET_PIN -1
#define OLED_ADDR -1
#define FLIP180 0
#define INVERT 0
#define USE_HW_I2C 0
#define MY_OLED OLED_128x64
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
SSOLED ssoled;
BlynkTimer timer;
void setup() {
if (!bme.begin(0x76)) { while (1) delay(10); }
bme_temp->printSensorDetails();
bme_pressure->printSensorDetails();
bme_humidity->printSensorDetails();
oledInit(&ssoled, MY_OLED, OLED_ADDR, FLIP180, INVERT, USE_HW_I2C, SDA_PIN, SCL_PIN, RESET_PIN, 400000L);
oledFill(&ssoled, 0x0, 1);
Blynk.begin(auth, ssid, pass); // comment uit voor standalone
timer.setInterval(60000L, myupdate);
myupdate(); // initiële update
}
void loop() {
Blynk.run();
timer.run();
}
void myupdate() {
sensors_event_t temp_event, pressure_event, humidity_event;
bme_temp->getEvent(&temp_event);
bme_pressure->getEvent(&pressure_event);
bme_humidity->getEvent(&humidity_event);
float ctemp = temp_event.temperature;
float ftemp = 32 + (9*ctemp)/5;
float hum = humidity_event.relative_humidity;
float ppress = pressure_event.pressure;
float mpress = 1.3 + ppress/33.8939; // inch Hg + correctie
char mytemp[8], myhum[8], mypress[8];
dtostrf(ftemp, 6, 2, mytemp);
dtostrf(hum, 6, 2, myhum);
dtostrf(mpress, 6, 2, mypress);
// OLED update
oledWriteString(&ssoled, 0,2,1,(char*)"Weather Station", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,2,3,(char*)"Temp = ", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,50,3,(char*)mytemp, FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,105,3,(char*)"F", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,2,5,(char*)"Humid=", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,50,5,(char*)myhum, FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,105,5,(char*)"%%", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,2,7,(char*)"Press=", FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,50,7,(char*)mypress, FONT_NORMAL, 0, 1);
oledWriteString(&ssoled, 0,105,7,(char*)"in", FONT_NORMAL, 0, 1);
// Blynk push
Blynk.virtualWrite(V3, ftemp);
Blynk.virtualWrite(V4, hum);
Blynk.virtualWrite(V5, mpress);
}
Schema's
Productieproces
- Geïntegreerde Schakelingen (IC's): Compacte, Krachtige Chips die Moderne Elektronica Aandrijven
- DIY Zonne-energie Weerstation Met Raspberry Pi
- Een buitenweerstation bouwen met Raspberry Pi 2 en ADS-WS1
- Een Raspberry Pi-weerstation bouwen dat dagelijkse weergegevens e-mailt
- Uw weerstation integreren met CWOP: Een praktische gids
- Geavanceerd Weerstation v2.0: Real-time Temperatuur, Druk, Vochtigheid & Hoogte Monitoring
- Bouw een DCC-commando station voor modelspoor met Arduino – gratis app inclusief
- Arduino-gestuurde 6-Shooter Drank Mixstation – Bouw je eigen Cocktail Automaat
- MotionSense: Slimme inbraakdetectie met Arduino en ESP8266
- High-Performance Arduino Weerballon Datalogger
- ArduFarmBot Deel 2: Een Extern IoT-besturingsstation Bouwen