Загрузка счётчика подписчиков останавливается на Getting SSL OK!

Добрый день. Собрал счётчик подписчиков ютуб AlexGyver.
Загружается до Getting SSL OK! и всё. Ему писал - не отвечает. Где мог рылся в нете, ничего не нашёл. Не сможете подсказать где беда?

Если вы писали код так же как задаете вопрос, изначальная проблема далеко не в коде… которого вы не показали, как и схему …

Очевидно, что в Вашем отношении к делу.

Где схема? Где скетч? Где внятное объяснение, что происходит? В … этой … как её …? Вот, и беда там же!

@ЕвгенийП Да как вы посмели усомниться в схеме и коде алекса ???

1 лайк

Господь с Вами, даже в мыслях не имел. Просто хотелось бы посмотреть, поучиться, да и в советах ТСу на номера строк ссылаться хоцца :frowning:

Я первый раз на этом форуме, откуда я сразу знать могу, что нужно. Я вообще не очень рассчитывал, что ответят. Сын попросил сделать счётчик - сделал на bin прошивке через флешер, всё работает отлично. Теперь жена его просит, хочу сделать другой и тут застрял на на этом SSL. Я вообще то в адруино баран конечно, но тут вроде готовая прошивка. Так что ругаться смысла нет, а если возможно помогите.

/* Счётчик подписчиков канала YouTube
  by AlexGyver
  2017
  Реализовано: подключение к wifi с возможностью восстановить подключение, если оно было разорвано (без перезагрузки)
  Получение отпечатка SSL сертификата (запрос идёт каждый раз, когда не получается подключиться к google.api)
  Из ответа google.api получаем число подписчиков с любым количеством знаков (идёт отсечка по символу ")
  Запаздывающий фильтр обеспечивает плавную смену цвета с периодом 15 минут
*/
//-----------НАСТРОЙКИ-------------
const char* ssid = "";           // имя wifi роутера / точки доступа
const char* password = "";     // пароль wifi роутера / точки доступа
String channel_ID = "";  // ID канала (копировать из строки адреса канала)
String API_key = "";  // API ключ аккаунта канала (как получить: https://www.slickremix.com/docs/get-api-key-for-youtube/ )
int max_gain = 100;   // число подписок в час, при котором цвет станет красным
//-----------НАСТРОЙКИ-------------

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
String host;
String httpsFingerprint = "";
String payload, sub_string;
int delta, color, brightness;
int mid_s, max_s;
int R, G, B;
int start_point, end_point;
float delta_f = 0.0;
float K = 0.97, k;
byte tries;
int i = 0, j = 0, httpCode;
unsigned long subscribers, new_subscribers = 0;
boolean display_mode = true, wifi_connect = false;
boolean start_flag = true;
const char compare[] = "erCount";
unsigned long last_check, last_color, last_Submins, last_BL, last_mode, wifi_try;
HTTPClient http;

unsigned long delta_hour[60], delta_day[24], total_hour_subs, total_day_subs;
unsigned long minute_subs;
unsigned long last_minute;
byte minutes = 0, hours = 0;
unsigned long min_step = 3;    // считать прирост за указанное число минут

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

//---- настрйока пинов-----
#define ledR 14
#define ledG 13
#define ledB 12
#define BL_pin 16
//---- настрйока пинов-----

void setup () {
  ESP.wdtDisable();
  ESP.wdtEnable(WDTO_8S);
  host = "https://www.googleapis.com/youtube/v3/channels?part=statistics&key=" + API_key + "&id=" + channel_ID;
  Serial.begin(115200);
  pinMode(A0, INPUT);
  pinMode(ledR, OUTPUT);
  pinMode(ledG, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(BL_pin, OUTPUT);
  Wire.begin(5, 4);
  analogWrite(BL_pin, 1023);

  lcd.init();
  lcd.display();
  lcd.backlight();
}

void get_color() {
  color = delta_f * 10;
  if (color <= mid_s) {
    k = map(color, 0, mid_s, 0, 1023);
    B = 1023 - k;
    G = k;
    R = 0;
  }
  if (color > mid_s) {
    k = map(color, mid_s, max_s, 0, 1023);
    if (k > 1023) k = 1023;
    B = 0;
    G = 1023 - k;
    R = k;
  }
}

// Функция поулчения свежего SSL отпечатка
void getSSL_fp() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Getting SSL");
  if (WiFi.status() == WL_CONNECTED) {
    i = 0;
    httpCode = 0;
    payload = "";
    http.begin("http://alexgyver.ru/get_SSL_fp.php");
    httpCode = http.GET();
    if (httpCode > 0) {
      payload = http.getString();
      lcd.setCursor(12, 0);
      lcd.print("OK!");
    } else {
      lcd.setCursor(12, 0);
      lcd.print("fail");
    }
    http.end();
    httpsFingerprint = "";
    if (payload.length() > 0) {
      httpsFingerprint = payload;
    }
  }
}
// функция получения числа подписок (парсим google API)
void getSubs() {
  if (WiFi.status() == WL_CONNECTED) {
    i = 0;
    httpCode = 0;
    payload = "";
    http.begin(host, httpsFingerprint);
    httpCode = http.GET();
    if (httpCode > 0) {
      tries = 0;
      payload = http.getString();
    } else {
      tries++;
      if (tries > 2) {
        tries = 0;
        getSSL_fp();
      }
    }
    http.end();

    if (payload.length() > 0) {
      i = 0;
      j = 0;
      while (i < payload.length()) {
        if (payload[i] == compare[j]) {
          j++;
        } else j = 0;
        if (j == 6) {
          sub_string = "";
          start_point = i + 6;
          for (int ii = start_point; payload[ii] != '"'; ii++) {
            sub_string += payload[ii];
          }
          new_subscribers = sub_string.toInt();
          break;
        }
        i++;
      }
    }
  }
}

void loop() {
  ESP.wdtFeed();   // покормить пёсика
  if (!wifi_connect || WiFi.status() != WL_CONNECTED) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Connecting WiFi...");
    WiFi.begin(ssid, password);
    wifi_try = millis();
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      if (millis() - wifi_try > 10000) break;
    }
    if (WiFi.status() != WL_CONNECTED) {      
      lcd.clear();
      lcd.print("Connect failed");
      delay(500);
      wifi_connect = false;
    } else {
      lcd.clear();
      lcd.print("WiFi connected");
      delay(500);
      wifi_connect = true;
    }

  }
  if (start_flag && wifi_connect) {
    getSSL_fp();
    max_gain = max_gain / (60 / min_step);  // узнать пороговое число подписок за min_step
    min_step = (long)min_step * 60000;
    mid_s = max_gain * 5;
    max_s = max_gain * 10;
    while (new_subscribers == 0) {
      getSubs();
    }
    subscribers = new_subscribers;
    minute_subs = new_subscribers;
    start_flag = false;
  }
  if (millis() - last_mode > 10000) {
    display_mode = !display_mode;
    last_mode = millis();
  }
  if (millis() - last_check > 6000 && wifi_connect) {
    getSubs();
    switch (display_mode) {
      case 0:
        lcd.clear();
        lcd.setCursor(2, 0);
        lcd.print("Subscribers:");
        lcd.setCursor(5, 1);
        lcd.print(new_subscribers);
        break;
      case 1:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Last hour:");
        lcd.setCursor(11, 0);
        lcd.print(total_hour_subs);
        lcd.setCursor(0, 1);
        lcd.print("Last day:");
        lcd.setCursor(11, 1);
        lcd.print(total_day_subs);
        break;
    }
    last_check = millis();
  }
  if (millis() - last_Submins > min_step && wifi_connect) {
    delta = (long)new_subscribers - subscribers;
    if (delta < 0) delta = 0;
    subscribers = new_subscribers;
    last_Submins = millis();
  }
  if (millis() - last_color > 3000 && wifi_connect) {
    delta_f = delta_f * K + delta * (1 - K);
    get_color();
    // отладка
    /*Serial.print("delta: "); Serial.print(delta); Serial.print(", ");
      Serial.print("delta_f: "); Serial.print(delta_f); Serial.print(", ");
      Serial.print("R: "); Serial.print(R); Serial.print(", ");
      Serial.print("G: "); Serial.print(G); Serial.print(", ");
      Serial.print("B: "); Serial.println(B);*/
    brightness = map(analogRead(A0), 140, 1024, 1023, 200);
    if (brightness > 1023) brightness = 1023;
    if (brightness < 200) brightness = 200;
    analogWrite(BL_pin, brightness);
    analogWrite(ledR, R * brightness / 1023);
    analogWrite(ledG, G * brightness / 1023);
    analogWrite(ledB, B * brightness / 1023);
    last_color = millis();
  }
  if (millis() - last_minute > 60000 && wifi_connect) {
    delta_hour[minutes] = (long)new_subscribers - minute_subs;
    if (delta_hour[minutes] < 0) delta_hour[minutes] = 0;
    minute_subs = new_subscribers;
    total_hour_subs = 0;
    for (int i = 0; i < 59; i++) {
      total_hour_subs += delta_hour[i];
    }
    delta_day[hours] = total_hour_subs;
    total_day_subs = 0;
    for (int i = 0; i < 23; i++) {
      total_day_subs += delta_day[i];
    }
    minutes++;
    if (minutes > 59) {
      minutes = 0;
      hours++;
      if (hours > 23) hours = 0;
    }
    last_minute = millis();
  }
}

Счётчик подписчиков YouTube канала своими руками | AlexGyver



Скетч грузится без проблем.

у него сайт не отдаёт сертификат, страница удалена

1 лайк

Оригинально )))

    if (httpCode > 0) {
      payload = http.getString();
      lcd.setCursor(12, 0);
      lcd.print("OK!");
1 лайк

не даром жеж на него наезжают, небрежность - характерная черта его скетчей

Я конечно извиняюсь, так что надо сделать то, чтобы заработало?

видимо загрузить сертификат самому, ручками, может этот подойдёт? не проверял…

-----BEGIN CERTIFICATE-----
MIIOXjCCDUagAwIBAgIRAJvTi4ymgasVEJbyzx/HFhUwDQYJKoZIhvcNAQELBQAw
RjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBM
TEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjQwMzA0MDYzNTUwWhcNMjQwNTI3
MDYzNTQ5WjAXMRUwEwYDVQQDDAwqLmdvb2dsZS5jb20wWTATBgcqhkjOPQIBBggq
hkjOPQMBBwNCAAS9VfgCwrch13iVZHQaPOazb5MECTnYCSt9PxKUzgYAWOOwkcEW
cSUIviLg9MiWf27CxrEc4tPqFNBOW80Lgw+Ao4IMPzCCDDswDgYDVR0PAQH/BAQD
AgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYE
FGlF31xjdtDWQ3P+QIigufF3sH4lMB8GA1UdIwQYMBaAFIp0f6+Fze6VzT2c0OJG
FPNxNR0nMGoGCCsGAQUFBwEBBF4wXDAnBggrBgEFBQcwAYYbaHR0cDovL29jc3Au
cGtpLmdvb2cvZ3RzMWMzMDEGCCsGAQUFBzAChiVodHRwOi8vcGtpLmdvb2cvcmVw
by9jZXJ0cy9ndHMxYzMuZGVyMIIJ7wYDVR0RBIIJ5jCCCeKCDCouZ29vZ2xlLmNv
bYIWKi5hcHBlbmdpbmUuZ29vZ2xlLmNvbYIJKi5iZG4uZGV2ghUqLm9yaWdpbi10
ZXN0LmJkbi5kZXaCEiouY2xvdWQuZ29vZ2xlLmNvbYIYKi5jcm93ZHNvdXJjZS5n
b29nbGUuY29tghgqLmRhdGFjb21wdXRlLmdvb2dsZS5jb22CCyouZ29vZ2xlLmNh
ggsqLmdvb2dsZS5jbIIOKi5nb29nbGUuY28uaW6CDiouZ29vZ2xlLmNvLmpwgg4q
Lmdvb2dsZS5jby51a4IPKi5nb29nbGUuY29tLmFygg8qLmdvb2dsZS5jb20uYXWC
DyouZ29vZ2xlLmNvbS5icoIPKi5nb29nbGUuY29tLmNvgg8qLmdvb2dsZS5jb20u
bXiCDyouZ29vZ2xlLmNvbS50coIPKi5nb29nbGUuY29tLnZuggsqLmdvb2dsZS5k
ZYILKi5nb29nbGUuZXOCCyouZ29vZ2xlLmZyggsqLmdvb2dsZS5odYILKi5nb29n
bGUuaXSCCyouZ29vZ2xlLm5sggsqLmdvb2dsZS5wbIILKi5nb29nbGUucHSCDyou
Z29vZ2xlYXBpcy5jboIRKi5nb29nbGV2aWRlby5jb22CDCouZ3N0YXRpYy5jboIQ
Ki5nc3RhdGljLWNuLmNvbYIPZ29vZ2xlY25hcHBzLmNughEqLmdvb2dsZWNuYXBw
cy5jboIRZ29vZ2xlYXBwcy1jbi5jb22CEyouZ29vZ2xlYXBwcy1jbi5jb22CDGdr
ZWNuYXBwcy5jboIOKi5na2VjbmFwcHMuY26CEmdvb2dsZWRvd25sb2Fkcy5jboIU
Ki5nb29nbGVkb3dubG9hZHMuY26CEHJlY2FwdGNoYS5uZXQuY26CEioucmVjYXB0
Y2hhLm5ldC5jboIQcmVjYXB0Y2hhLWNuLm5ldIISKi5yZWNhcHRjaGEtY24ubmV0
ggt3aWRldmluZS5jboINKi53aWRldmluZS5jboIRYW1wcHJvamVjdC5vcmcuY26C
EyouYW1wcHJvamVjdC5vcmcuY26CEWFtcHByb2plY3QubmV0LmNughMqLmFtcHBy
b2plY3QubmV0LmNughdnb29nbGUtYW5hbHl0aWNzLWNuLmNvbYIZKi5nb29nbGUt
YW5hbHl0aWNzLWNuLmNvbYIXZ29vZ2xlYWRzZXJ2aWNlcy1jbi5jb22CGSouZ29v
Z2xlYWRzZXJ2aWNlcy1jbi5jb22CEWdvb2dsZXZhZHMtY24uY29tghMqLmdvb2ds
ZXZhZHMtY24uY29tghFnb29nbGVhcGlzLWNuLmNvbYITKi5nb29nbGVhcGlzLWNu
LmNvbYIVZ29vZ2xlb3B0aW1pemUtY24uY29tghcqLmdvb2dsZW9wdGltaXplLWNu
LmNvbYISZG91YmxlY2xpY2stY24ubmV0ghQqLmRvdWJsZWNsaWNrLWNuLm5ldIIY
Ki5mbHMuZG91YmxlY2xpY2stY24ubmV0ghYqLmcuZG91YmxlY2xpY2stY24ubmV0
gg5kb3VibGVjbGljay5jboIQKi5kb3VibGVjbGljay5jboIUKi5mbHMuZG91Ymxl
Y2xpY2suY26CEiouZy5kb3VibGVjbGljay5jboIRZGFydHNlYXJjaC1jbi5uZXSC
EyouZGFydHNlYXJjaC1jbi5uZXSCHWdvb2dsZXRyYXZlbGFkc2VydmljZXMtY24u
Y29tgh8qLmdvb2dsZXRyYXZlbGFkc2VydmljZXMtY24uY29tghhnb29nbGV0YWdz
ZXJ2aWNlcy1jbi5jb22CGiouZ29vZ2xldGFnc2VydmljZXMtY24uY29tghdnb29n
bGV0YWdtYW5hZ2VyLWNuLmNvbYIZKi5nb29nbGV0YWdtYW5hZ2VyLWNuLmNvbYIY
Z29vZ2xlc3luZGljYXRpb24tY24uY29tghoqLmdvb2dsZXN5bmRpY2F0aW9uLWNu
LmNvbYIkKi5zYWZlZnJhbWUuZ29vZ2xlc3luZGljYXRpb24tY24uY29tghZhcHAt
bWVhc3VyZW1lbnQtY24uY29tghgqLmFwcC1tZWFzdXJlbWVudC1jbi5jb22CC2d2
dDEtY24uY29tgg0qLmd2dDEtY24uY29tggtndnQyLWNuLmNvbYINKi5ndnQyLWNu
LmNvbYILMm1kbi1jbi5uZXSCDSouMm1kbi1jbi5uZXSCFGdvb2dsZWZsaWdodHMt
Y24ubmV0ghYqLmdvb2dsZWZsaWdodHMtY24ubmV0ggxhZG1vYi1jbi5jb22CDiou
YWRtb2ItY24uY29tghRnb29nbGVzYW5kYm94LWNuLmNvbYIWKi5nb29nbGVzYW5k
Ym94LWNuLmNvbYIeKi5zYWZlbnVwLmdvb2dsZXNhbmRib3gtY24uY29tgg0qLmdz
dGF0aWMuY29tghQqLm1ldHJpYy5nc3RhdGljLmNvbYIKKi5ndnQxLmNvbYIRKi5n
Y3BjZG4uZ3Z0MS5jb22CCiouZ3Z0Mi5jb22CDiouZ2NwLmd2dDIuY29tghAqLnVy
bC5nb29nbGUuY29tghYqLnlvdXR1YmUtbm9jb29raWUuY29tggsqLnl0aW1nLmNv
bYILYW5kcm9pZC5jb22CDSouYW5kcm9pZC5jb22CEyouZmxhc2guYW5kcm9pZC5j
b22CBGcuY26CBiouZy5jboIEZy5jb4IGKi5nLmNvggZnb28uZ2yCCnd3dy5nb28u
Z2yCFGdvb2dsZS1hbmFseXRpY3MuY29tghYqLmdvb2dsZS1hbmFseXRpY3MuY29t
ggpnb29nbGUuY29tghJnb29nbGVjb21tZXJjZS5jb22CFCouZ29vZ2xlY29tbWVy
Y2UuY29tgghnZ3BodC5jboIKKi5nZ3BodC5jboIKdXJjaGluLmNvbYIMKi51cmNo
aW4uY29tggh5b3V0dS5iZYILeW91dHViZS5jb22CDSoueW91dHViZS5jb22CFHlv
dXR1YmVlZHVjYXRpb24uY29tghYqLnlvdXR1YmVlZHVjYXRpb24uY29tgg95b3V0
dWJla2lkcy5jb22CESoueW91dHViZWtpZHMuY29tggV5dC5iZYIHKi55dC5iZYIa
YW5kcm9pZC5jbGllbnRzLmdvb2dsZS5jb22CG2RldmVsb3Blci5hbmRyb2lkLmdv
b2dsZS5jboIcZGV2ZWxvcGVycy5hbmRyb2lkLmdvb2dsZS5jboIYc291cmNlLmFu
ZHJvaWQuZ29vZ2xlLmNughpkZXZlbG9wZXIuY2hyb21lLmdvb2dsZS5jboIYd2Vi
LmRldmVsb3BlcnMuZ29vZ2xlLmNuMCEGA1UdIAQaMBgwCAYGZ4EMAQIBMAwGCisG
AQQB1nkCBQMwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybHMucGtpLmdvb2cv
Z3RzMWMzL1FPdkowTjFzVDJBLmNybDCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB2
AO7N0GTV2xrOxVy3nbTNE6Iyh0Z8vOzew1FIWUZxH7WbAAABjghj/KgAAAQDAEcw
RQIgK9Y3sYYMtu4VytbogpPvbKG8ZNGPhcXt1tfo3BisKO8CIQCTWZxnpJpVnrHB
mWFiIKqK4PVHibUvDoUzf5gYqbVBHwB2AEiw42vapkc0D+VqAvqdMOscUgHLVt0s
gdm7v6s52IRzAAABjghj/NAAAAQDAEcwRQIgDQoPVjOtRhPBP4DHQOE0HgIRjMKw
7lWUF4DYKjWlc3ACIQDpApwpLU9U6hjLeUGjEwFzNMkTd7niI9DI9FJ/lCRIUjAN
BgkqhkiG9w0BAQsFAAOCAQEAcndF8ktdBnou+Njp4zzS4KdZrPiF7VvOc831uu3H
KxcwxMdUON4+dlHUV8bZD6WGfto7D5VVVsA2Swvvb7N3OeRnW0Tcy3YWHfptTc+I
3EVlkG7wDhVWE1kNFKAEIauaZN3KIccnOn3+Bo6dnesjS1ep6kYnb/vQUjMeTRyL
pWAWXmfR119FCjUjiarQiEXBhcdnu+H33Nd7LT+8RTgtSps0+YAQcFGs8ANrI2g5
L1dcjTc24S4j4keRz+2xL2KYUMHJkP6ryHyBjimIOV2UNzuloAoTcDmp7evJ/eU1
rE7wArdVDt2iUEtRs+RBKtj5iVD8UnNI+cENUdIANeQHbw==
-----END CERTIFICATE-----

тут читать до полной медитации

Спасибо, попробую разобраться.

да тут особо и разбираться нечего, https для шифрации передаваемой информации использует сертификаты, все они с ограниченным сроком действия, от 3-х месяцев, значит устройство должно их каким-то образом получать, Гайвер организовал это через свой сайт и пока проект пиарился оно работало, а далее вступают капиталистические законы, за всё надо платить, нести расходы смысла нет, вот он и прибил эту возможность (может есть за денежку, это сами поинтересуетесь), тут или самому оное организовать или просить организовать это какого-то приятеля )))

ТС, используй другой адрес: http://old.alexgyver.ru/get_SSL_fp.php
И всё будет у тебя работать (наверное, я не проверял).

47:5A:64:7D:9F:47:34:07:31:91:97:F7:04:42:7A:D5:EA:AD:07:4E

Спойлер
/* Счётчик подписчиков канала YouTube
  by AlexGyver
  2017
  Реализовано: подключение к wifi с возможностью восстановить подключение, если оно было разорвано (без перезагрузки)
  Получение отпечатка SSL сертификата (запрос идёт каждый раз, когда не получается подключиться к google.api)
  Из ответа google.api получаем число подписчиков с любым количеством знаков (идёт отсечка по символу ")
  Запаздывающий фильтр обеспечивает плавную смену цвета с периодом 15 минут
*/
//-----------НАСТРОЙКИ-------------
const char* ssid = "";           // имя wifi роутера / точки доступа
const char* password = "";     // пароль wifi роутера / точки доступа
String channel_ID = "";  // ID канала (копировать из строки адреса канала)
String API_key = "";  // API ключ аккаунта канала (как получить: https://www.slickremix.com/docs/get-api-key-for-youtube/ )
int max_gain = 100;   // число подписок в час, при котором цвет станет красным
//-----------НАСТРОЙКИ-------------

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
String host;
String httpsFingerprint = "";
String payload, sub_string;
int delta, color, brightness;
int mid_s, max_s;
int R, G, B;
int start_point, end_point;
float delta_f = 0.0;
float K = 0.97, k;
byte tries;
int i = 0, j = 0, httpCode;
unsigned long subscribers, new_subscribers = 0;
boolean display_mode = true, wifi_connect = false;
boolean start_flag = true;
const char compare[] = "erCount";
unsigned long last_check, last_color, last_Submins, last_BL, last_mode, wifi_try;
HTTPClient http;

unsigned long delta_hour[60], delta_day[24], total_hour_subs, total_day_subs;
unsigned long minute_subs;
unsigned long last_minute;
byte minutes = 0, hours = 0;
unsigned long min_step = 3;    // считать прирост за указанное число минут

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

//---- настрйока пинов-----
#define ledR 14
#define ledG 13
#define ledB 12
#define BL_pin 16
//---- настрйока пинов-----

void setup () {
  ESP.wdtDisable();
  ESP.wdtEnable(WDTO_8S);
  host = "https://www.googleapis.com/youtube/v3/channels?part=statistics&key=" + API_key + "&id=" + channel_ID;
  Serial.begin(115200);
  pinMode(A0, INPUT);
  pinMode(ledR, OUTPUT);
  pinMode(ledG, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(BL_pin, OUTPUT);
  Wire.begin(5, 4);
  analogWrite(BL_pin, 1023);

  lcd.init();
  lcd.display();
  lcd.backlight();
}

void get_color() {
  color = delta_f * 10;
  if (color <= mid_s) {
    k = map(color, 0, mid_s, 0, 1023);
    B = 1023 - k;
    G = k;
    R = 0;
  }
  if (color > mid_s) {
    k = map(color, mid_s, max_s, 0, 1023);
    if (k > 1023) k = 1023;
    B = 0;
    G = 1023 - k;
    R = k;
  }
}

// Функция поулчения свежего SSL отпечатка
void getSSL_fp() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Getting SSL");
  if (WiFi.status() == WL_CONNECTED) {
    i = 0;
    httpCode = 0;
    payload = "";
    http.begin("http://old.alexgyver.ru/get_SSL_fp.php");
    httpCode = http.GET();
    if (httpCode > 0) {
      payload = http.getString();
      lcd.setCursor(12, 0);
      lcd.print("OK!");
    } else {
      lcd.setCursor(12, 0);
      lcd.print("fail");
    }
    http.end();
    httpsFingerprint = "";
    if (payload.length() > 0) {
      httpsFingerprint = payload;
    }
  }
}
// функция получения числа подписок (парсим google API)
void getSubs() {
  if (WiFi.status() == WL_CONNECTED) {
    i = 0;
    httpCode = 0;
    payload = "";
    http.begin(host, httpsFingerprint);
    httpCode = http.GET();
    if (httpCode > 0) {
      tries = 0;
      payload = http.getString();
    } else {
      tries++;
      if (tries > 2) {
        tries = 0;
        getSSL_fp();
      }
    }
    http.end();

    if (payload.length() > 0) {
      i = 0;
      j = 0;
      while (i < payload.length()) {
        if (payload[i] == compare[j]) {
          j++;
        } else j = 0;
        if (j == 6) {
          sub_string = "";
          start_point = i + 6;
          for (int ii = start_point; payload[ii] != '"'; ii++) {
            sub_string += payload[ii];
          }
          new_subscribers = sub_string.toInt();
          break;
        }
        i++;
      }
    }
  }
}

void loop() {
  ESP.wdtFeed();   // покормить пёсика
  if (!wifi_connect || WiFi.status() != WL_CONNECTED) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Connecting WiFi...");
    WiFi.begin(ssid, password);
    wifi_try = millis();
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      if (millis() - wifi_try > 10000) break;
    }
    if (WiFi.status() != WL_CONNECTED) {
      lcd.clear();
      lcd.print("Connect failed");
      delay(500);
      wifi_connect = false;
    } else {
      lcd.clear();
      lcd.print("WiFi connected");
      delay(500);
      wifi_connect = true;
    }

  }
  if (start_flag && wifi_connect) {
    getSSL_fp();
    max_gain = max_gain / (60 / min_step);  // узнать пороговое число подписок за min_step
    min_step = (long)min_step * 60000;
    mid_s = max_gain * 5;
    max_s = max_gain * 10;
    while (new_subscribers == 0) {
      getSubs();
    }
    subscribers = new_subscribers;
    minute_subs = new_subscribers;
    start_flag = false;
  }
  if (millis() - last_mode > 10000) {
    display_mode = !display_mode;
    last_mode = millis();
  }
  if (millis() - last_check > 6000 && wifi_connect) {
    getSubs();
    switch (display_mode) {
      case 0:
        lcd.clear();
        lcd.setCursor(2, 0);
        lcd.print("Subscribers:");
        lcd.setCursor(5, 1);
        lcd.print(new_subscribers);
        break;
      case 1:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Last hour:");
        lcd.setCursor(11, 0);
        lcd.print(total_hour_subs);
        lcd.setCursor(0, 1);
        lcd.print("Last day:");
        lcd.setCursor(11, 1);
        lcd.print(total_day_subs);
        break;
    }
    last_check = millis();
  }
  if (millis() - last_Submins > min_step && wifi_connect) {
    delta = (long)new_subscribers - subscribers;
    if (delta < 0) delta = 0;
    subscribers = new_subscribers;
    last_Submins = millis();
  }
  if (millis() - last_color > 3000 && wifi_connect) {
    delta_f = delta_f * K + delta * (1 - K);
    get_color();
    // отладка
    /*Serial.print("delta: "); Serial.print(delta); Serial.print(", ");
      Serial.print("delta_f: "); Serial.print(delta_f); Serial.print(", ");
      Serial.print("R: "); Serial.print(R); Serial.print(", ");
      Serial.print("G: "); Serial.print(G); Serial.print(", ");
      Serial.print("B: "); Serial.println(B);*/
    brightness = map(analogRead(A0), 140, 1024, 1023, 200);
    if (brightness > 1023) brightness = 1023;
    if (brightness < 200) brightness = 200;
    analogWrite(BL_pin, brightness);
    analogWrite(ledR, R * brightness / 1023);
    analogWrite(ledG, G * brightness / 1023);
    analogWrite(ledB, B * brightness / 1023);
    last_color = millis();
  }
  if (millis() - last_minute > 60000 && wifi_connect) {
    delta_hour[minutes] = (long)new_subscribers - minute_subs;
    if (delta_hour[minutes] < 0) delta_hour[minutes] = 0;
    minute_subs = new_subscribers;
    total_hour_subs = 0;
    for (int i = 0; i < 59; i++) {
      total_hour_subs += delta_hour[i];
    }
    delta_day[hours] = total_hour_subs;
    total_day_subs = 0;
    for (int i = 0; i < 23; i++) {
      total_day_subs += delta_day[i];
    }
    minutes++;
    if (minutes > 59) {
      minutes = 0;
      hours++;
      if (hours > 23) hours = 0;
    }
    last_minute = millis();
  }
}

Наверное, нужно ту часть вот так переписать (только я не уверен):

if (httpCode > 0 && (httpCode != 403 || httpCode != 404 || httpCode != 502 || httpCode != 503)) { // Самые популярные ошибки?
      payload = http.getString();
      lcd.setCursor(12, 0);
      lcd.print("OK!");
} else {
      lcd.setCursor(12, 0);
      lcd.print("fail");
}

теперь народ знает. кто сайт Гайверу пишет )))

Не более чем везение…

Спасибо большое. Завтра буду пробовать.

Ни фига не идёт. Долбанный SSL. Теперь пишет SSL feil

Код то покажи последний.