Buzzer hinzufügen

Hallo,

Ich habe mir den folgenden code im Netz heruntergeladen und alles hat soweit auch nach einigen Versuchen gut funktioniert :-).

Da ich jedoch nicht so sehr vertraut mit mit dem Bearbeiten dieser codes, bräuchte ich eure Hilfe.

Ich habe ein OLED Display, dass mir mit dem WEMOS mini meine YouTube Statistik anzeigt. Ich würde gerne einen Buzzer in den code integrieren, der einen kurzen Signalton abgibt, sobald sich die Zahl der Subscriber verändert hat (egal ob positiv oder negativ).

Mit meiner zweiten LED Anzeige klappt das super, dort ist aber der code ein anderer und ich denke ich kann das nicht so 1 zu 1 aus diesem code kopieren.

Vielen Dank.
Philipp

Code:

#include <YoutubeApi.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET LED_BUILTIN
Adafruit_SSD1306 display(OLED_RESET);

//------- Replace the following! ------
char ssid[] = "XXX";       // your network SSID (name)
char password[] = "XXX";  // your network key
#define API_KEY "XXX"  // your google apps API Token
#define CHANNEL_ID "XXX" // makes up the url of channel
String chanelName = "XXX";

int nextStatDelay = 5000;

WiFiClientSecure client;
YoutubeApi api(API_KEY, client);

int api_mtbs = 60000;
long api_lasttime;
long subs = 0;

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup()   {                
 Serial.begin(9600);

 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
 
 display.clearDisplay();
 display.setTextSize(2);
 display.setTextColor(WHITE);
 display.setCursor(13,17);
 display.println("Subscribe");
 display.setCursor(27,35);
 display.println("counter");
 display.display();

 // Set WiFi to station mode and disconnect from an AP if it was Previously
 // connected
 WiFi.mode(WIFI_STA);
 WiFi.disconnect();
 delay(100);

 // Attempt to connect to Wifi network:
 Serial.print("Connecting Wifi: ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {
   Serial.print(".");
   delay(500);
 }
 Serial.println("");
 Serial.println("WiFi connected");
 Serial.println("IP address: ");
 IPAddress ip = WiFi.localIP();
 Serial.println(ip);
}

void loop() {
 if (millis() > api_lasttime + api_mtbs)  {
   if (api.getChannelStatistics(CHANNEL_ID)) {
     Serial.println("---------Stats---------");
     Serial.print("Subscriber Count: ");
     Serial.println(api.channelStats.subscriberCount);
     Serial.print("View Count: ");
     Serial.println(api.channelStats.viewCount);
     Serial.print("Video Count: ");
     Serial.println(api.channelStats.videoCount);
     Serial.println("------------------------");
   }
   api_lasttime = millis();
 }
 
 //SUBSCIBER COUNT
 long subcountme = api.channelStats.subscriberCount;

 display.clearDisplay();
 display.setTextSize(2);
 display.setCursor(5, 0);
 display.println("Subscribe:");

 if (subcountme == 0) {
   display.setTextSize(1);
   display.setCursor(34, 24);
   display.println("loading ...");
 } else {
   display.setTextSize(1);
   if (subcountme < 10) {
     display.setCursor(60, 24);
   }
   if (subcountme > 9 && subcountme < 100) {
     display.setCursor(60, 24);
   }
   if (subcountme > 99 && subcountme < 1000) {
     display.setCursor(56, 24);
   }
   if (subcountme > 999 && subcountme < 10000) {
     display.setCursor(52, 24);
   }
   if (subcountme > 9999 && subcountme < 100000) {
     display.setCursor(48, 24);
   }
   if (subcountme > 99999 && subcountme < 1000000) {
     display.setCursor(44, 24);
   }
   if (subcountme > 999999 && subcountme < 10000000) {
     display.setCursor(40, 24);
   }
   if (subcountme > 9999999 && subcountme < 100000000) {
     display.setCursor(36, 24);
   }
   if (subcountme > 99999999 && subcountme < 1000000000) {
     display.setCursor(32, 24);
   }
   display.println(String(subcountme));
 }

 display.setCursor(0, 50);
 display.println("YouTube: " + chanelName);

 display.display();

 delay(nextStatDelay);

 //VIEW COUNT
 long viewcountme = api.channelStats.viewCount;

 display.clearDisplay();
 display.setTextSize(2);
 display.setCursor(30, 0);
 display.println("big:");

 if (viewcountme == 0) {
   display.setTextSize(1);
   display.setCursor(34, 24);
   display.println("loading ...");
 } else {
   display.setTextSize(1);
   if (viewcountme < 10) {
     display.setCursor(60, 24);
   }
   if (viewcountme > 9 && subcountme < 100) {
     display.setCursor(60, 24);
   }
   if (viewcountme > 99 && subcountme < 1000) {
     display.setCursor(56, 24);
   }
   if (viewcountme > 999 && subcountme < 10000) {
     display.setCursor(52, 24);
   }
   if (viewcountme > 9999 && subcountme < 100000) {
     display.setCursor(48, 24);
   }
   if (viewcountme > 99999 && subcountme < 1000000) {
     display.setCursor(44, 24);
   }
   if (viewcountme > 999999 && subcountme < 10000000) {
     display.setCursor(40, 24);
   }
   if (viewcountme > 9999999 && subcountme < 100000000) {
     display.setCursor(36, 24);
   }
   if (viewcountme > 99999999 && subcountme < 1000000000) {
     display.setCursor(32, 24);
   }
   display.println(String(viewcountme));
 }

 display.setCursor(0, 50);
 display.println("YouTube: " + chanelName);

 display.display();

 delay(nextStatDelay);

 //VIDEOS COUNT
 long videocountme = api.channelStats.videoCount;

 display.clearDisplay();
 display.setTextSize(2);
 display.setCursor(25, 0);
 display.println("Videos:");

 if (videocountme == 0) {
   display.setTextSize(1);
   display.setCursor(34, 24);
   display.println("loading ...");
 } else {
   display.setTextSize(1);
   if (videocountme < 10) {
     display.setCursor(60, 24);
   }
   if (videocountme > 9 && subcountme < 100) {
     display.setCursor(60, 24);
   }
   if (videocountme > 99 && subcountme < 1000) {
     display.setCursor(56, 24);
   }
   if (videocountme > 999 && subcountme < 10000) {
     display.setCursor(52, 24);
   }
   if (videocountme > 9999 && subcountme < 100000) {
     display.setCursor(48, 24);
   }
   if (videocountme > 99999 && subcountme < 1000000) {
     display.setCursor(44, 24);
   }
   if (videocountme > 999999 && subcountme < 10000000) {
     display.setCursor(40, 24);
   }
   if (videocountme > 9999999 && subcountme < 100000000) {
     display.setCursor(36, 24);
   }
   if (videocountme > 99999999 && subcountme < 1000000000) {
     display.setCursor(32, 24);
   }
   display.println(String(videocountme));
 }

 display.setCursor(0, 50);
 display.println("YouTube: " + chanelName);

 display.display();

 delay(nextStatDelay);
}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor), dann ist er für alle gut lesbar.

Gruß Tommy

Schade, dass der Sketch komplett undokumentiert ist, so findet man sich nicht zurecht. Schon garnicht wo man entsprechende Änderungen einfügen soll.

@TO: Was für einen Buzzerwillst Du denn benutzen?

a) einen aktiven Buzzer der also nur einen freien Ausgang mit Spannung braucht b) einen passiven Buzzer, der eine Tonausgabe von Wemos braucht. Der kannst Du die Länge gleich mit geben.

Beide müssten natürlich von NodeMCU versorgt werden können, also mit 3V3 laufen. Sonst musst Du etwas mehr HW-Aufwand treiben, wenn Du eine große Tröte anschließen willst.

Gruß Tommy

Hi

Verstehe das Problem nicht. Wenn ich den Sketch recht interpretiere, werden diverse Datem von YouTube abgefragt - unter Anderem auch 'Daumen hoch' und 'Daumen runter'. Wenn ich mir doch diese Anzahl merke und bei der nächsten Abfrage prüfe, ob sich Da was geändert hat, habe ich doch schon zumindest die nötige Logik für den Buzzer erschlagen. Da die Anzeige nicht in RealTime aufgefrischt wird, kann man wohl mit tone() ein Signal an eine Piezo-Scheibe oder einen anzusteuernden Transistor senden - denke, ein Blockieren ist hier nahezu egal - man muß es nur im Hinterkopf behalten, wenn der Käfter später Mal noch 'was nebenbei machen' soll.

MfG

Danke für die vielen Antworten. An meinem Anderen LCD Zähler habe ich einen 3V Buzzer von meiner Racedrohne genommen. Dieser war an D8 angeschlossen. Ich verstehe leider nicht alles was hier geschrieben wird, da ich eher Projekte nehme die fertig sind und diese mit Halbwissen leicht modifiziere.

LG Philipp

Also gehe ich mal von einem aktiven Buzzer aus.
Genereller Hinweis: Bei einem Display nimmt man eher print, als println.
Da Du sowieso nichts anderes machst, habe ich elay für die Zeit genommen.
Die Ergänzungen sind mit <— gekennzeichnet und ungetestet.

#include <YoutubeApi.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET LED_BUILTIN
Adafruit_SSD1306 display(OLED_RESET);

//------- Replace the following! ------
char ssid[] = "XXX";       // your network SSID (name)
char password[] = "XXX";  // your network key
#define API_KEY "XXX"  // your google apps API Token
#define CHANNEL_ID "XXX" // makes up the url of channel
String chanelName = "XXX";

int nextStatDelay = 5000;

WiFiClientSecure client;
YoutubeApi api(API_KEY, client);

int api_mtbs = 60000;
long api_lasttime;
long subs = 0;

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// alter Wert
unsigned long subcountmeOld = 0;  // <-----
const byte buzzerPin = 2;  // Pin 2 (D4)
const unsigned long buzzerTime = 1000;  // 1000 ms = 1 Sekunde

void setup()   {                
 Serial.begin(9600);

 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
 
 display.clearDisplay();
 display.setTextSize(2);
 display.setTextColor(WHITE);
 display.setCursor(13,17);
 display.println("Subscribe");
 display.setCursor(27,35);
 display.println("counter");
 display.display();

 // Set WiFi to station mode and disconnect from an AP if it was Previously
 // connected
 WiFi.mode(WIFI_STA);
 WiFi.disconnect();
 delay(100);

 // Attempt to connect to Wifi network:
 Serial.print("Connecting Wifi: ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {
   Serial.print(".");
   delay(500);
 }
 Serial.println("");
 Serial.println("WiFi connected");
 Serial.println("IP address: ");
 IPAddress ip = WiFi.localIP();
 Serial.println(ip);
}

void loop() {
 if (millis() > api_lasttime + api_mtbs)  {
   if (api.getChannelStatistics(CHANNEL_ID)) {
     Serial.println("---------Stats---------");
     Serial.print("Subscriber Count: ");
     Serial.println(api.channelStats.subscriberCount);
     Serial.print("View Count: ");
     Serial.println(api.channelStats.viewCount);
     Serial.print("Video Count: ");
     Serial.println(api.channelStats.videoCount);
     Serial.println("------------------------");
   }
   api_lasttime = millis();
 }
 
 //SUBSCIBER COUNT
unsigned long subcountme = api.channelStats.subscriberCount; // <--- der wird nicht negativ

 display.clearDisplay();
 display.setTextSize(2);
 display.setCursor(5, 0);
 display.println("Subscribe:");

 if (subcountme == 0) {
   display.setTextSize(1);
   display.setCursor(34, 24);
   display.println("loading ...");
 } else {
   display.setTextSize(1);
   if (subcountme < 10) {
     display.setCursor(60, 24);
   }
   if (subcountme > 9 && subcountme < 100) {
     display.setCursor(60, 24);
   }
   if (subcountme > 99 && subcountme < 1000) {
     display.setCursor(56, 24);
   }
   if (subcountme > 999 && subcountme < 10000) {
     display.setCursor(52, 24);
   }
   if (subcountme > 9999 && subcountme < 100000) {
     display.setCursor(48, 24);
   }
   if (subcountme > 99999 && subcountme < 1000000) {
     display.setCursor(44, 24);
   }
   if (subcountme > 999999 && subcountme < 10000000) {
     display.setCursor(40, 24);
   }
   if (subcountme > 9999999 && subcountme < 100000000) {
     display.setCursor(36, 24);
   }
   if (subcountme > 99999999 && subcountme < 1000000000) {
     display.setCursor(32, 24);
   }
   display.println(String(subcountme));
 }

 display.setCursor(0, 50);
 display.println("YouTube: " + chanelName);

 display.display();

  // Buzzer                                                            <----
  if (subcountme != subcountmeOld) {
    subcountmeOld = subcountme;
    digitalWrite(buzzerPin,HIGH);
    delay(buzzerTime);
    digitalWrite(buzzerPin,LOW);
  }

 delay(nextStatDelay);

 //VIEW COUNT
 long viewcountme = api.channelStats.viewCount;

 display.clearDisplay();
 display.setTextSize(2);
 display.setCursor(30, 0);
 display.println("big:");

 if (viewcountme == 0) {
   display.setTextSize(1);
   display.setCursor(34, 24);
   display.println("loading ...");
 } else {
   display.setTextSize(1);
   if (viewcountme < 10) {
     display.setCursor(60, 24);
   }
   if (viewcountme > 9 && subcountme < 100) {
     display.setCursor(60, 24);
   }
   if (viewcountme > 99 && subcountme < 1000) {
     display.setCursor(56, 24);
   }
   if (viewcountme > 999 && subcountme < 10000) {
     display.setCursor(52, 24);
   }
   if (viewcountme > 9999 && subcountme < 100000) {
     display.setCursor(48, 24);
   }
   if (viewcountme > 99999 && subcountme < 1000000) {
     display.setCursor(44, 24);
   }
   if (viewcountme > 999999 && subcountme < 10000000) {
     display.setCursor(40, 24);
   }
   if (viewcountme > 9999999 && subcountme < 100000000) {
     display.setCursor(36, 24);
   }
   if (viewcountme > 99999999 && subcountme < 1000000000) {
     display.setCursor(32, 24);
   }
   display.println(String(viewcountme));
 }

 display.setCursor(0, 50);
 display.println("YouTube: " + chanelName);

 display.display();

 delay(nextStatDelay);

 //VIDEOS COUNT
 long videocountme = api.channelStats.videoCount;

 display.clearDisplay();
 display.setTextSize(2);
 display.setCursor(25, 0);
 display.println("Videos:");

 if (videocountme == 0) {
   display.setTextSize(1);
   display.setCursor(34, 24);
   display.println("loading ...");
 } else {
   display.setTextSize(1);
   if (videocountme < 10) {
     display.setCursor(60, 24);
   }
   if (videocountme > 9 && subcountme < 100) {
     display.setCursor(60, 24);
   }
   if (videocountme > 99 && subcountme < 1000) {
     display.setCursor(56, 24);
   }
   if (videocountme > 999 && subcountme < 10000) {
     display.setCursor(52, 24);
   }
   if (videocountme > 9999 && subcountme < 100000) {
     display.setCursor(48, 24);
   }
   if (videocountme > 99999 && subcountme < 1000000) {
     display.setCursor(44, 24);
   }
   if (videocountme > 999999 && subcountme < 10000000) {
     display.setCursor(40, 24);
   }
   if (videocountme > 9999999 && subcountme < 100000000) {
     display.setCursor(36, 24);
   }
   if (videocountme > 99999999 && subcountme < 1000000000) {
     display.setCursor(32, 24);
   }
   display.println(String(videocountme));
 }

 display.setCursor(0, 50);
 display.println("YouTube: " + chanelName);

 display.display();

 delay(nextStatDelay);
}

Gruß Tommy

Das ist ja sehr nett von Dir, dass du dir die Zeit genommen hast das für mich zu schreiben. Ich werde das sofort testen und mich gleich mit dem Ergebnis melden.

Schließe ich alles an (D2 an SDA, D1 an SCL, D4 an Buzzer + und Buzzer - an G), ertönt ein dauerhaftes Piepen vom Buzzer und das Display bleibt aus. :/

Ich habe im Setup vergessen, den Pin auf Ausgang zu setzen:

...
digitalwrite(buzzerPin,LOW);
pinMode(buzzerPin, OUTPUT);
...

Gruß Tommy

Es funktioniert. Vielen lieben Dank!

Prima. Danke für die Rückmeldung.

Gruß Tommy

Eine kleine Schönheitssache noch. Wenn ich das ganze starte (USB anschließe) Piept der Buzzer bis er die ersten Daten erfasst hat dauerhaft (ziemlich unangenehm :)). Das dauert so ca 15-20 Sekunden. Meine "Vorgesetzte" guckt schon ganz böse. Kann man das umgehen?

LG Philipp

Hi

Da der Buzzer jedes Mal 1 Sekunde (buzzertime 1000 ms) ertönt - wird die ersten 15...20 Prüfungen immer wieder was Neues/eine Veränderung erkannt?

Wenn diese Zeit fest ist - warum nicht die ersten 30 Sekunden seit Programmstart den Buzzer stumm schalten? Vll. nur ein übergehen des Fehler - aber für 49 Tage sollte Das klappen ;) (wenn man bei jeder Prüfung danach die Sperrzeit mit anhebt, also, daß Diese gerade vergangen ist, sollte Das auch nach dem Überlauf von millis() noch klappen.

MfG

Wie würde ich das so einfügen können, mit der 30sek Pause?

Alt:

if (subcountme != subcountmeOld) { // 30 Sekunden

Neu:

if (subcountme != subcountmeOld && millis() > (30*1000UL)) { // 30 Sekunden

Gruß Tommy

Leider hat das nicht geholfen :/

Dann erhöhe mal die 30. Ansonsten lerne programmieren. Ohne das System auf dem Prüfstand zu haben, macht das keinen Spaß.

Gruß Tommy

Hi

Was für einen Buzzer hast Du und wie wird Dieser angesteuert? Wenn Der bei HIGH laut ist und bei LOW leise, dann schau, daß der Ausgangs-Pin die ersten 30 Sekunden nicht angefasst wird. (Gleiches auch für den Fall, daß HIGH und LOW getauscht sind - einfach im setup() auf AUS stellen und die ersten 30 Sekunden auch so lassen)

Etwas Mitdenken darfst Du hier nämlich auch - nur gebratene Tauben in den Arduino quetschen ist ja auch bisschen eintönig, wa?

MfG

Heute Morgen habe ich den Buzzerpin von D4 auf D8 geändert und auch die 30 Sekunden Pause wieder aus dem Code entfernt. Es funktioniert jetzt, der Buzzer bleibt beim gesamten Startvorgang aus und piept ein mal kurz wenn er den ersten Wert empfängt. Darüber freue ich mich natürlich, eventuell hat ja jemand eine Erklärung dafür. Gibt es einen Unterschied zwischen dem D4 und dem D8 Pin?

LG und nochmals danke.

Das Thema macht echt Spaß, ich denke ich werde mir dafür etwas Lektüre besorgen. :-)