WI-FI интернет радио.

10427 ответов [Последнее сообщение]
4ivan
Offline
Зарегистрирован: 18.02.2018

Спасибо, модуль купил, даташит запросил, у меня один вопрос остался, подскажите, мне нужно ставить 1К резисторы по сигнальным шинам, чтобы не спалить ЕСП32 или и так сойдет? ) Этот преобразователь, он увеличивает напряжение для "1" на выходе для 5В логики? это не испортит ЕСП32?

ShAlex13
Offline
Зарегистрирован: 19.01.2018

В качестве идеи: интересно бы было кнопки управления перенести на тач. экрана. Нет таких вариантов?

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

ShAlex13 пишет:

В качестве идеи: интересно бы было кнопки управления перенести на тач. экрана. Нет таких вариантов?

https://github.com/schreibfaul1/ESP32-MiniWebRadio

Я правда экранчик спалил (печалька, второй уже), пока паузу взял (пока посылка идет), но проект довольно интересный. 

ShAlex13
Offline
Зарегистрирован: 19.01.2018

pilnikov пишет:

Я правда экранчик спалил (печалька, второй уже), пока паузу взял (пока посылка идет), но проект довольно интересный. 

Интересный проект. Вы уже пробовали с ним работать?

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

Пробовал - экранчик сжег. Надо паять все на макетке, а не проводками на соплях. И питалово....

ShAlex13
Offline
Зарегистрирован: 19.01.2018

pilnikov пишет:

Пробовал - экранчик сжег. Надо паять все на макетке, а не проводками на соплях. И питалово....

Такой экран https://ru.aliexpress.com/item/240x320-2-8-SPI-TFT-LCD-Touch-Panel-Serial-Port-Module-with-PCB-ILI9341-5V-3/32824451184.html?spm=2114.13010708.0.0.15c433ed74LiWd

с SD слотом подойдет? Просто есть у меня такой в наличии :) Я так понял файлы с папки Content_on_SD_Card надо на SD карту закидывать

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

да пойдет. У меня на красной плате vs1053 тоже слот есть под сд. Я вчера промучался весь день как раз таки со стабильностью чтения этой самой карты. Карту настроил а экран спалил. (первый был как у вас, сгорел в карадио32 тоже из-за соплей и питалова).

В этом проекте экран не включился ни разу. Хотя с адафрутовскм тестом для или9341 работал. 

Звук (радиостанция) первый раз запустилась и лепетала чет там по немецки (автор - немец), потом начались траблы с резетом (его надо вешать или на 2 диода или на отдельный выход). После этого красная (красная, Карл!) плата vs1053 заткнулась напрочь даже в карадио. Думал спалил нахрен и ее. Но тест любимый, "хеллокалка", зацокал, а потом и карадио заиграло. Пришлось менять частоту инициализации (до 20кГц). Было правда при этом уже 2 часа ночи, а с утра на работу....

Еще после нажатия в морде кнопки "настройки по умолчанию" напрочь отпал вайфай, а в остальном.... прект прикольный. (вай фай в итоге работает только на IDF проектах, там гдето есть область флэшки в которую эти самые параметры вайфая записываются и теперь как то надо к ним поиметь доступ из дурины - мож кто подскажет как? еразе в даунлоад тул не помогает, перепрошивка в идф тоже)

enjoyneering
enjoyneering аватар
Offline
Зарегистрирован: 05.09.2016

в ардунино очень легко затираются параметры вайфая и калибровочные данные. всего одна команда:

ESP.eraseConfig();

 

немного подробностей - https://github.com/esp8266/Arduino/issues/1494

 

geka55
geka55 аватар
Offline
Зарегистрирован: 07.01.2018

Доброго время суток. Разобрался я со скоростями установил 28800 на esp, vs и все заработало. а заикания  звука - было плохое питание.) 

Еще небольшая проблемка с дисплеем, в строке где отображается название песни текст который не влез в строку накладывается в начале строки.  дисплей у меня oled SH1106 128x64,  1.3". Подскажите как исправить этот глюк?

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

там по идее должен быть скроллинг длинных строк. смотрите чего творится внутри функции 

void scroll()

 

 

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

конкретно смотреть длину обрабатываемой строки

 

Che_burashka
Offline
Зарегистрирован: 17.05.2018

У карадио есть клиент для Андроида. Вроде здесь еще не выкладывали

https://www.dropbox.com/s/l9m40tmheq8sjdf/karadio1.1%20%282%29.apk?dl=0

shurik12330
Offline
Зарегистрирован: 05.02.2018

Вчера внимательно изучал свои красный и синий модуль и нашел несколько отличий красной VS1053 от синей.

Во-первых, разные кварцы (в красном 12,288  МГц, в синем 12,2 МГц)

Во-вторых, свободные GPIO чипа красного модуля не все заземлены, а 33,34,36 выводы отдельно каждый своим резистором подтянут к земле, 9,10,11,12 выводы соединены между собой и все.

(По факту, в синем модуле только 33 вывод через 100 кОм на землю, а остальные в воздухе. Я их все соединял с 33-м, мне не помогало )

В-третьих, MISO и SCLK с красного модуля вообще не приходят на чип, а приходят они на SD карту.

MISO и SCLK чипа притянуты к +3,3В через 10 кОм.

И при этом красный модуль работает.

Может быть и на синем модуле отключить MISO и SCLK от ESP и подтянуть их к +3,3В?

 

ShAlex13
Offline
Зарегистрирован: 19.01.2018

shurik12330 пишет:

Вчера внимательно изучал свои красный и синий модуль и нашел несколько отличий красной VS1053 от синей.

Во-первых, разные кварцы (в красном 12,288  МГц, в синем 12,2 МГц)

Во-вторых, свободные GPIO чипа красного модуля не все заземлены, а 33,34,36 выводы отдельно каждый своим резистором подтянут к земле, 9,10,11,12 выводы соединены между собой и все.

(По факту, в синем модуле только 33 вывод через 100 кОм на землю, а остальные в воздухе. Я их все соединял с 33-м, мне не помогало )

В-третьих, MISO и SCLK с красного модуля вообще не приходят на чип, а приходят они на SD карту.

MISO и SCLK чипа притянуты к +3,3В через 10 кОм.

И при этом красный модуль работает.

Может быть и на синем модуле отключить MISO и SCLK от ESP и подтянуть их к +3,3В?

В синий ставил кварц на 12,288  МГц, не помогло.

pkmuum
Offline
Зарегистрирован: 25.03.2018

Всем снова привет!

Вмонтировал свое КаРадио на ESP8266 в корпус от абонетского громкоговорителя "Тембр-303". Трансформатор выкинул, оставил только динамик и штатный переменный резистор.

Моё видео о процессе сборки: https://youtu.be/j0_WtcEQ5zo

Использовал в качестве усилителя мощности усилитель на TDA7297, 2х15 Вт, питание 12 В., такой (просто только такой был в наличии): 

Поскольку в громкоговорителе один динамик, звук подключил с одного канала.

Подскажите как грамотно аппаратно смешать стерео   в  моно? Где смешивать, на входе или на выходе с усилка? Знания в электронике у меня только начальные))), поэтому прошу ногами не пинать))).  Мне тут на форуме один человек давал совет, но его совет касался абонентского громкоговорителя в полном комплекте, т.е. с трансформатором, а я его удалил из корпуса.

А может ничего не надо смешивать? Если использовать звук с одного канала, то какой канал правильней использовать, левый или правый? (может стандарт какой на это есть).

 

udavst
udavst аватар
Offline
Зарегистрирован: 29.11.2013

Раньше для моно был левый, теперь радиостанции этому не следуют, так что надо смешать. Смешивать проще некуда - возмите 2 резистора (я не помню, скольк там в радио, 470 Ом вроде - это не пойдёт, надо больше к, и примерно половину его с каждого из каналов. Просто Вы же громкость будете регулировать не как в радиоточке, Вам надо регулятор включить до усилка.

И да, раз Вы взяли 2хканальный усилок, да ещё по мощности превышающий динамик раз в 5, то подключайте один канал, вход второго на землю и не используйте. Все резистроны на входе, переменник  - центральный - вход, остальные земля и смеситель (2 резистора с каждого канала), выход - напрямую на динамик. Но я бы не заморачивался, а взял рекомендованный для VSки, не раз, усилок, и питание общее, и 5В хватит раскачать динамик на достаточный Вам уровень.

 

pkmuum
Offline
Зарегистрирован: 25.03.2018

Спасибо, на выходных попробую. Сейчас не могу сказать, что за сопротивление динамика, но не сказал бы что усилитель выдает чрезмерную выходную мощность, конечно больше чем надо, но особого перегруза нет, зато запас по громкости очень большой. В отличие от усилителя на PAM8403 звук более сочный и практически без помех. В большинстве случаев и один канал комфортно можно слушать, но иногда явно часть информации с соседнего канала теряется или еле слышна.

ShAlex13
Offline
Зарегистрирован: 19.01.2018

TDA7297 перевести в мостовую схему включения, сигнал смешать резисторами

pkmuum
Offline
Зарегистрирован: 25.03.2018

Спасибо! Очень наглядно.

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

Вчера частично получилось сделать вывод даты и времени на LCD 2004. Работает не совсем нормально. В какое-то время отображались названия станций, потом появились зависания и даже перезагрузки ардуино мини про. Секунды отображаются дискретно как им вздумается, дата устанавливается четко. Часовой пояс не выставляется. Вобщем, что получилось, можно увидеть на коротком видео:

https://yadi.sk/i/aqU1CfCW3W73JA

Сам скетч выглядит так:

#include <LiquidCrystalRus.h>// LiquidCrystalRus-master
#define version 1.0
#include <EEPROM.h>
#define TZO 4

#undef SERIAL_RX_BUFFER_SIZE
#define SERIAL_RX_BUFFER_SIZE 128
//#include "u8glibConf.h"
#include <EEPROM.h>
#include <time.h>
#include <avr/pgmspace.h>
// constants
const int  BAUD            = 9600;  // any standard serial value: 300 - 115200
const int  EEaddr          = 0;     // EEPROM address for storing WPM
const int  EEaddr1         = 2;     // EEPROM address for LCD address
const int  EEaddrIp        = 10;    // EEPROM address for the IP

struct tm *dt;
time_t timestamp = 0;
bool syncTime = false;
bool askDraw  = false;
bool itAskTime = true;
unsigned loopTime = 0;
unsigned loopDate = 0;

const byte ContrastPin     = 8;     // D8 low activates the Contrast adjustment

// Character array pointers
     char  msg[]       = {" Wi-Fi РАДИО на LCD"}; //
   char  msg1[]      = {"***** TOSHIBA *****"}; //
   char  blank[]     = {"                    "}; // изменил с 16 на 20
   char strsec[30];
 //  char data[]     = {(strsec,"%02d-%02d-%04d  %02d:%02d:%02d",dt->tm_mday,(dt->tm_mon)+1,dt->tm_year+1900, dt->tm_hour, dt->tm_min,dt->tm_sec)};
  //char strsec[];

// Karadio specific data
#define BUFLEN  200
#define LINES  4 //изменил с 2 на 4
char line[BUFLEN]; // receive buffer
char station[BUFLEN]; //received station
char title[BUFLEN]; // received title
char nameset[BUFLEN];
char* lline[LINES] ; // array of ptr of n lines 
int  iline[LINES] ; //array of index for scrolling
byte  tline[LINES] ;
char* ici;
unsigned index = 0;
unsigned loopcount = 0;
unsigned scrl = 0;


int x = 20;   //Width  изменил значение с 16 на 20
char temp;

 // initialize the library with the numbers of the interface pins
//LiquidCrystal_1602_RUS lcd(12, 11, 5, 4, 3, 2); // pins for RS, E, DB4, DB5, DB6, DB7
LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);
////////////////////////////////////////
// Clear all buffers and indexes
void clearAll()
{
      title[0] = 0;
      station[0]=0;
    for (int i=0;i<LINES;i++)
    {
      lline[i] = NULL;iline[i] = 0;tline[i] = 0;
       lcd.setCursor(0, i);
       lcd.print(blank);
    }
}
////////////////////////////////////////
void cleartitle()
{
     title[0] = 0;
     for (int i = 1 ;i<LINES;i++)  // clear lines
     {
        lline[i] = NULL;
        iline[i] = 0;
        tline[i] = 0; 
        lcd.setCursor(0, i);
        lcd.print(blank);
     }  
     draw();
}


////////////////////////////////////////
void eepromReadStr(int addr, char* str)
{
  byte rd;
  do {
    rd = EEPROM.read(addr++);
    *str = rd;
//    Serial.println(str[0],20); // 
    str++;
  } while (( rd != 0)&&( rd != 0xFF)); 
  *str = 0;
}

////////////////////////////////////////
void eepromWriteStr(int addr, char* str)
{
  byte rd;
  do {
    EEPROM.write( addr++,*str);
    rd = *str;
    str++;
  } while (( rd != 0)&&( rd != 0xFF)); 
  EEPROM.write( addr,0);
}


////////////////////////////////////////
// parse the karadio received line and do the job
void parse(char* line)
{
  int mul;
    // removeUtf8((byte*)line);
     
//   Serial.println(line);
 ////// Meta title
   if ((ici=strstr(line,"META#: ")) != NULL)
   {
     cleartitle(); 
     strcpy(title,ici+7);    
   lline[1] = title; 
   draw();  
   } else 
 
 ////// ICY0 station name
   if ((ici=strstr(line,"ICY0#: ")) != NULL)
   {
      int len;
      clearAll();
    if (strlen(ici+7) == 0) strcpy (station,nameset);
      else strcpy(station,ici+7);
    lline[0] = station;
    draw();
   } else
 ////// STOPPED  
   if ((ici=strstr(line,"STOPPED")) != NULL)
   {
       cleartitle();
       strcpy(title,"STOPPED");
     lline[1] = title;
         draw();  
   }    
 /////// Station Ip      
   else  
   if ((ici=strstr(line,"Station Ip: ")) != NULL) 
   {
       char oip[20];
   //Serial.println(line);
       eepromReadStr(EEaddrIp, oip);
       if ( strcmp(oip,ici+12) != 0)
         eepromWriteStr(EEaddrIp,ici+12 ); 
   }
   /////Date Time  ##SYS.DATE#: 2017-04-12T21:07:59+01:00
   if ((ici=strstr(line,"SYS.DATE#:")) != NULL)  
   {
      char lstr[30];
      if (*(ici+11) != '2')//// invalid date. try again later
      {
        askDraw = true;
        return;
      }
      strcpy(lstr,ici+11);
      dt = gmtime(&timestamp);
      int year,month,day,hour,minute,second;
      sscanf(lstr,"%04d-%02d-%02dT%02d:%02d:%02d",&(year),&(month),&(day),&(hour),&(minute),&(second));
      dt->tm_year = year; dt->tm_mon = month-1; dt->tm_mday = day;
      dt->tm_hour = hour; dt->tm_min = minute;dt->tm_sec =second;
      dt->tm_year -= 1900;
      timestamp = mktime(dt); 
      syncTime = true;
   }
}


////////////////////////////////////////
//Setup all things, check for contrast adjust and show initial page.
void setup(void) {
    char oip[20];
   Serial.begin(BAUD);
   while (!Serial) { ;}

  // set up the LCD's number of columns and rows:
  lcd.begin(20, 4); // 
  pinMode(13, OUTPUT); // led
  Serial.println(F("Free RAM available:")) ;
  Serial.print(freeRam());
  lcd.clear();
  lcd.noAutoscroll() ;

  lcd.print(msg);
  lcd.setCursor(0, 2); // 
  lcd.print(msg1);
  delay(5000); 
  clearAll();
  eepromReadStr(EEaddrIp, oip);
  lline[0] = (char*)"IP адрес:"; // 
  lline[1] = oip; // изм с 2 на 3
  draw();
delay(1000); 
}


////////////////////////////////////////
// receive the esp8266 stream
void serial()
{
    char temp;
   Serial.print(F("sys.date\r")); // Synchronise with current date & time-пильников
    while ((temp=Serial.read()) != -1)
    {
      switch (temp)
      {
        case '\n' : if (index == 0) break;
        case '\r' :
        line[index] = 0; // end of string
        index = 0;
        parse(line);
        break;
        default : // put the received char in line
        if (index>BUFLEN-1) break; // small memory so small buffer
        line[index++] = temp;
        
              }
    }
}

////////////////////////////////////////

void askTime()
{
    if (itAskTime) // 
    {
        Serial.print(F("sys.date\r")) ; 
        itAskTime = false;
    }  
}
// draw all lines
void draw()
{
  char strsec[30]; 
  dt=gmtime(&timestamp);
    lcd.clear();
    for (int i = 0 ;i < LINES;i++)
    {
      serial();
      lcd.setCursor(1, i);
      if ((lline[i] != NULL)) lcd.print(lline[i]+iline[i]);
//      delay(1);
      lcd.setCursor(0, 3);
    //  lcd.print(" 15.05.2018г  16:33");
    // sprintf(strsec,"%02d-%02d-%04d  %02d:%02d:%02d",dt->tm_mday,(dt->tm_mon)+1,dt->tm_year+1900, dt->tm_hour, dt->tm_min,dt->tm_sec);
sprintf(strsec,"%02d/%02d/%04d  %02d:%02d:%02d",dt->tm_mday,(dt->tm_mon)+1,dt->tm_year+1900, dt->tm_hour, dt->tm_min,dt->tm_sec);
lcd.print (strsec);
delay(1000);


    }
}
////////////////////////////////////////
// scroll each line
void scroll()
{
unsigned len;
  for (int i = 0;i < LINES;i++)
  {   
     if (tline[i]>0) 
     {
       if (tline[i] == 4) iline[i]= 0;
       tline[i]--;     
     } 
     else
     {
       len = strlen(lline[i]+(iline[i]));
       if (len > x) iline[i]++;
      else 
      {tline[i] = 6;}
     }
  }
  draw();
}

////////////////////////////////////////
void loop(void) {
  serial();
    if (loopcount++ == 0xffff)
    {
      loopcount = 0;
    if (++scrl%6 == 0) digitalWrite(13, HIGH);  
    scroll(); 
    digitalWrite(13, LOW);
    }
   // ntp control and first info demand
     if (loopDate>=5)
     {
         loopDate = 0;
          if (itAskTime)
          {
            if (!syncTime) // time to ntp. Don't do that in interrupt.
            {
              Serial.print(F("\rsys.tzo(\"")) ;Serial.print(TZO);
              Serial.print(F("\")\r")); 
              Serial.print(F("cli.info\r")); // Synchronise the current state   
              itAskTime = false;             
            } 
            else askTime();
          }
      }
}
/////////////////////////////////////////


 

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

259 строчка это совсем не по феншую, уберите ее совсем либо сделайте хотя бы 100

shurik12330
Offline
Зарегистрирован: 05.02.2018

Вот отличия красной платы от синей, что я нашел:

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

а фотку платы красной?

Фотку нашел. shurik12330 прозванивайте тщательней. про miso там по дорожке видно что к 30 выводу идет

И sck звонится на 29 ногу - дорожка там уходит под слот SD

ShAlex13
Offline
Зарегистрирован: 19.01.2018

to Владимир 2018

Выложи еще свой руссифицированный скетч для экрана 0.96

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

pilnikov пишет:

259 строчка это совсем не по феншую, уберите ее совсем либо сделайте хотя бы 100

Менял это значение в пределах от 1-1000. Разница есть, конечно, но все равно не работает как надо.

Еще заметил разницу в поведении между OLED-ом и LCD. Может это как-то поможет выявить причину неисправности? После включения питания и появления строки даты и времени (до синхронизации) на OLED секунды считаются 01,02,03 ...., а потом происходит синхронизация и время продолжает считаться как надо. В LCD же при включении питания время и дата также устанавливаются как и на OLED экране "по умолчанию", но при этом секунды стоят на месте 00,00,00,.... Пока не произойдет синхронизация. После синхронизации дата и время, за исключением временной зоны, устанавливаются верно, но секунды при этом не отсчитываются. То есть время замерло и стоит на месте. Если перейти на другой канал, то время вновь будет отображаться верно, но статически.

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

ShAlex13 пишет:

to Владимир 2018

Выложи еще свой руссифицированный скетч для экрана 0.96

В последней редакции с заменой местоположения даты и месяца.


#define oled096  


// your timezone offset
#define TZO 2

#undef SERIAL_RX_BUFFER_SIZE
#define SERIAL_RX_BUFFER_SIZE 128
#include "u8glibConf.h"
#include <EEPROM.h>
#include <time.h>
#include <avr/pgmspace.h>

#define PIN_PLAYING 12
#define  BAUD       9600   // any standard serial value: 300 - 115200

// nams <--> num of line
#define STATIONNAME 0
#define STATION1  1
#define STATION2  2
#define IP        3
#define GENRE     2
#define TITLE1    3
#define TITLE2    4
#define VOLUME    5


// constants
const int  EEaddr          = 0;     // EEPROM address for storing WPM
const int  EEaddr1         = 2;     // EEPROM address for LCD address
const int  EEaddrIp        = 10;    // EEPROM address for the IP

const byte ContrastPin     = 8;     // D8 low activates the Contrast adjustment



// Character array pointers
 char  msg2[]       = {"OLED_I2C_RUS_4 V1.5"}; //
//#else
// char  msg2[]     = {"lcd V1.5"}; //
//#endif
 char  msg1[]   = {"(c) Спасибо народу!"}; //
 char  msg[]   = {" Karadio"};
      
// Karadio specific data
#define BUFLEN  180
#define LINES	6
char line[BUFLEN]; // receive buffer
char station[BUFLEN]; //received station
char title[BUFLEN];	// received title
char nameset[BUFLEN/2]; // the local name of the station
char nameNum[5]; // the number of the station
char genre[BUFLEN/2]; // the local name of the station
char* lline[LINES] ; // array of ptr of n lines 
uint8_t  iline[LINES] ; //array of index for scrolling
uint8_t  tline[LINES] ;
int16_t volume;
unsigned index = 0;
unsigned loopScroll = 0;
unsigned loopDate = 0;
char oip[20];

uint16_t y ;		//Height of a line
uint16_t yy;		//Height of screen
uint16_t x ;		//Width
uint16_t z ;		// an internal offset for y

byte NOKIAcontrast;                 // LCD initialization contrast values B0 thru BF

struct tm *dt;
time_t timestamp = 0;
bool syncTime = false;
bool askDraw  = false;
bool itAskTime = true;
unsigned loopTime = 0;

////////////////////////////////////////
void u8g_prepare(void) {
  if (u8g.getWidth() == 84)
u8g.setFont(u8g_font_5x8);
  //u8g.setFont(u8g_font_04b_03br);
  else 
	u8g.setFont(u8g_font_6x13);
 // u8g.setFont(u8g_font_6x10);
 u8g.setFont(u8g_font_04b_03br);
  u8g.setFontRefHeightExtendedText();
  u8g.setDefaultForegroundColor();
  u8g.setFontPosTop();

  
}


////////////////////////////////////////
//Setup all things, check for contrast adjust and show initial page.
void setup2()
{
	clearAll();
	lline[0] = (char*)msg;
	lline[1] = (char*)msg1;
	lline[2] = (char*)msg2;
	nameNum[0]=0;
	eepromReadStr(EEaddrIp, oip);
	lline[3] = (char*)"IP:";
	lline[4] = oip;
	draw(0);
	digitalWrite(PIN_PLAYING, LOW);
}

void setTimer2()
{
  cli();//stop interrupts
  TCCR2A = 0;// set entire TCCR2A register to 0
  TCCR2B = 0;// same for TCCR2B
  TCNT2  = 0;//initialize counter value to 0
  // set compare match register for 1khz increments
  OCR2A = F_CPU/1000/64 -1;// (must be <256)
  // turn on CTC mode
  TCCR2A |= (1 << WGM21);
  // Set CS21 bit for 64 prescaler
  TCCR2B |= (1 << CS22) ;   
  // enable timer compare interrupt
  TIMSK2 |= (1 << OCIE2A);
  sei();//allow interrupts
}

void setTimer1()
{
  //set timer1 interrupt at 4Hz
  cli();//stop interrupts
  TCCR1A = 0;// set entire TCCR1A register to 0
  TCCR1B = 0;// same for TCCR1B
  TCNT1  = 0;//initialize counter value to 0
  // set compare match register for 4hz increments
//  OCR1A = 15624;// = (16*10^6) / (1*1024) - 1 (must be <65536)
  OCR1A = F_CPU/4096 -1;// = (16*10^6) / (2*1024) - 1 (must be <65536)
  // turn on CTC mode
  TCCR1B |= (1 << WGM12);
  // Set CS10 and CS12 bits for 1024 prescaler
  TCCR1B |= (1 << CS12) | (1 << CS10);  
  // enable timer compare interrupt
  TIMSK1 |= (1 << OCIE1A);
  sei();//allow interrupts
}

ISR(TIMER2_COMPA_vect)
{
  cli();//stop interrupts
  serial();
  sei();//allow interrupts
}

ISR(TIMER1_COMPA_vect)
{//timer1 interrupt 4Hz 
  if (loopTime%4 ==0) // 1hz
  {
    timestamp++;  // time update 
    loopDate++;
    if (!syncTime) itAskTime=true; // first synchro if not done 
    askDraw = true;  
  }
  loopScroll++; 
  if ((++loopTime%7200) == 0) itAskTime=true; // refresh ntp time every 30Mn
}


void setup(void) {
   char  msg3[] = {"Wi-Fi RADIO"};
   Serial.begin(BAUD);
   while (!Serial) ;

 //  pinMode(PIN_LED, OUTPUT);
	 pinMode(PIN_PLAYING, OUTPUT);
   pinMode(ContrastPin, INPUT);
   digitalWrite(ContrastPin, HIGH); // activate internal pullup resistor
	 digitalWrite(PIN_PLAYING, LOW);

#ifdef IR
	 irrecv.enableIRIn(); // Start the IR receiver
   irStr[0] = 0;
#endif   

ReStart:  // Come back here if LCD contract is changed
    // Read the EEPROM to determine if display is using a custom contrast value
  NOKIAcontrast = EEPROM.read(EEaddr1);
    // Set the Nokia LCD Contrast to default or reset if EEPROM is corrupt or set to new value
  if (NOKIAcontrast  < 0xB0 || NOKIAcontrast > 0xCF) NOKIAcontrast = 0xB8;
	u8g.setContrast(2*(NOKIAcontrast-0x80));
	u8g_prepare();
	y = u8g.getFontLineSpacing();
	yy = u8g.getHeight();
	x = u8g.getWidth();
	z = 0; 
	clearAll();  

	for (int i = 0;i<5;i++)
	{
	  u8g.firstPage();
	  do {
//  		if (!(i%2)) u8g.drawFrame(0,0,x/2-1,yy/2-1); 
//	      else u8g.drawFrame(0,0,x-1,yy-1); 
		   u8g.drawStr(u8g.getWidth()/2 - (u8g.getStrWidth(msg3)/2), u8g.getHeight()/3, msg3);
	  } while( u8g.nextPage() );
	  delay(500);
	  if (i%2)u8g.setScale2x2(); 
	  else u8g.undoScale(); 
	}
	lline[0] = (char*)msg;
	lline[1] = (char*)msg1;
	//	lline[2] =(char*) msg2;
	nameNum[0]=0;
	eepromReadStr(EEaddrIp, oip);
	lline[3] = (char*)"IP:";
	lline[4] = oip;
	draw(0);
	delay(2000);
	if (!digitalRead(ContrastPin)) {
		NOKIAcontrast+=1;
		if (NOKIAcontrast > 0xCF) NOKIAcontrast = 0xB0;
		EEPROM.write(EEaddr1,NOKIAcontrast) ;
		itoa(NOKIAcontrast,title,16);
		lline[2] = title;
		goto ReStart;
	}
  setTimer2();
  setTimer1();
	lline[2] = (char*)msg2;
	draw(0);
}

////////////////////////////////////////
// Clear all buffers and indexes
void clearAll()
{
      title[0] = 0;
      station[0]=0;
    for (int i=1;i<LINES;i++) {lline[i] = NULL;iline[i] = 0;tline[i] = 0;}
}
////////////////////////////////////////
void cleartitle()
{
     title[0] = 0;
     for (int i = 3;i<LINES;i++)  // clear lines
     {
       lline[i] = NULL;
     iline[i] = 0;
     tline[i] = 0; 
     }  
}

////////////////////////////////////////
void removeUtf8(byte *characters)
{
  int index = 0;
  while (characters[index])
  {
    if ((characters[index] >= 0xc2)&&(characters[index] <= 0xc3)) // only 0 to FF ascii char
    {
      //      Serial.println((characters[index]));
      characters[index+1] = ((characters[index]<<6)&0xFF) | (characters[index+1] & 0x3F);
      int sind = index+1;
      while (characters[sind]) { characters[sind-1] = characters[sind];sind++;}
      characters[sind-1] = 0;

    }
    index++;
  }
}

////////////////////////////////////////
void eepromReadStr(int addr, char* str)
{
  byte rd;
  do {
    rd = EEPROM.read(addr++);
    *str = rd;
//    Serial.println(str[0],16);
    str++;
  } while (( rd != 0)&&( rd != 0xFF)); 
  *str = 0;
}

////////////////////////////////////////
void eepromWriteStr(int addr, char* str)
{
  byte rd;
  do {
    EEPROM.write( addr++,*str);
    rd = *str;
    str++;
  } while (( rd != 0)&&( rd != 0xFF)); 
  EEPROM.write( addr,0);
}


////////////////////////////////////////
void separator(char* from)
{
    byte len;
    char* interp;
    len = strlen(from);
    while (from[strlen(from)-1] == ' ') from[strlen(from)-1] = 0; // avoid blank at end
    while ((from[0] == ' ') ){ strcpy( from,from+1); }
    interp=strstr_PF(from,PSTR(" - "));
  if (from == nameset) {lline[0] = nameset;lline[1] = NULL;lline[2] = NULL;return;}
  if (interp != NULL)
  {
    from[interp-from]= 0;
    lline[(from==station)?1:3] = from;
    lline[(from==station)?2:4] = interp+3;
  } else
  {
    lline[(from==station)?1:3] = from;
  }

}
////////////////////////////////////////
// parse the karadio received line and do the job
void parse(char* line)
{
  char* ici;
   removeUtf8((byte*)line);
 //////  reset of the esp
   if ((ici=strstr_PF(line,PSTR("VS Version"))) != NULL) setup2();
   else
 ////// Meta title   
   if ((ici=strstr_PF(line,PSTR("META#: "))) != NULL)
   {     
      cleartitle(); 
      strcpy(title,ici+7);    
      separator(title); 
      askDraw = true;
   } else 
    ////// ICY4 Description
    if ((ici=strstr_PF(line,PSTR("ICY4#: "))) != NULL)
    {
//      cleartitle();
      strcpy(genre,ici+7);
      lline[2] = genre;
      askDraw = true;
    } else 
 ////// ICY0 station name
   if ((ici=strstr_PF(line,PSTR("ICY0#: "))) != NULL)
   {
      int len;
      clearAll();
      if (strlen(ici+7) == 0) strcpy (station,nameset);
      else strcpy(station,ici+7);
      separator(station);
      askDraw = true;
   } else
 ////// STOPPED  
   if ((ici=strstr_PF(line,PSTR("STOPPED"))) != NULL)
   {
      digitalWrite(PIN_PLAYING, LOW);
      cleartitle();
      strcpy_P(title,PSTR("STOPPED"));
      separator(title);
      askDraw = true;
   }    
 /////// Station Ip      
   else  
   if ((ici=strstr_PF(line,PSTR("Station Ip: "))) != NULL) 
   {
      eepromReadStr(EEaddrIp, oip);
      if ( strcmp(oip,ici+12) != 0)
        eepromWriteStr(EEaddrIp,ici+12 ); 
   } else
 //////Nameset
   if ((ici=strstr_PF(line,PSTR("MESET#: "))) != NULL)  
   {
      int len;
      strcpy(nameset,ici+8);
      ici = strstr(nameset," ");
      strncpy(nameNum,nameset,ici-nameset+1);
      nameNum[ici - nameset+1] = 0;
      strcpy(nameset,nameset+strlen(nameNum));
      separator(nameset);            
   } else
 //////Playing
   if ((ici=strstr_PF(line,PSTR("YING#"))) != NULL)  
   {
      digitalWrite(PIN_PLAYING, HIGH);
      if (strcmp_P(title,PSTR("STOPPED")) == 0)
      {
        title[0] = 0;
        separator(title);
        askDraw = true;
     }
   } else
   //////Volume
   if ((ici=strstr(line,"VOL#:")) != NULL)  
   {
      volume = atoi(ici+6);
      askDraw = true;;
   } else
 //////Date Time  ##SYS.DATE#: 2017-04-12T21:07:59+01:00
   if ((ici=strstr(line,"SYS.DATE#:")) != NULL)  
   {
      char lstr[30];
      if (*(ici+11) != '2')//// invalid date. try again later
      {
        askDraw = true;
        return;
      }
      strcpy(lstr,ici+11);
      dt = gmtime(&timestamp);
      int year,month,day,hour,minute,second;
      sscanf(lstr,"%04d-%02d-%02dT%02d:%02d:%02d",&(year),&(month),&(day),&(hour),&(minute),&(second));
      dt->tm_year = year; dt->tm_mon = month-1; dt->tm_mday = day;
      dt->tm_hour = hour; dt->tm_min = minute;dt->tm_sec =second;
      dt->tm_year -= 1900;
      timestamp = mktime(dt); 
      syncTime = true;
   }
}


////////////////////////////////////////
// receive the esp8266 stream
void serial() 
{
char temp;
//Serial.print(F("sys.date\r")); // Synchronise with current date & time// от Пильникова для синхронизации времени
    while ((temp=Serial.read()) != -1)
    {
	    switch (temp)
	    {
		    case '\n' : if (index == 0) break;
		    case '\r' :
				line[index] = 0; // end of string
				index = 0;
				parse(line);
				break;
		    default : // put the received char in line
         line[index++] = temp;
				if (index>BUFLEN-1) //break; // small memory so small buffer
        {
          Serial.println(F("overflow"));
         line[index] = 0;
         parse(line);
         index = 0;
        } 
       
	    }
    }  
}

////////////////////////////////////////
// draw all lines
void draw(int xx)
{
  char strsec[30]; 
  dt=gmtime(&timestamp);
  if (x==84)
  sprintf(strsec,"%02d-%02d  %02d:%02d:%02d",(dt->tm_mon)+1,dt->tm_mday, dt->tm_hour, dt->tm_min,dt->tm_sec);
  else
 // sprintf(strsec,"%02d-%02d-%04d  %02d:%02d:%02d",(dt->tm_mon)+1,dt->tm_mday,dt->tm_year+1900, dt->tm_hour, dt->tm_min,dt->tm_sec);
  sprintf(strsec,"%02d-%02d-%04d  %02d:%02d:%02d",dt->tm_mday,(dt->tm_mon)+1,dt->tm_year+1900, dt->tm_hour, dt->tm_min,dt->tm_sec); // замена даты и месяца местами


	u8g.firstPage();
	do {
		u8g.drawHLine(0,(4*y) - (y/2)-5,x);
    u8g.drawBox(0,0,x-1,y);
		for (int i = 0;i < LINES;i++)
		{
			if (i == 0)u8g.setColorIndex(0);
			else u8g.setColorIndex(1);
			if (i >=3) z = y/2 -3; else z = -1;
			if ((lline[i] != NULL))
      {
			  if (i == 0) 
			  {				
			  	if (nameNum[0] ==0)  u8g.drawStr(1,0,lline[i]+iline[i]);
			  	else 
			  	{
			  		u8g.drawStr(1,0,nameNum);
			  		u8g.drawStr(u8g.getStrPixelWidth(nameNum)-2,0,lline[i]+iline[i]);
			  	}
			  }      
			  else u8g.drawStr(0,y*i+z,lline[i]+iline[i]);
      }
      if (i == VOLUME)
      {        
          u8g.drawFrame(0,y*i+z+(y/2)-1,x-1,3);
          u8g.drawHLine(0,y*i+z+(y/2),((uint16_t)(x*volume)/255));                    
      }  
    }
      //time
//  if ((lline[4] == NULL)||(x==84))
    u8g.drawStr(x/2-(u8g.getStrWidth(strsec)/2),yy-y,strsec); 
	} while( u8g.nextPage() );
}
////////////////////////////////////////
// scroll each line
void scroll()
{
unsigned len;
	for (int i = 0;i < LINES;i++)
	{
	   if (tline[i]>0) 
	   {
	     if (tline[i] == 4) iline[i]= 0;
	     tline[i]--;		 
	   } 
	   else
	   {
       len = u8g.getStrWidth(lline[i]+iline[i]);
		   if (i == 0)	 len += u8g.getStrWidth(nameNum) ;
		   if (len > x) 
		    {iline[i]++;askDraw = true;}
		   else 
			  tline[i] = 6;
	   }
	}	
}

#ifdef IR
void nbStation(char nb)
{
  if (strlen(irStr)>=3) irStr[0] = 0;
  uint8_t id = strlen(irStr);
  irStr[id] = nb;
  irStr[id+1] = 0;
}
void translateIR() // takes action based on IR code received
//  KEYES Remote IR codes (NEC P01)
//  and Ocean Digital remote (NEC P07)
{
#ifdef IRLib2
  if (irrecv.getResults())
  {
    results.decode();    
#else
	if ((irrecv.decode(&results)))
  {
#endif  

//  Uncomment the following line to see the code of your remote control and report to the case the value
#ifdef IRLib2
//	    Serial.print(F("Protocol:"));Serial.print(results.protocolNum);Serial.print(F("  value:"));Serial.println(results.value,HEX);
#else
//      Serial.print(F("Protocol:"));Serial.print(results.decode_type);Serial.print(F("  value:"));Serial.println(results.value,HEX);
#endif
//      Serial.print(F("  value:"));Serial.println(results.value,HEX);
		switch(results.value)
		{
			case 0xFF629D: 
			case 0x10EF48B7:	/*(" FORWARD");*/  irStr[0] = 0;Serial.print(F("cli.next\r")); break;

			case 0xFF22DD:
			case 0x10EFA857:
			case 0x10EF42BD: /*(" LEFT");*/  irStr[0] = 0;Serial.print(F("cli.vol-\r"));  break;

			case 0xFF02FD:
			case 0x10EF7887:		/*(" -OK-");*/
			{  
//      state?Serial.print(F("cli.start\r")):Serial.print(F("cli.stop\r"));
        if (strlen(irStr) >0)
        {
          Serial.print(F("cli.play(\""));Serial.print(irStr);Serial.print(F("\")\r"));
          irStr[0] = 0;
        }
        else
        { 
          state?Serial.print(F("cli.start\r")):Serial.print(F("cli.stop\r"));
/*				  if (state)
           Serial.print("cli.start\r");
			  	else
			  		Serial.print("cli.stop\r");
           */
        }
				state = !state;
        irStr[0] = 0;
				break;
			}
			case 0xFFC23D:
			case 0x10EF28D7:
			case 0x10EF827D: /*(" RIGHT");*/ irStr[0] = 0;Serial.print(F("cli.vol+\r"));  break; // volume +
			case 0xFFA857:
			case 0x10EFC837:	/*(" REVERSE");*/ irStr[0] = 0;Serial.print(F("cli.prev\r")); break;
			case 0xFF6897:
			case 0x10EF807F: /*(" 1");*/ nbStation('1');   break;
			case 0xFF9867:
			case 0x10EF40BF: /*(" 2");*/ nbStation('2');   break;
			case 0xFFB04F:
			case 0x10EFC03F: /*(" 3");*/ nbStation('3');   break;
			case 0xFF30CF:
			case 0x10EF20DF: /*(" 4");*/ nbStation('4');   break;
			case 0xFF18E7:
			case 0x10EFA05F: /*(" 5");*/ nbStation('5');   break;
			case 0xFF7A85:
			case 0x10EF609F: /*(" 6");*/ nbStation('6');   break;
			case 0xFF10EF:
			case 0x10EFE01F: /*(" 7");*/ nbStation('7');   break;
			case 0xFF38C7:
			case 0x10EF10EF: /*(" 8");*/ nbStation('8');   break;
			case 0xFF5AA5:
			case 0x10EF906F: /*(" 9");*/ nbStation('9');   break;
			case 0xFF42BD:
			case 0x10EFE817: /*(" *");*/   irStr[0] = 0;Serial.print(F("cli.stop\r")); break;
			case 0xFF4AB5:
			case 0x10EF00FF: /*(" 0");*/ nbStation('0');   break;
			case 0xFF52AD:
			case 0x10EFB847: /*(" #");*/   irStr[0] = 0;Serial.print(F("cli.start\r")); break;
			case 0xFFFFFFFF: /*(" REPEAT");*/break;
			default:;
			/*Serial.println(" other button   ");*/
		}// End Case
;	
#ifdef IRLib2
    irrecv.enableIRIn();      //Restart receiver
#else
		irrecv.resume(); // receive the next value
#endif    
	}
} //END translateIR
#endif

void askTime()
{
    if (itAskTime) // time to ntp. Don't do that in interrupt.
    {
        Serial.print(F("sys.date\r")) ; 
        itAskTime = false;
    }  
}

////////////////////////////////////////
void loop(void) {
#ifdef IR
    translateIR();
#endif
// scrolling control and draw control
    if (loopScroll >=1 ) // 500ms
    { 
//      digitalWrite(PIN_LED, !digitalRead(PIN_LED)); // blink led  
      loopScroll = 0;
      if (askDraw) // something to display
      {
        askDraw = false; 
        draw(0); 
      }   
//      else
      scroll(); 
    }
// ntp control and first info demand
     if (loopDate>=5)
     {
         loopDate = 0;
          if (itAskTime)
          {
            if (!syncTime) // time to ntp. Don't do that in interrupt.
            {
              Serial.print(F("\rsys.tzo(\"")) ;Serial.print(TZO);
              Serial.print(F("\")\r")); 
              Serial.print(F("cli.info\r")); // Synchronise the current state   
              itAskTime = false;             
            } 
            else askTime();
          }
      }
}

 

shurik12330
Offline
Зарегистрирован: 05.02.2018

Pilnikov, у вас видно, что 30 нога идет к мисо. У меня разъем припаян сверху и не видно. НО не звонится никак мисо на 30 ногу, а 30 нога только к +3,3В подтянута через 10 кОм. Хотя пробовал отсоединить сигналы MISO и SCLK, без них радио не поет.  вечером сфоткаю свою красную плату.

Может и на синей надо притянуть мисо к плюсу, чтобы заработала? у вас синяя есть? у меня на синей не притянута.

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015
   if ((ici=strstr(line,"SYS.DATE#:")) != NULL) //проверяем что приняли строчку с датой и временем
   {
    char lstr[30]; //объявляем буфер в 30 символов под эту самую дату и время 
    if (*(ici+11) != '2')//// invalid date. try again later //дата кривая, требуем повторно считать ее
      {
        askDraw = true; //Требуется повторная загрузка данных
        return; // выскакиваем
      }
      strcpy(lstr,ici+11); //копируем дату и время в буфер
      dt = gmtime(&timestamp); //Записываем в структуру dt (содержащую элементы час минута секунда год) текущее время в контроллере (в дурине)
      int year,month,day,hour,minute,second; //объявляем переменные под год месяц день недели и.т.д
      sscanf(lstr,"%04d-%02d-%02dT%02d:%02d:%02d",&(year),&(month),&(day),&(hour),&(minute),&(second)); //переносим (разбираем) строчку с датой на отдельные кусочки (день месяц год и.т.д)
      dt->tm_year = year; dt->tm_mon = month-1; dt->tm_mday = day; //заменяем кусочки структуры dt значениями из нашей принятой и разобранной строки с датой и временем
      dt->tm_hour = hour; dt->tm_min = minute;dt->tm_sec =second;
      dt->tm_year -= 1900; 
      timestamp = mktime(dt); //записываем в timestamp(штамп/оттиск времени в формате UNIX time (количество секунд с 1970 года) значение времени сформированное в структуре dt
      syncTime = true; // Говорим что время поправлено
   }

перед 257 строчкой вставьте 

dt = gmtime(&timestamp); //Записываем в структуру dt (содержащую элементы час минута секунда год) текущее время в контроллере (в дурине)
      

 

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

shurik12330 пишет:

Pilnikov, у вас видно, что 30 нога идет к мисо. У меня разъем припаян сверху и не видно. НО не звонится никак мисо на 30 ногу, а 30 нога только к +3,3В подтянута через 10 кОм. Хотя пробовал отсоединить сигналы MISO и SCLK, без них радио не поет.  вечером сфоткаю свою красную плату.

Может и на синей надо притянуть мисо к плюсу, чтобы заработала? у вас синяя есть? у меня на синей не притянута.

Нету у мну синей :( У мну две красных :)

А выяснить можно перепаяв чип - тогда точно можно будет понять кто виноват чип или плата.

Подтяжка вряд ли - не хеллокало бы.

Вот если бы у вас есп32 была - можно было бы быстро проверить версию с частотой инициализации. Я 20 кГц делал крайний раз - мне помогло 

Еще народ гдето писал про "старую" и "новую" версии чипов - гляньте чего там на микрухе написано "мелким шрифтом" ;)

ShAlex13
Offline
Зарегистрирован: 19.01.2018

Владимир 2018 пишет:

В последней редакции с заменой местоположения даты и месяца.

Изображение сдвинуто влево на несколько пикселей :(

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

ShAlex13 пишет:

Владимир 2018 пишет:

В последней редакции с заменой местоположения даты и месяца.

Изображение сдвинуто влево на несколько пикселей :(

Пробуйте подобрать "правильный" экран через sys.lcd("xxx")

ShAlex13
Offline
Зарегистрирован: 19.01.2018

pilnikov пишет:

Пробуйте подобрать "правильный" экран через sys.lcd("xxx")

С "родным" скетчем изображение попадает в экран

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

ShAlex13 пишет:

Владимир 2018 пишет:

В последней редакции с заменой местоположения даты и месяца.

Изображение сдвинуто влево на несколько пикселей :(

А можно фото?

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

ShAlex13 пишет:

pilnikov пишет:

Пробуйте подобрать "правильный" экран через sys.lcd("xxx")

С "родным" скетчем изображение попадает в экран

Я перепутал - это же Аддон там надо подбирать "правильный" экран в u8glibConf.h

ShAlex13
Offline
Зарегистрирован: 19.01.2018

Владимир 2018 пишет:

А можно фото?

Кинь еще свой u8glibConf.h

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

To Pilnikov:

Ничего не помогло. 

Если Serial.print(F("sys.date\r")); вставляю в void draw(), то время идет, секунды, синхронизируются часы, но немного "поддергивается" экран, похоже, что в такт с секундами. Временная зона (TZO) при этом не меняется и секунды до синхронизации не считают. 

В скетче для OLED используются таймеры. В этот скетч я их не вставлял. Это никак на отбражение времени не влияет?

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

ShAlex13 пишет:

Владимир 2018 пишет:

А можно фото?

Кинь еще свой u8glibConf.h

Да, его нужно в ту же папку, кидаю:

// u8glibConf.h
/*

>>> Before compiling: Please remove comment from the constructor of the
>>> connected graphics display (see below).

Universal 8bit Graphics Library, https://github.com/olikraus/u8glib/

Copyright (c) 2012, olikraus@gmail.com
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this list
of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*/
//#ifndef _U8GLIBCONF_h
#define _U8GLIBCONF_h

#if defined(ARDUINO) && ARDUINO >= 100
	#include "arduino.h"
#else
	#include "WProgram.h"
#endif
#include "U8glib.h"

// setup u8g object, please remove comment from one of the following constructor calls
// IMPORTANT NOTE: The following list is incomplete. The complete list of supported
// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGM132 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGM128 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGM128_2X u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10);	// SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
//U8GLIB_ST7920_192X32_4X u8g(10);		// SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_LM6059 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_LM6063 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGXL160_BW u8g(10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); 		// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7,  18, 14, 15, 17, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7,  18, 14, 15, 17, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7,  18, 14, 15, 17, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 );  			// 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1306_128X64 u8g(4, 5, 6, 7);	// SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new white HalTec OLED)
//U8GLIB_SSD1306_128X64 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)

// Karadio: choose this one for the http://www.ebay.fr/itm/191909116703?_trksid=p2057872.m2749.l2649&ssPageN...
// 0.96" I2C IIC SPI Serial 128X64
#ifdef oled096
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_NONE);	// I2C / TWI
#endif
//#ifdef oled130
//U8GLIB_SH1106_128X64	u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);	// I2C / TWI
//#endif

//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);	// Fast I2C / TWI
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);	// Display which does not send AC
//U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1306_128X32 u8g(10, 9);             // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);	// I2C / TWI
//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1306_64X48 u8g(10, 9);             // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE);	// I2C / TWI
//U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7);	// SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED)
//U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);	// I2C / TWI
//U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);	// Dev 0, Fast I2C / TWI
//U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK);	// Display which does not send ACK
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE);	// I2C
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE);	// I2C
//U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE);	// I2C
//U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_UC1611_DOGM240 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_UC1611_DOGM240 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16
//U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE);	// I2C
//U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_UC1611_DOGXL240 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_LD7032_60x32 u8g(11, 12, 9, 10, 8);	// SPI Com: SCK = 11, MOSI = 12, CS = 9, A0 = 10, RST = 8  (SW SPI Nano Board)
//U8GLIB_UC1608_240X64 u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X64_2X u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X64 u8g(10, 9, 8);	// HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X64_2X u8g(10, 9, 8);	// HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X64_2X u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X64 u8g(10, 9, 8);	// HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X64_2X u8g(10, 9, 8);	// HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
//U8GLIB_T6963_128X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
//U8GLIB_HT1632_24X16 u8g(3, 2, 4);		// WR = 3, DATA = 2, CS = 4
//U8GLIB_SSD1351_128X128_332 u8g(13, 11, 8, 9, 7); // Arduino UNO: SW SPI Com: SCK = 13, MOSI = 11, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
//U8GLIB_SSD1351_128X128_332 u8g(76, 75, 8, 9, 7); // Arduino DUE: SW SPI Com: SCK = 13, MOSI = 11, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
//U8GLIB_SSD1351_128X128_332 u8g(8, 9, 7); // Arduino: HW SPI Com: SCK = 13, MOSI = 11, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
//U8GLIB_SSD1351_128X128_HICOLOR u8g(76, 75, 8, 9, 7); // Arduino DUE, SW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
//U8GLIB_SSD1351_128X128_HICOLOR u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
//U8GLIB_SSD1351_128X128GH_332 u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED)
//U8GLIB_SSD1351_128X128GH_HICOLOR u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED)
//
//Karadio: Choose this one for http://www.ebay.fr/itm/262558872574?_trksid=p2057872.m2749.l2649&ssPageN...
// 84X48 84 * 48 Nokia 5110 Module Lcd
//#ifdef Nokia5110
//#define PIN_SCE   7
//#define PIN_RESET 6
//#define PIN_DC    5
//#define PIN_SDIN  4
//#define PIN_SCLK  3
//U8GLIB_PCD8544 u8g(PIN_SCLK, PIN_SDIN, PIN_SCE, PIN_DC, PIN_RESET); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
//#endif
//

//#endif

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
Version 1.2  added esp8266 boot detection
Version 1.3  added Pin PLAYING low when not playing, and High when playing.
*/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*  *** Instruction for NOKIA 5110*********************************************
        ---------------------------
NOTES:
Confirmed vendor:
lcd: http://www.ebay.fr/itm/262558872574?_trksid=p2057872.m2749.l2649&ssPageN...
cpu: http://www.ebay.fr/itm/252409929753?_trksid=p2057872.m2749.l2649&ssPageN...

MiniPRO 3.3 v 8MHz Pins:
#__      Function_________________________________

RESET    Reset (not used)
Tx  0    n/a (dedicated Serial Input)
Rx  1    to the tx of the nodeMcu
PIN 2    n/a
PIN 3-7  Nokia Display  (specifics below)
PIN 8    Activate changes to NOKIA contrast B0 --> BF GND and press RESET

Raw: 3.3 to 16 VDC Max

Nokia 5110 Graphic LCD Pinout:
_______ Mini Pro____   _______ Nokia GLCD___
#define PIN_SCE   7    LCD CE ....  Pin 2
#define PIN_RESET 6    LCD RST .... Pin 1
#define PIN_DC    5    LCD Dat/Com. Pin 3  (DC)
#define PIN_SDIN  4    LCD SPIDat . Pin 4  (DIN)
#define PIN_SCLK  3    LCD SPIClk . Pin 5

//                     LCD Gnd .... Pin 8
//                     LCD Vcc .... Pin 6   3.3 volts  from the minipro VCC
//                     LCD Vled ... Pin 7   (100 to 300 Ohms to Gnd)

Cable wiring between nodeMcu and Mini Pro
-----------------------------------------
--NodeMcu--   --Mini Pro--
Tx            Rx
Gnd           Gnd
VU            Raw

Extra features:
---------------
A Jumper between Nokia GLCD pin 7 and  100 ohm + Gnd to switch on or off the lcd light
A7 ---| |--- 100 ohms --- GND
A push button between PIN8 of mini pro and GND to ajust the contrast after a reset.
- Press the switch, reset and wait for the right contrast (32 steps) .
- Release the switch. Done.
The contrast is saved in eprom.

Software: 
u8glib must be installed in library;
In .../Arduino\libraries\U8glib\utility/u8g.h
 uncomment the following line 
#define U8G_16BIT 1

In file u8glibConf.h
comment the current u8g
uncomment:
U8GLIB_PCD8544 u8g(PIN_SCLK, PIN_SDIN, PIN_SCE, PIN_DC, PIN_RESET); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8

Warning:
The webradio serial must be set at 28800 b/s
with sys.uart("28800") command



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
**** Instruction for 0.96" I2C IIC SPI Serial 128X64 White OLED LCD LED Display Module for Arduino *************************
     ----------------------------------------------------------------------------------------------
NOTES:
Confirmed vendor:
lcd: http://www.ebay.fr/itm/191909116703?_trksid=p2057872.m2749.l2649&ssPageN...
cpu: http://www.ebay.fr/itm/Pro-Mini-Atmega328-5V-16M-Micro-controller-Board-...

MiniPRO 5v 16MHz
 Pins:
#__      Function_________________________________

RESET    Reset (not used))
Rx  1    to the tx of the nodeMcu
Gnd      ground
jp2: A4,A5	I2C lines
Raw: 5 to 16 VDC Max

Graphic LCD Pinout:
 Mini Pro____   _______  GLCD___
JP2 A4             LCD SDA .... Pin 3
P2  A5             LCD SCK .... Pin 4
//                 LCD Gnd .... Pin 1
//                 LCD Vcc .... Pin 2  5 volts  from the minipro VCC

Depending of the pcb, A4 & A5 are on the opposite pins of the board, or on the pcb near A2 & A3 

Cable wiring between nodeMcu and Mini Pro
-----------------------------------------
--NodeMcu--   --Mini Pro--
Tx            Rx
Gnd           Gnd
VU            Raw

Software:
u8glib must be installed in library;
In .../Arduino\libraries\U8glib\utility/u8g.h
uncomment the following line
#define U8G_16BIT 1

In file u8glibConf.h
comment the current u8g
uncomment:
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);	// I2C / TWI

--------
WARNING:
The webradio serial must be set at 28800 b/s
--------
WARNING:
---------
The nodeMcu is a 3.3v device.
DO NOT connect the Rx pin of the lcd to the Tx pin of the mini Pro


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
**** Instruction for the IR module *****************************************************************************************
------------------------------------
The model used here is from:
https://www.aliexpress.com/item/Hot-Selling-1pcs-New-Infrared-IR-Wireles...
or equivalent. Cost less than 1$

- Based on NEC protocol; Built-in 1 x AG10 battery;
- Remote control range: above 8m;
- Wavelength: 940Nm;
- Frequency: crystal oscillator: 455KHz; IR carrier frequency: 38KHz

// obsolete-----------
See Library at: https://github.com/shirriff/Arduino-IRremote
Install the library found at  https://github.com/z3t0/Arduino-IRremote/releases/download/2.1.0/Arduino...
Uncomment the #define IR at the beginning of the karadioU8glib.ino file.
----------------------
// new library
Install the library from https://github.com/cyborg5/IRLib2
Uncomment the #define IR  and the #ifdef IRLib2 at the beginning of the karadioU8glib.ino file.
----------------------

The IR receiver pins:
From left to right (pin at bottom)
Gnd VCC Signal
The signal must be connected to
#define PIN_IRRECV	11  for the old library or
#define PIN_IRRECV  2  or 3 for the new library IRLib2
It is the default In karadioU8glig.ino, you can change it

In karadioU8glig.ino:
//  Uncomment the following line to see the code of your remote control and report to the case the value
//	    Serial.print("Protocol:");Serial.print(results.decode_type);Serial.print("  value:");Serial.println(results.value,HEX);
If you want to use another remote, you can see the code of the keys and modify the switch case for the needed function.
See IRremote.h  to add the protocol you need for the remote.

The tx of the pro mini must be connected to the rx of the esp12 but
Warning; the esp rx pin is not 5V tolerant, so if your pro mini is a 5v version we nned to adapt the level.
-------
See
http://www.instructables.com/id/Pi-Cubed-How-to-connect-a-33V-Raspberry-...

The value of the resistors is not critical. Only th ration 1/3 2/3 must be respected 1k and 2k for example)

I found that the ir is not very accurate, but it works.
Enjoy.

jpc 01/2017
*/

 

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

Владимир 2018 пишет:

To Pilnikov:

Ничего не помогло. 

Если Serial.print(F("sys.date\r")); вставляю в void draw(), то время идет, секунды, синхронизируются часы, но немного "поддергивается" экран, похоже, что в такт с секундами. Временная зона (TZO) при этом не меняется и секунды до синхронизации не считают. 

В скетче для OLED используются таймеры. В этот скетч я их не вставлял. Это никак на отбражение времени не влияет?

Serial.print(F("sys.date\r")); - выводит текущую дату в сериал.

TZO это 3600 * на вашу таймзону (для москвы 2) прибавлять надо к timestamp (пример  dt = gmtime(&timestamp + 3600 * 2) для москвы) 

Либо так 

dt->tm_hour = hour + смещение в часах для вашей таймзоны; 

 

ShAlex13
Offline
Зарегистрирован: 19.01.2018

Владимир 2018 пишет:

Да, его нужно в ту же папку, кидаю:

Не помогло

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

То Владимир 2018

перед 257 строчкой вставьте 

dt = gmtime(&timestamp); //Записываем в структуру dt (содержащую элементы час минута секунда год) текущее время в контроллере (в дурине)
      

вы это делали?

еще так попробуйте

dt = now();
shurik12330
Offline
Зарегистрирован: 05.02.2018

pilnikov пишет:

Нету у мну синей :( У мну две красных :)

А выяснить можно перепаяв чип - тогда точно можно будет понять кто виноват чип или плата.

Вот если бы у вас есп32 была - можно было бы быстро проверить версию с частотой инициализации. Я 20 кГц делал крайний раз - мне помогло 

Еще народ гдето писал про "старую" и "новую" версии чипов - гляньте чего там на микрухе написано "мелким шрифтом" ;)

чип перепаять я не осилю) вечером посмотрю надписи на чипе, но точно VS1053B.

ESP32 буду заказывать. какую лучше - голый модуль или нодемцу?

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

pilnikov пишет:

То Владимир 2018

перед 257 строчкой вставьте 

dt = gmtime(&timestamp); //Записываем в структуру dt (содержащую элементы час минута секунда год) текущее время в контроллере (в дурине)
      

вы это делали?

еще так попробуйте

dt = now();

Делал, вставлял перед 257 строкой. Потом подобную запись выше закоментировал - и так пробовал. Попробую еще с dt=now();

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

ShAlex13 пишет:

Владимир 2018 пишет:

Да, его нужно в ту же папку, кидаю:

Не помогло

У меня экран OLED 0,96", SDD 1306, 128x64,IIC,I2C

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

Владимир 2018 пишет:

pilnikov пишет:

То Владимир 2018

перед 257 строчкой вставьте 

dt = gmtime(&timestamp); //Записываем в структуру dt (содержащую элементы час минута секунда год) текущее время в контроллере (в дурине)
      

вы это делали?

еще так попробуйте

dt = now();

Делал, вставлял перед 257 строкой. Потом подобную запись выше закоментировал - и так пробовал. Попробую еще с dt=now();

dt = now() не получится

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

shurik12330 пишет:

чип перепаять я не осилю) вечером посмотрю надписи на чипе, но точно VS1053B.

ESP32 буду заказывать. какую лучше - голый модуль или нодемцу?

лучше мцу

а надпись надо смотреть ниже VS1053B - там цифири волшебные они и есть "определение возраста"

У nadim в описании

https://a.d-cd.net/d23e5b5s-960.jpg

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

pilnikov пишет:

 

Либо так 

dt->tm_hour = hour + смещение в часах для вашей таймзоны; 

 

Для тайм зоны это помогло, спасибо.

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

А можно как нибудь сделать быстрее скроллинг?

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

Владимир 2018 пишет:

pilnikov пишет:

 

Либо так 

dt->tm_hour = hour + смещение в часах для вашей таймзоны; 

 

Для тайм зоны это помогло, спасибо.

У вас в радио таймзону нужно поправить тогда и тут не нужно будет ее корректировать

Скроллинг привязан к timer1 (4 Hz 250ms) - перенастраивайте таймер или отвязывайтесь от него - будет быстрее

ShAlex13
Offline
Зарегистрирован: 19.01.2018

Владимир 2018 пишет:

У меня экран OLED 0,96", SDD 1306, 128x64,IIC,I2C

У меня такой OLED 1,3'', SSH 1106, 128x64,IIC,I2C

 

Владимир 2018
Offline
Зарегистрирован: 17.03.2018

ShAlex13 пишет:

Владимир 2018 пишет:

У меня экран OLED 0,96", SDD 1306, 128x64,IIC,I2C

У меня такой OLED 1,3'', SSH 1106, 128x64,IIC,I2C

 

Попробуй так:

В u8glibConf.h закомментируй 96, 97, 98 строки и раскомментируй 99, 100, 101.

И в скетче замени первую строку

#define oled096

на

#define oled130