Bliksem & onweer: Arduino Halloween project
|
Voor Halloween wilde ik dit jaar wat leuke kleine hobbyprojecten doen met dingen die ik al had liggen. Dit project gaat over het simuleren van de donder en bliksem van een onweersbui gebruik makend van een Arduino Nano, LED’s en een DFPlayer Mini MP3 player module (zie de documentatie). Het was eenvoudig te bouwen en het werkte heel goed. Dus hier is de beschrijving, voor iedereen die ook zijn/haar gasten volgend jaar wil verrassen (of bang maken).
Merk op dat dit geen “sound to light”-systeem is. De schets flitst eerst (willekeurig) de LED’s en speelt vervolgens het geluidsbestand af, na een korte (willekeurige) vertraging. Ik denk dat dit realistischer is dan het knipperen van de LED’s als reactie op het volume van het geluid zoals andere projecten/systemen dat doen. Licht reist veel sneller dan geluid. Daarom zul je tijdens een ‘echte’ onweersbui eerst de flitsen zien. Het geluid komt daar achteraan, de vertraging is afhankelijk van hoe ver weg de onweersbui is.
Bliksem en donder met Arduino: benodigdheden
De onderdelen die gebruikt zijn voor dit project:
- Arduino Nano
- DFPlayer Mini MP3 player module
- Micro SD kaartje (8 GB)
- Breadboard en jumper wires
- MOSFET (1x IRFZ44N)
- Weerstanden (2x 1K)
- LED strip (5m, 12V, cool white)
- Draden met krokodillenklemmen
- Voeding (12V, 2A)
Je kunt natuurlijk ook een ander type 12V LED-verlichting gebruiken. De MP3-bestanden (zie beneden) zijn bij elkaar kleinen dan 6MB, dus elk SD-kaartje is geschikt.


De Arduino-bliksemsimulator bouwen
Het bouwen van de simulator is redelijk eenvoudig, zie ook onderstaande afbeeldingen:
- De 12V voeding wordt verbonden met de rode power-rail op het breadboard.
De LEDs krijgen 12V vanaf de power rail op het breadboard (rode draad).
De Arduino Nano krijgt 12V van de power-rail op zijn Vin pin (rode draad) en de GND pin van de Nano is aangesloten op de blauwe aarde-rail van het breadboard (blauwe draad). - De DFPlayer Mini krijgt 5V op zijn VCC pin vanaf de Nano (rode draad).
De RX pin van de DFPlayer gaat naar pin 10 op de Nano (zwarte draad) via een 1K weerstand.
De TX pin van de DFPlayer gaat naar pin 11 op de Nano (paarse draad) via een 1K weerstand.
De BUSY pin van de DFPlayer gaat naar pin 12 op de Nano (witte draad).
De DAC-L (groene draad) en DAC-R (gele draad) gaan naar de stereo geluidsversterker.
De GND pin van de DFPlayer gaat naar de blauwe aarde-rail (blauwe draad). - De MOSFET GATE pin (links) gaat naar Nano pin 9 (oranje draad).
De MOSFET DRAIN pin (midden) gaat naar de aarde-aansluiting van de LED-strip (zwarte draad).
De MOSFET SOURCE pin (rechts) gaat naar de blauwe aarde-rail (zwarte draad). - De aarde van de geluidsversterker is aangesloten op de blauwe aarde-rail.


Zorg ervoor dat de aarde van de voeding, Arduino, MOSFET, DFplayer en audioverbinding onderling verbonden is. Zorg er ook voor dat de 12V is aangesloten op de juiste pin (Vin) van de Nano.
Zorg ervoor dat u de polarisatie van 12V en aarde van de voeding en de LED’s goed hebt.
Ik heb een paar draden met krokodillenklemmen gebruikt om de LED’s en audio gemakkelijk op het breadboard aan te sluiten.


Bliksem- en onweersgeluiden in MP3-bestandsformaat
Ik heb 17 verschillende bliksem- en dondergeluiden in een .zip-bestand verzameld. Ze kunnen worden gedownload via de onderstaande link. De bestanden (0001.mp3 tot 0017.mp3) moeten in een map met de naam ‘mp3’ op de SD-kaart worden geplaatst. De kaart mag FAT16 of FAT32 geformatteerd zijn.
De Arduino programmeren
Je kunt de schets op de gebruikelijke manier uploaden naar de Arduino, met behulp van de USB-kabel. De Nano krijgt zijn stroom van de 12V-voeding, niet van USB. Dus na het uploaden kunt je de USB-kabel loskoppelen.
De schets gebruikt de DFRobotDFPlayerMini library, kijk op de GitHub-pagina voor meer informatie en technische details.
#include "Arduino.h" #include "SoftwareSerial.h" #include "DFRobotDFPlayerMini.h" int ledPin = 9; // LEDs (via MOSFET) connected to pin 9 int rxPin = 10; // DFplayer RX to Arduino pin 10 int txPin = 11; // DFplayer TX toArduinopin 11 int busyPin = 12; // DFplayer BUSY connected to pin 12 SoftwareSerial mySoftwareSerial(rxPin, txPin); DFRobotDFPlayerMini myDFPlayer; void setup() { pinMode(ledPin, OUTPUT); pinMode(busyPin, INPUT); mySoftwareSerial.begin(9600); Serial.begin(115200); Serial.println(F("Initializing DFPlayer...")); if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3. Serial.println(F("Unable to begin. Check connection and SD card, or reset the Arduino.")); while (true); } Serial.println(F("DFPlayer Mini online.")); myDFPlayer.setTimeOut(500); // Set serial communictaion time out 500ms myDFPlayer.volume(30); // Set volume value (0~30). myDFPlayer.EQ(DFPLAYER_EQ_BASS); // Set EQ to BASS (normal/pop/rock/jazz/classic/bass) myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD); // Set device we use SD as default myDFPlayer.enableDAC(); // Enable On-chip DAC } void loop() { int flashCount = random (3, 15); // Min. and max. number of flashes each loop int flashBrightnessMin = 10; // LED flash min. brightness (0-255) int flashBrightnessMax = 255; // LED flash max. brightness (0-255) int flashDurationMin = 1; // Min. duration of each seperate flash int flashDurationMax = 50; // Max. duration of each seperate flash int nextFlashDelayMin = 1; // Min, delay between each flash and the next int nextFlashDelayMax = 150; // Max, delay between each flash and the next int thunderDelay = random (500, 3000); // Min. and max. delay between flashing and playing sound int thunderFile = random (1, 17); // There are 17 soundfiles: 0001.mp3 ... 0017.mp3 int loopDelay = random (5000, 30000); // Min. and max. delay between each loop Serial.println(); Serial.print(F("Flashing, count: ")); Serial.println( flashCount ); for (int flash = 0 ; flash <= flashCount; flash += 1) { // Flashing LED strip in a loop, random count analogWrite(ledPin, random (flashBrightnessMin, flashBrightnessMax)); // Turn LED strip on, random brightness delay(random(flashDurationMin, flashDurationMax)); // Keep it tured on, random duration analogWrite(ledPin, 0); // Turn the LED strip off delay(random(nextFlashDelayMin, nextFlashDelayMax)); // Random delay before next flash } Serial.print(F("Pausing before playing thunder sound, milliseconds: ")); Serial.println(thunderDelay); delay(thunderDelay); Serial.print(F("Playing thunder sound, file number: ")); Serial.println(thunderFile); myDFPlayer.playMp3Folder(thunderFile); delay(1000); // Give the DFPlayer some time while (digitalRead(busyPin) == LOW) { // Wait for the DFPlayer to finish playing the MP3 file } Serial.print(F("Pausing before next loop, milliseconds: ")); Serial.println(loopDelay); delay(loopDelay); }
Ik heb nog nooit iets met arduino gedaan, maar dit schema en deze sketch zouden toch ook moeten werken op een arduino uno? Ik heb heb de schakeling nu 3 keer opnieuw opgezet, de sketch ge-upload naar de arduino, maar er gebeurt niets
Peter have you figured out how to do this on the arduino uno yet? I want to try this as well but wondering the samething….
Nope, still doesn’t work.
Iets zegt mij dat dit niet logisch kan werken, hoe wordt het programma geactiveerd?
Zie geen drukknoppen of sensor om alles aan te sturen.
Een afstand sensor HC-SR05 zou handig zijn om te activeren op een afstand minder dan 50 cm om de loop éénmaal te laten lopen en na bv. 5 seconden de afstand terug te laten scannen.
Is een idee, maar ik ben niet sterk genoeg om zulk een progje te schrijven
Iets zegt mij dat je de code niet goed bekeken hebt, want dan had je gezien dat het een loop is met een pauze van willekeurige lengte. Het werkt dus wel degelijk “logisch”, zonder sensor of knoppen.
Beste oneguyoneblog
Ten eerste, Bedankt voor de tutorial!
Momenteel ben ik bezig met het programmeren van jou set-up maar nu blijkt dat de “loop” niet werkt.
Als ik op de knop van de nano duw speelt er een golf van 2 bliksemslagen af, perfect gevolgd met geluid.
Het probleem is dat het hier bij blijft.
2 uur gewacht zonder enige beweging.
Ook de loopdelay veranderd maar zonder resultaat.
Ligt het probleem bij de aansluiting van m’n board?
Ik vind het wel raar omdat de 2 eerste slagen wel perfect afspelen.
Hopelijk kan je me helpen om een bliksem half uur te brengen in m’n aquarium. 🙂
Mvg Glenn
Hoi Glenn, graag gedaan! Wat zie je op de seriiële monitor? Blijft die ook hangen en zo ja, wat is de laatste regel uitvoer?
Bedankt voor je reactie!
Ik zou eens moeten opzoeken wat je met seriële monitor bedoeld. De code is succesvol geupload in de arduino. Ondertussen heb ik een begin van het probleem gevonden en dat is namelijk dat wanneer ik de audio plugs op m’n jack aansluit er enkel 2 bliksemslagen gesimuleerd worden.
Als geen 1 van de 3 op de jack aangeloten is werkt de loop prima, maar zonder geluid dan. De aansluiting heb ik nog een paar keer overlopen en volgen mij klopt het.
Mvg Glenn
Eigenlijk bedoel ik het niet in die zin, loopt inderdaad automatisch. Wat ik in werkelijkheid zou willen is dat het bliksem en donder kan geven enkel op bepaalde afstanden.
Op andere afstanden wil ik een ander geluid laten werken, dus een combinatie, maar ja ben nog steeds aan het zoeken, maar tot op heden geen resultaat.
Zal aan mijn ouderdom liggen (75 jaar jong, en er komt sleet op).