Ich bräuchte hilfe bei der anderung an diesesm code

ich würde gerne den intervall ändern , in der er sich neue daten von youtube holt .

aslo das er meinet wegen alle 5 minnuten online sich die neuen daten abholt .

ich danke schohnmal im voraus .

/*
  ESP-01 pinout:

  GPIO 2 - DataIn
  GPIO 1 - LOAD/CS
  GPIO 0 - CLK

  ------------------------
  NodeMCU 1.0 pinout:

  D8 - DataIn
  D7 - LOAD/CS
  D6 - CLK
*/


#include "Arduino.h"
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>

#define NUM_MAX 4
#define ROTATE 90

// for ESP-01 module
//#define DIN_PIN 2 // D4
//#define CS_PIN  3 // D9/RX
//#define CLK_PIN 0 // D3

// for NodeMCU 1.0
#define DIN_PIN 15  // D8
#define CS_PIN  13  // D7
#define CLK_PIN 12  // D6

#include "max7219.h"
#include "fonts.h"

// =======================================================================
// Your config below!
// =======================================================================
const char* ssid     = "SSid";               // SSID of local network
const char* password = "Password";             // Password on network
String ytApiV3Key = "your api";                // YouTube Data API v3 key generated here: https://console.developers.google.com
String channelId = "channelid";   // YT channel id
long utcOffset = 1;                              // for deutschland berlin
// =======================================================================

void setup() 
{
  Serial.begin(115200);
  initMAX7219();
  sendCmdAll(CMD_SHUTDOWN,1);
  sendCmdAll(CMD_INTENSITY,0);
  Serial.print("Connecting WiFi ");
  WiFi.begin(ssid, password);
  printStringWithShift(" WiFi ...~",15,font,' ');
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print("."); delay(500);
  }
  Serial.println("");
  Serial.print("Connected: "); Serial.println(WiFi.localIP());
  Serial.println("Getting data ...");
  printStringWithShift(" YT ...~",15,font,' ');
}
// =======================================================================

long viewCount, viewCount24h=-1, viewsGain24h;
long subscriberCount, subscriberCount1h=-1, subscriberCount24h=-1, subsGain1h=0, subsGain24h=0;
long videoCount;
int cnt = 0;
unsigned long time1h, time24h;
long localEpoc = 0;
long localMillisAtUpdate = 0;
int h, m, s;
String date;

void loop()
{
  if(cnt<=0) {
    if(getYTData()==0) {
      cnt = 1;  // data is refreshed every 50 loops
      if(subscriberCount1h<0) {
        time1h = time24h = millis();
        subscriberCount1h = subscriberCount24h = subscriberCount;
        viewCount24h = viewCount;
      }
      if(millis()-time1h>1000*60*60) {
        time1h = millis();
        subscriberCount1h = subscriberCount;
      }
      if(millis()-time24h>1000*60*60*24) {
        time24h = millis();
        subscriberCount24h = subscriberCount;
        viewCount24h = viewCount;
      }
      subsGain1h = subscriberCount-subscriberCount1h;
      subsGain24h = subscriberCount-subscriberCount24h;
      viewsGain24h = viewCount-viewCount24h;
    }
  }
  cnt--;
  updateTime();
  int del = 3000;
  int scrollDel = 20;
  char txt[10];
  sprintf(txt,"    %02d:%02d  ",h,m);
  printStringWithShift(txt,scrollDel,font,' '); // real time
  delay(del);
  
  printStringWithShift("  Subscribers: ",scrollDel,font,' '); // eng
  //printStringWithShift("  Subskrybcje: ",scrollDel,font,' '); // pol
  printValueWithShift(subscriberCount,scrollDel,0);
  delay(del);
  if(subsGain1h) {
    printStringWithShift("  Subscribers gain 1h: ",scrollDel,font,' '); // eng
    //printStringWithShift("  Przyrost subskrybcji 1h: ",scrollDel,font,' '); // pol
    printValueWithShift(subsGain1h,scrollDel,1);
    delay(del);
  }
  if(subsGain24h) {
    printStringWithShift("  Subscribers gain 24h: ",scrollDel,font,' '); // eng
    //printStringWithShift("  Przyrost subskrybcji 24h: ",scrollDel,font,' '); // pol
    printValueWithShift(subsGain24h,scrollDel,1);
    delay(del);
  }
  printStringWithShift("  Views: ",scrollDel,font,' '); // eng
  //printStringWithShift("  Wyświetlenia: ",scrollDel,font,' '); // pol
  printValueWithShift(viewCount,scrollDel,0);
  delay(del);
  if(viewsGain24h) {
    printStringWithShift("  Subscribers gain 24h: ",scrollDel,font,' '); // eng
    //printStringWithShift("  Przyrost wyświetleń 24h: ",scrollDel,font,' '); // pol
    printValueWithShift(subsGain24h,scrollDel,1);
    delay(del);
  }
  printStringWithShift("  Videos: ",scrollDel,font,' '); // eng
  //printStringWithShift("  Filmy: ",scrollDel,font,' '); // pol
  printValueWithShift(videoCount,scrollDel,0);
  delay(del);
}
// =======================================================================

int dualChar = 0;

unsigned char convertPolish(unsigned char _c)
{
  unsigned char c = _c;
  if(c==196 || c==197 || c==195) {
    dualChar = c;
    return 0;
  }
  if(dualChar) {
    switch(_c) {
      case 133: c = 1+'~'; break; // 'ą'
      case 135: c = 2+'~'; break; // 'ć'
      case 153: c = 3+'~'; break; // 'ę'
      case 130: c = 4+'~'; break; // 'ł'
      case 132: c = dualChar==197 ? 5+'~' : 10+'~'; break; // 'ń' and 'Ą'
      case 179: c = 6+'~'; break; // 'ó'
      case 155: c = 7+'~'; break; // 'ś'
      case 186: c = 8+'~'; break; // 'ź'
      case 188: c = 9+'~'; break; // 'ż'
      //case 132: c = 10+'~'; break; // 'Ą'
      case 134: c = 11+'~'; break; // 'Ć'
      case 152: c = 12+'~'; break; // 'Ę'
      case 129: c = 13+'~'; break; // 'Ł'
      case 131: c = 14+'~'; break; // 'Ń'
      case 147: c = 15+'~'; break; // 'Ó'
      case 154: c = 16+'~'; break; // 'Ś'
      case 185: c = 17+'~'; break; // 'Ź'
      case 187: c = 18+'~'; break; // 'Ż'
      default:  break;
    }
    dualChar = 0;
    return c;
  }    
  switch(_c) {
    case 185: c = 1+'~'; break;
    case 230: c = 2+'~'; break;
    case 234: c = 3+'~'; break;
    case 179: c = 4+'~'; break;
    case 241: c = 5+'~'; break;
    case 243: c = 6+'~'; break;
    case 156: c = 7+'~'; break;
    case 159: c = 8+'~'; break;
    case 191: c = 9+'~'; break;
    case 165: c = 10+'~'; break;
    case 198: c = 11+'~'; break;
    case 202: c = 12+'~'; break;
    case 163: c = 13+'~'; break;
    case 209: c = 14+'~'; break;
    case 211: c = 15+'~'; break;
    case 140: c = 16+'~'; break;
    case 143: c = 17+'~'; break;
    case 175: c = 18+'~'; break;
    default:  break;
  }
  return c;
}

// =======================================================================

int charWidth(char ch, const uint8_t *data)
{
  int len = pgm_read_byte(data);
  return pgm_read_byte(data + 1 + ch * len);
}

// =======================================================================

int showChar(char ch, const uint8_t *data)
{
  int len = pgm_read_byte(data);
  int i,w = pgm_read_byte(data + 1 + ch * len);
  scr[NUM_MAX*8] = 0;
  for (i = 0; i < w; i++)
    scr[NUM_MAX*8+i+1] = pgm_read_byte(data + 1 + ch * len + 1 + i);
  return w;
}

// =======================================================================

void printCharWithShift(unsigned char c, int shiftDelay, const uint8_t *data, int offs) 
{
  c = convertPolish(c);
  if(c < offs || c > MAX_CHAR) return;
  c -= offs;
  int w = showChar(c, data);
  for (int i=0; i<w+1; i++) {
    delay(shiftDelay);
    scrollLeft();
    refreshAll();
  }
}

// =======================================================================

void printStringWithShift(const char *s, int shiftDelay, const uint8_t *data, int offs)
{
  while(*s) printCharWithShift(*s++, shiftDelay, data, offs);
}

// =======================================================================
// printValueWithShift():
// converts int to string
// centers string on the display
// chooses proper font for string/number length
// can display sign - or +
void printValueWithShift(long val, int shiftDelay, int sign)
{
  const uint8_t *digits = digits5x7;       // good for max 5 digits
  if(val>1999999) digits = digits3x7;      // good for max 8 digits
  else if(val>99999) digits = digits4x7;   // good for max 6-7 digits
  String str = String(val);
  if(sign) {
    if(val<0) str=";"+str; else str="<"+str;
  }
  const char *s = str.c_str();
  int wd = 0;
  while(*s) wd += 1+charWidth(*s++ - '0', digits);
  wd--;
  int wdL = (NUM_MAX*8 - wd)/2;
  int wdR = NUM_MAX*8 - wdL - wd;
  //Serial.println(wd); Serial.println(wdL); Serial.println(wdR);
  s = str.c_str();
  while(wdL>0) { printCharWithShift(':', shiftDelay, digits, '0'); wdL--; }
  while(*s) printCharWithShift(*s++, shiftDelay, digits, '0');
  while(wdR>0) { printCharWithShift(':', shiftDelay, digits, '0'); wdR--; }
}

// =======================================================================

const char *ytHost = "googleapi";

int getYTData()
{
  WiFiClientSecure client;
  Serial.print("connecting to "); Serial.println(ytHost);
  if (!client.connect(ytHost, 443)) {
    Serial.println("connection failed");
    return -1;
  }
  String cmd = String("GET /youtube/v3/channels?part=statistics&id=") + channelId + "&key=" + ytApiV3Key+ " HTTP/1.1\r\n" +
                "Host: " + ytHost + "\r\nUser-Agent: ESP8266/1.1\r\nConnection: close\r\n\r\n";
  client.print(cmd);

  int repeatCounter = 10;
  while (!client.available() && repeatCounter--) {
    Serial.println("y."); delay(500);
  }
  String line,buf="";
  int startJson=0, dateFound=0;
  while (client.connected() && client.available()) {
    line = client.readStringUntil('\n');
    if(line[0]=='{') startJson=1;
    if(startJson) {
      for(int i=0;i<line.length();i++)
        if(line[i]=='[' || line[i]==']') line[i]=' ';
      buf+=line+"\n";
    }
    if(!dateFound && line.startsWith("Date: ")) {
      dateFound = 1;
      date = line.substring(6, 22);
      h = line.substring(23, 25).toInt();
      m = line.substring(26, 28).toInt();
      s = line.substring(29, 31).toInt();
      localMillisAtUpdate = millis();
      localEpoc = (h * 60 * 60 + m * 60 + s);
    }
  }
  client.stop();

  DynamicJsonBuffer jsonBuf;
  JsonObject &root = jsonBuf.parseObject(buf);
  if (!root.success()) {
    Serial.println("parseObject() failed");
    printStringWithShift("json error!",30,font,' ');
    delay(10);
    return -1;
  }
  viewCount       = root["items"]["statistics"]["viewCount"];
  subscriberCount = root["items"]["statistics"]["subscriberCount"];
  videoCount      = root["items"]["statistics"]["videoCount"];
  return 0;
}

// =======================================================================

void updateTime()
{
  long curEpoch = localEpoc + ((millis() - localMillisAtUpdate) / 1000);
  long epoch = round(curEpoch + 3600 * utcOffset + 86400L) % 86400L;
  h = ((epoch  % 86400L) / 3600) % 24;
  m = (epoch % 3600) / 60;
  s = epoch % 60;
}

// =======================================================================

Hallo,
komisches Programm , so alles hab ich da nicht verstanden, ist Dir die Zeit jetzt zu kurz ?
setze mal cnt=50 da rein mal sehen was dann passiert
Heinz

Wenn da mal nicht schon jemand am Sketch "rumgeschraubt" hat :wink:

Die If-Clause (cnt <=0) wird beim ersten Mal durchlaufen, dabei werden Daten von youtube geholt, cnt (hier auf 1 gesetzt ?!?!?) und hinter dem If wird cnt-- ausgeführt ...

Das macht m.E. in Verbindung mit dem Kommentar nur Sinn, wenn da vorher mal "cnt = 50;" stand.

Insgesamt ein Sketch, der wohl Daten eines vorgegebenen youtube Kanals ausliest und die Differenzen stündlich und 24-stündlich errechnet und auf einem max7219-Display ausgibt.

Die Berechnungen finden nur stündlich und 24-stündlich statt. Häufigeres Abholen führt -soweit ich das auf die Schnelle sehe - nur bei der Anzeige, wieviele "Views" auf dem Kanal bisher am aktuellen Tag dazugekommen sind, zu Änderungen.

Mit cnt = 50; müsste es langsamer werden; selbst das erscheint mir ziemlich häufig zu sein; wie lange ein loop() dauert, konnte ich auf die Schnelle nicht erkennen. Ich würde aber das cnt sonst gegen eine (millis() - ...) ersetzen ... ungefähr so:

Diesen Teil

void loop()
{
  if(cnt<=0) {

ersetzen durch

void loop()
{
  static unsigned long LetzesAbholen = 0;
  if(millis()-LetztesAbholen >= 5*60*1000) {
       LetztesAbholen = millis();

Wobei die 5 * 60 * 1000 folgendes bedeuten: 5 Minuten x 60 Sekunden x 1000 Millisekunden.
Eine Stunde würde man demgemäß als 60 * 60 * 1000 (60 Minuten x 60 Sekunden x 1000 Millisekunden) festlegen.

danke für die info , ich hab es mal probiert und werde es heute abend testne ob der loop schneller ist

Also schneller wird der Durchlauf so nicht. Ich habe mal den loop() auf seine Verzögerungen reduziert, das sieht dann so aus:

void loop()
{
  if(cnt<=0) {
    if(getYTData()==0) {
      cnt = 1;  // data is refreshed every 50 loops <-Das stimmt so nicht!
				// Mit cnt = 1 wird bei !jedem! Durchlauf "refreshed"
	  ... 
      
    }
  }
  cnt--;      // Bei cnt = 1 wird hier cnt = 0 und 
			  // und damit geht es oben wieder in die if-Bedingung
  updateTime();   // Das beötigt kaum Zeit
  
  int del = 3000;  // Hier wird ein entscheidender Verzögerungswert
				   // gesetzt, damit man das Display ablesen kann
				   // del = 3000 entspricht 3 Sekunden
  // Hier wird die Zeit angezeigt  
  // und bleibt 3 Sekunden stehen
  delay(del);
 
  // Hier wird die Subscriber-Anzahl angezeigt  
  // und bleibt 3 Sekunden stehen
  delay(del);

  if(subsGain1h) {
    // Falls es in der letzten Stunde zusätzliche Subscriber gab
	// wird der Zuwachs angezeigt
    // und bleibt 3 Sekunden stehen
    delay(del);
  }
  if(subsGain24h) {
    // Falls es in den letzten 24-Stunden seit Starten des Programms zusätzliche Subscriber gab
	// wird der Zuwachs angezeigt
    // und bleibt 3 Sekunden stehen
    delay(del);
  }
  // Hier wird die Anzahl der Aufrufe (Views) angezeigt  
  // und bleibt 3 Sekunden stehen
  delay(del);
  if(viewsGain24h) {
    // Falls es in den letzten 24-Stunden seit Starten des Programms zusätzliche Aufrufe (Views) gab
	// wird der Zuwachs angezeigt
    // und bleibt 3 Sekunden stehen
    delay(del);
  }
  // Hier wird die Anzahl der Videos angezeigt  
  // und bleibt 3 Sekunden stehen
  delay(del);
}

Zusammengefasst für cnt = 1:

  • Im schnellsten Fall sind 4 delays() aktiv -> 4 * 3 Sekunden = alle 12 Sekunden ein Durchlauf
  • Wenn alle Anzeigen aktualisiert werden -> 7 * 3 Sekunden = alle 21 Sekunden ein Durchlauf

Die Zeit für den Durchlauf von getYTData(), also dem Abruf der youtube-Daten, ist dabei nicht berücksichtigt, aber vermutlich vernachlässigbar.

Ich glaube, den Ursprung gefunden zu haben, aus dem sich der o.a. Sketch entwickelt hat:

https://gist.github.com/praeclarum/69ba4e89ad0e32a1998e3a93330561e1

Allerdings wird dort das Refresh nur alle 10 Minuten aufgerufen.

Möglicherweise gibt es auch einen guten Grund nicht zu häufig aufzurufen:

Siehe https://developers.google.com/youtube/v3/getting-started

und dort insbesondere

image

Es gibt also unterschiedliche "Kosten" für verschiedene Zugriffe; die Gesamtsumme ist begrenzt. Allerdings sind Leseaufrufe kostengünstig (1 unit). Der Default quota-Wert pro Tag liegt wohl bei 10.000/Tag. Liest man nur, wären das 24 x 60 x 60 Sekunden /10.000 Abrufe = alle 8.64 Sekunden ein Abruf.

Das ändert sich aber auch, wenn man Suchabfragen und Video-Uploads durchführt, da diese jeweils dem User zugeordnet und von seiner/ihrer Quota abgezogen werden ...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.