Smart Gong - [Teil 2]

Hallo zusammen,

es freut mich, dass der erste Beitrag bereits gut angekommen ist.

Im heutigen Beitrag bringen wir ein wenig Farbe in Spiel und rücken das Projekt (besonders interessant für Haushalte mit Babys und Schichtarbeitern) ins richtige Licht. :-)

Dazu erweitern wir unsere SmartGong um einen RGB-Ring und ein Potentiometer‎.

Das Potentiometer‎ nutzen wir als einfachen Lautstärkeregler und schalten im Code ab einer niedrigen Lautstärke auf einen visuellen Gong um.

Dadurch lässt sich die Klingel jederzeit in der Lautstärke regulieren und auch komplett lautlos betreiben.

Aktueller Stand der SmartGong02

Benötigte Hardware

Für die Umsetzung benötigen wir: 

Anzahl Bauteil Anmerkung
1 AZ-Delivery D1 Mini
1 Mini MP3 Player
1 4GB MicroSD-Speicherkarte
1 Reedkontakt Schließer (N/O)
1 3W Lautsprecher z.B CQRobot-Lautsprecher 3W
1 AZDelivery 5V RGB LED Ring WS2812B 12-Bit 50mm
1 Potentiometer (10kΩ) Je nach Belieben kann auch z.B.
ein Schiebepotentiometer
verwendet werden
1 Elektrolytkondensator (1000 uF)

 

Der Aufbau 

Aufbau des Prototyps auf einem Steckbrett

Analog zum MP3 Modul aus Teil 1 kann auf den Widerstand für die Ansteuerung der RGBs verzichtet werden. Momentan wird der RGB-RING über den 5 V Pin des Wemos D1 versorgt.

Jedes der 12 RGBs kann bis zu 50 mA Strom ziehen, was bei 12 RGBs maximal 600 mA ergibt. Der Wemos D1 kann jedoch maximal 400 mA am 5 V Pin liefern.

Da wir jedoch nicht alle LEDs gleichzeitig bei voller Helligkeit leuchten lassen wollen, sollte dies kein Problem sein.

Der empfohlene 1000 μF Kondensator ist ebenfalls (bei 12 LEDs) nicht zwangsweise notwendig. Dieser hilft jedoch die Spannung zu stabilisieren bzw. zu puffern, was auch für die nächsten Erweiterungen von Vorteil ist.

Achten Sie beim Elektrolytkondensator unbedingt auf die richtige Polung.
Ansonsten kann der Elko explodieren!
Die Seite mit dem weißen Strich muss mit GND verbunden werden.

Da der AnalogPin des Wemos D1 nur für Spannungen von 0V-3.2 V ausgelegt ist, verwenden wir den 3,3 V Pin des Wemos D1 als Spannungsversorgung (und nicht den 5 V Pin) für unser Potentiometer. Das Potentiometer arbeitet als variabler Spannungsteiler.

Aufgrund der Bauteiltoleranzen aller Komponenten ist die Überschreitung des maximalen Wertes von 3,3 V anstatt 3,2 V nicht weiter kritisch.

Mit seiner 10 BIT Auflösung wandelt der AD Wandler des D1 Mini den Spannungsbereich 0-3,2 V in einen Wertebereich von 0-1023 um.

Die Software 

Für die Ansteuerung der RGB-LEDs binden wir in der Arduino IDE unter \Werkzeuge\Bibliotheken verwalten ... eine weitere Library -Adafruit_NeoPixel.h - ein.

Unter: Adafruit_NeoPixel/examples/strandtest_wheel/strandtest_wheel.ino gibt es ein Beispielsketch mit den Informationen zur Verwendung der WS2812 RGB-LED’s.

Aus dem Beispiel kopieren wir uns die beiden Funktionen theaterChaseRainbow() und Wheel() und fügen diese am Ende unserer Programmcodes ein.

Durch das Ersetzen von  j++ zu  j=j+8  werden beim Funktionsaufruf von theaterChaseRainbow() nicht alle 256 Farben, sondern nur 32 Farben verwendet.

Sie können ihren Lichtgong natürlich auch nach Belieben selbst designen.

//Benötigte Bibliotheken 
#include <SoftwareSerial.h>  //Software Serial for ESP8266 https://circuits4you.com/2016/12/14/software-serial-esp8266/   Link zur Library https://circuits4you.com/wp-content/uploads/2016/11/SoftwareSerial.zip
#include <ESP8266WiFi.h>
#include <DFRobotDFPlayerMini.h> //https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299   Link zur Library https://github.com/DFRobot/DFRobotDFPlayerMini/archive/1.0.3.zip
#include <Adafruit_NeoPixel.h>// https://github.com/adafruit/Adafruit_NeoPixel.git   Link zur Library https://github.com/adafruit/Adafruit_NeoPixel/archive/master.zip 

//Benötigte Deklarationen 
SoftwareSerial SofSer(D3, D4, false, 128); //Wir deklarieren ein Objekt vom Typ "SoftwareSerial" mit dem Namen "SofSer" und setzen D3 auf RX und D4 auf TX als Ausgang für die Serielle Komunikation SoftwareSerial(rxPin, txPin, inverse_logic, buffer size);
DFRobotDFPlayerMini AzMp3Player;    //Wir deklarieren ein Objekt vom Typ "DFRobotDFPlayerMini" mit dem Namen 'AzMp3Player'
Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, D2, NEO_GRB + NEO_KHZ800);//Wir deklarieren ein Objekt vom Typ "Adafruit_NeoPixel" mit dem Namen "strip" und setzen 12 als AnzahlPixel und D2 als DatenPin ein. Adafruit_NeoPixel(AnzahlPixel, DatenPin, NEO_GRB + NEO_KHZ800);
int Volume = 25;                    //Variable für die Lautstärke mit 25 als Startwert

void setup() {
  Volume=map(analogRead(A0), 0, 1023, 0, 30);   // Liest den Wert von A0 und wandelt den Wertebereich von 0-1023 auf 0-30 um
  if (Volume > 10)                           // Wenn Lautstärke größer als 10 dann schalte die Melodie an
   {
     SofSer.begin(9600);                       // Einstellen der Baudrate auf 9600 welche vom MP3-Modul erwartet wird.
     AzMp3Player.begin(SofSer);                // Starten der seriellen Kommunikation zwischen dem D1 Mini und dem MP3 Modul.
     AzMp3Player.volume(Volume);               // Sendet Nachricht an das MP3 Modul: stelle Lautstärke auf 25 (0-30)
     AzMp3Player.playMp3Folder(0);             // Sendet Nachricht an das MP3 Modul: Spielt die Dateinummer 0000.mp3
   }
  else                                      // Wenn Lautstärke kleiner als 10 dann schalte die Lichtmodi an
   {
    strip.begin(); 
    strip.setBrightness(250);                  // Einstellen der Helligkeit (0-max 255)
    theaterChaseRainbow(100);                  // Aufruf der theaterChaseRainbow() Funktion aus dem Beispiel strandtest_wheel.ino
    strip.show();                              // Initialisiert alle Pixel mit 0 (Aus)
   }
}

void loop() {
  ESP.deepSleep(0);  // versetzt den D1 in Tiefschlaf 
}



//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j=j+8) {     // j++ cycle all 256 colors in the wheel  j=j+8  256/8=  -->32 Farben
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
      strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Hat alles geklappt, sollte jetzt bei Betätigen der Klingel je nach Stellung des Potentiometers entweder eine Melodie (mit variabler Lautstärke) oder der Lichteffekt für Aufmerksamkeit sorgen.

Viel Spaß beim Nachbauen!

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert