vr. apr 19th, 2024
politie zwaailicht en sirene

In dit project besturen we de RGB LEDS en de buzzer tegelijkertijd om zo een zwaailicht en/of sirene simulatie te maken. Nu mag je op top-snelheid door het huis rennen om de boeven te pakken en iedereen moet je voorrang verlenen!

Zoals alle voorbeelden die we hier presenteren maakt dit project ook gebruik van de A-Vision ESP8266 Arduino bibliotheek.

Open het politie voorbeeld uit de A-Vision ESP8266 bibliotheek.

Nu ben je klaar om het Politie voorbeeld project te compileren en naar de ESP8266 D1 mini te sturen.

Voor de programmering moet de ESP8266 D1 mini module met een micro-USB kabel worden aangesloten op de computer waarop de Arduino IDE software is geïnstalleerd.

Maak ook je eigen zwaailicht en sirene simulatie.

Hardware aansluiting

– voor de A-Vision ESP8266 learning board –
Het RGB LEDs sluiten we aan met Din op D3. Tevens sluiten we de drukknoppen BUTTON #1 aan op D5, BUTTON #2 aan op D6, BUTTON #3 aan op D7 en BUTTON #4 aan op D0.

Verder sluiten we de BUZZER aan tussen GND en D8.

De code

definities & includes
functies()
setup()
loop()
politie.ino
referenties
uitdaging

In de definities geven we aan waarop de verschillende drukknoppen (INGANG) en de buzzer (UITGANG) zijn aangesloten.
En als laatste maken we een RGBleds object aan die we later gaan gebruiken voor het besturen van de LEDS en definiëren 3 kleren (off, red en blue).
De kleuren worden tijdens de setup geïnitialiseerd.

// Definities
#define DEBUG_ENABLED false // Output info via de seriële poort

// Definieer op welke Digitale ingang de drukknoppen zijn aangesloten
#define BUTTON1 D5
#define BUTTON2 D6
#define BUTTON3 D7
#define BUTTON4 D0

#define SIREN   D8

#include <avision_debug.h>
#include <avision_RGBleds.h>

// https://github.com/adafruit/Adafruit_NeoPixel/blob/master/Adafruit_NeoPixel.h
AVision::RGBleds leds;
// LED posities -
//          [0] [1] [2] [3]
//          [4] [5] [6] [7]

// Kleuren -> Black (off), Rood, Blauw
uint32_t off;
uint32_t red;
uint32_t blue;

In dit voorbeeld maken we tevens gebruik van functies (Youtube video over Arduino functies).
Deze functies maken het makkelijk om bepaalde veel voorkomende acties uit te voeren zonder ze steeds opnieuw helemaal uit te schrijven.
Dit bespaart geheugenruimte en maakt het programmeren makkelijker.
We hebben een functie om de rode LEDs aan of uit te doen en een functie om de blauwe LEDs aan of uit te doen.

Deze functies kunnen we dan later (bijvoorbeeld in setup() en loop()) gebruiken.

void leds_red(bool on)
{
    if (on)
    {
        leds.setLED(0, red);
        leds.setLED(1, red);
        leds.setLED(4, red);
        leds.setLED(5, red);
    }
    else
    {
        leds.setLED(0, off);
        leds.setLED(1, off);
        leds.setLED(4, off);
        leds.setLED(5, off);
    }
}
void leds_blue(bool on)
{
    if (on)
    {
        leds.setLED(2, blue);
        leds.setLED(3, blue);
        leds.setLED(6, blue);
        leds.setLED(7, blue);
    }
    else
    {
        leds.setLED(2, off);
        leds.setLED(3, off);
        leds.setLED(6, off);
        leds.setLED(7, off);
    }
}

Nu de definities gedaan zijn kunnen we in de standaard setup() functie van de Arduino IDE het geheel initialiseren.
Hier wordt allereerst de drukknop ingangen en buzzer uitgang geïnitialiseerd.
Tevens geven we aan hoeveel RGB LEDs we gebruiken (8 op het ESP8266 learning board) en welk type RGB LED we gebruiken en op welke pin deze wordt aangestuurd.
Daarna initialiseren we de gebruikte kleuren.

Als laatste laten we de we de RGB LEDs even kort oplichten met de gebruikte kleuren (rood en blauw).
De leds.loop() zorgt ervoor dat de wijzigingen die we aan de LEDs willen ook daadwerkelijk wordt uitgevoerd.

void setup()
{
    // https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/
    pinMode(BUTTON1, INPUT_PULLUP);
    pinMode(BUTTON2, INPUT_PULLUP);
    pinMode(BUTTON3, INPUT_PULLUP);
    pinMode(BUTTON4, INPUT_PULLUP);
    pinMode(SIREN, OUTPUT);

    initDebug(DEBUG_ENABLED);
    // Aantal RGB LEDs (Voor de A-Vision ESP8266 learning board is dat 8)
    leds.setLEDcount(8);
    // LED type (WS2812 => NEO_GRB) (Voor de A-Vision ESP8266 learning board is dat NEO_GRB)
    leds.setLEDtype(NEO_GRBW);
    // LEDs Data in (Din) pin (Voor de A-Vision ESP8266 learning board is dat D3)
    leds.init(D3);

    // Waarden -> 0 is uit, 255 is maximaal
    off = leds.color(0, 0, 0, 0);
    red = leds.color(255, 0, 0, 0);
    blue = leds.color(0, 0, 255, 0);

    leds_red(true);
    leds_blue(true);

    // Licht helderheid in procenten 0% - 100%
    leds.setBrightness(100);
    leds.loop();

    delay(100);
    leds_red(false);
    leds_blue(false);
    leds.loop();
}

Zoals eerder aangegeven maken we gebruik van de Arduino millis() functie voor het bepalen hoelang de LEDs rood of blauw moeten oplichten en hoelang de buzzer een bepaalde toon moet afgeven.
De millis() functie geeft aan hoelang (in milliseconden) de ESP8266 controller aanstaat. Aan het begin van de loop halen we deze waarde op om te gebruiken.
Hierdoor kunnen we meer dan één zwaailicht en sirene simulatie maken.

Vervolgens controleren we welke knop is ingedrukt (het lezen van de ingang geeft dan een waarde LOW) en voeren een bepaalde actie uit.
Dan, wanneer bepaalde knoppen niet zijn ingedrukt zorgen we ervoor dat de LEDs en/of de buzzer uit zijn.

BUTTON #1
Met deze knop laten we de LEDs als rood/blauw zwaailicht zien, afwisselend gedurende 375ms rood en dan gedurende 375ms blauw.

BUTTON #2
Met deze knop laten we de buzzer als sirene horen, afwisselend gedurende 750ms op 375Hz en dan gedurende 750ms op 500Hz.

BUTTON #3
Als deze knop is ingedrukt laten we de LEDs gedurende afwisselend 750ms rood knipperen (75ms aan / 75ms uit) en dan 750ms blauw knipperen (75ms aan / 75ms uit) .

BUTTON #4
Met deze knop laten we de buzzer als sirene horen met een sinus-vormige frequentie van 375Hz tot 500Hz. Deze klink meer als een Amerikaanse sirene.

void loop()
{

    // https://www.arduino.cc/reference/en/language/functions/time/millis/
    unsigned long m = millis();

    // https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/
    if (digitalRead(BUTTON1) == LOW)
    {
        if (m % 750 < 375) {
            leds_red(true);
            leds_blue(false);
        } else {
            leds_red(false);
            leds_blue(true);
        }
    }
    if (digitalRead(BUTTON2) == LOW)
    {
        if (m % 1500 < 750) {
            tone(SIREN, 375, 750);
        } else {
            tone(SIREN, 500, 750);
        }
    }
    if (digitalRead(BUTTON3) == LOW)
    {
        if (m % 1500 < 750) {
            if (m % 150 < 75) {
                leds_red(true);
            } else {
                leds_red(false);
            }
            leds_blue(false);
        } else {
            leds_red(false);
            if (m % 150 < 75) {
                leds_blue(true);
            } else {
                leds_blue(false);
            }
        }
    }
    if (digitalRead(BUTTON4) == LOW)
    {
        double d = m % 1500;
        double f = 62.5 * (sin(PI * d / 750) + 1.0) + 375;
        tone(SIREN, f, 10);
    }

    if (digitalRead(BUTTON1) == HIGH && digitalRead(BUTTON3) == HIGH) {
        leds_red(false);
        leds_blue(false);
    }
    if (digitalRead(BUTTON2) == HIGH && digitalRead(BUTTON4) == HIGH) {
        noTone(SIREN);
    }

    leds.loop();
    delay(5);
}

/*******************************************************************************
*
* (c) 2021 Copyright A-Vision Software
*
* File description :        Politie zwaailicht en sirene
*
* Created by       :        Arnold Velzel
* Created on       :        22-10-2021
*
*******************************************************************************/

// Definities
#define DEBUG_ENABLED false // Output info via de seriële poort

// Definieer op welke Digitale ingang de drukknoppen zijn aangesloten
#define BUTTON1 D5
#define BUTTON2 D6
#define BUTTON3 D7
#define BUTTON4 D0

#define SIREN   D8

#include <avision_debug.h>
#include <avision_RGBleds.h>

// https://github.com/adafruit/Adafruit_NeoPixel/blob/master/Adafruit_NeoPixel.h
AVision::RGBleds leds;
// LED posities -
//          [0] [1] [2] [3]
//          [4] [5] [6] [7]

// Kleuren -> Black (off), Rood, Blauw
uint32_t off;
uint32_t red;
uint32_t blue;

void leds_red(bool on)
{
    if (on)
    {
        leds.setLED(0, red);
        leds.setLED(1, red);
        leds.setLED(4, red);
        leds.setLED(5, red);
    }
    else
    {
        leds.setLED(0, off);
        leds.setLED(1, off);
        leds.setLED(4, off);
        leds.setLED(5, off);
    }
}
void leds_blue(bool on)
{
    if (on)
    {
        leds.setLED(2, blue);
        leds.setLED(3, blue);
        leds.setLED(6, blue);
        leds.setLED(7, blue);
    }
    else
    {
        leds.setLED(2, off);
        leds.setLED(3, off);
        leds.setLED(6, off);
        leds.setLED(7, off);
    }
}

void setup()
{
    // https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/
    pinMode(BUTTON1, INPUT_PULLUP);
    pinMode(BUTTON2, INPUT_PULLUP);
    pinMode(BUTTON3, INPUT_PULLUP);
    pinMode(BUTTON4, INPUT_PULLUP);
    pinMode(SIREN, OUTPUT);

    initDebug(DEBUG_ENABLED);
    // Aantal RGB LEDs (Voor de A-Vision ESP8266 learning board is dat 8)
    leds.setLEDcount(8);
    // LED type (WS2812 => NEO_GRB) (Voor de A-Vision ESP8266 learning board is dat NEO_GRB)
    leds.setLEDtype(NEO_GRBW);
    // LEDs Data in (Din) pin (Voor de A-Vision ESP8266 learning board is dat D3)
    leds.init(D3);

    // Waarden -> 0 is uit, 255 is maximaal
    off = leds.color(0, 0, 0, 0);
    red = leds.color(255, 0, 0, 0);
    blue = leds.color(0, 0, 255, 0);

    leds_red(true);
    leds_blue(true);

    // Licht helderheid in procenten 0% - 100%
    leds.setBrightness(100);
    leds.loop();

    delay(100);
    leds_red(false);
    leds_blue(false);
    leds.loop();
}

void loop()
{
    // https://www.arduino.cc/reference/en/language/functions/time/millis/
    unsigned long m = millis();

    // https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/
    if (digitalRead(BUTTON1) == LOW)
    {
        if (m % 750 < 375) {
            leds_red(true);
            leds_blue(false);
        } else {
            leds_red(false);
            leds_blue(true);
        }
    }
    if (digitalRead(BUTTON2) == LOW)
    {
        if (m % 1500 < 750) {
            tone(SIREN, 375, 750);
        } else {
            tone(SIREN, 500, 750);
        }
    }
    if (digitalRead(BUTTON3) == LOW)
    {
        if (m % 1500 < 750) {
            if (m % 150 < 75) {
                leds_red(true);
            } else {
                leds_red(false);
            }
            leds_blue(false);
        } else {
            leds_red(false);
            if (m % 150 < 75) {
                leds_blue(true);
            } else {
                leds_blue(false);
            }
        }
    }
    if (digitalRead(BUTTON4) == LOW)
    {
        double d = m % 1500;
        double f = 62.5 * (sin(PI * d / 750) + 1.0) + 375;
        tone(SIREN, f, 10);
    }

    if (digitalRead(BUTTON1) == HIGH && digitalRead(BUTTON3) == HIGH) {
        leds_red(false);
        leds_blue(false);
    }
    if (digitalRead(BUTTON2) == HIGH && digitalRead(BUTTON4) == HIGH) {
        noTone(SIREN);
    }

    leds.loop();
    delay(5);
}

Kun jij de LEDs nog op een andere manier laten knipperen of met andere kleuren?
Of verzin je eigen sirene geluid die samen gaat met je zwaailicht.
Vraag hulp hoe jij het beste je eigen zwaailicht en sirene simulatie kan maken.

Door arduino