ESP8266-01 и TM1637

Тема в разделе "Проводная и беспроводная связь", создана пользователем obuhanoe, 10 янв 2017.

  1. obuhanoe

    obuhanoe Гик

    Добрый день.
    Возникла следующая проблема, залил скетч в ESP8266-01 через Arduino IDE, в режиме отладки (через usb ttl converter) данные по NTP получаю и вывожу в монитор порта, TM1637 в этот момент не подключен - все собрано на макетной плате.
    Когда собираю на печатной плате, все подсоединяю - TM1637 загорается только питание, сам экран не откликается, а ESP8266-01 внешне видно что мигает диодом и синхронизируется с NTP.
    У меня внешнее питание 5В 1А - от которого напрямую подается на экран, а через AMS1117-3.3 идет на ESP8266-01, земли объединены. CLK и DIO подключены к GPIO0 и GPIO2.
    Подключал TM1637 к ардуине мега - экран рабочий.
    Не пойму причину не работоспособности экрана.
    Код (C++):

    #include <ESP8266WiFi.h>      
    #include <WiFiUdp.h>
    #include "TM1637.h"

    #define TM1637_CLK  0
    #define TM1637_DIO  2

    #define TIMEZONE 3

    // отладка
    #define DEBUG_MODE true

    TM1637 tm1637(TM1637_CLK,TM1637_DIO);
    static const char * enumConnectionStatus[] = { "WL_IDLE_STATUS", "WL_NO_SSID_AVAIL", "WL_SCAN_COMPLETED",
        "WL_CONNECTED", "WL_CONNECT_FAILED", "WL_CONNECTION_LOST", "WL_DISCONNECTED" };

    String _ssid     = "****";   // Для хранения SSID
    String _password = "****"; // Для хранения пароля сети

    unsigned int  localPort = 2390;      // local port to listen for UDP packets
    unsigned long ntp_time  = 0;
    long          t_correct = 0;
    unsigned long cur_ms    = 0;
    unsigned long ms1       = 0;
    unsigned long ms2       = 10000000UL;
    unsigned long t_cur     = 0;
    bool          points    = true;
    unsigned int  err_count = 0;

    IPAddress timeServerIP;
    const char* ntpServerName = "time.nist.gov";

    const int NTP_PACKET_SIZE = 48;
    byte packetBuffer[NTP_PACKET_SIZE];
    WiFiUDP udp;

    /* 2-й вариант */
    bool WiFi_Connect()
    {
      uint8_t wifiStatus = WiFi.status();
      if (wifiStatus != WL_CONNECTED)
      {
        WiFi.mode(WIFI_STA);
       
        #ifdef DEBUG_MODE
         Serial.print("Connecting to ");
         Serial.print(_ssid);
        #endif
       
        WiFi.begin(_ssid.c_str(), _password.c_str());
        int count=100;
        while (wifiStatus != WL_CONNECTED)
        {
          wifiStatus = WiFi.status();  
          count--;
          if(!count)
          {
            #ifdef DEBUG_MODE
              Serial.println("WiFi connection problem!");
              Serial.print("Failed Connection status: ");
          Serial.println(enumConnectionStatus[wifiStatus]);
            #endif
         
            return false;
          }
         
          #ifdef DEBUG_MODE
             Serial.print(".");
          #endif
         
          delay(500);
        }
       
        #ifdef DEBUG_MODE
          Serial.println();
          Serial.print("Connection status: ");
        Serial.println(enumConnectionStatus[wifiStatus]);
        Serial.print("Connected to WiFi, IP address: ");
        Serial.println(WiFi.localIP());
        #endif    
     
      }
       return true;
    }


    /* Вывод данных на экран */
    void DisplayTime(void){
       uint16_t m = ( ntp_time/60 )%60;
       uint16_t h = ( ntp_time/3600 )%24;
       uint16_t s = ntp_time % 60;
     
       #ifdef DEBUG_MODE
         Serial.print("Time: ");
           Serial.print(h);
         Serial.print(":");
         Serial.print(m);
         Serial.print(":");
         Serial.println(s);
       #endif
     
       tm1637.point(points);
       tm1637.display(0,h/10);
       tm1637.display(1,h%10);
       tm1637.display(2,m/10);
       tm1637.display(3,m%10);  
       
    }

    /**
    * Посылаем запрос NTP серверу
    */

    unsigned long sendNTPpacket(IPAddress& address)
    {
      #ifdef DEBUG_MODE    
       Serial.println("sending NTP packet...");
      #endif
     
    // Очистка буфера в 0
      memset(packetBuffer, 0, NTP_PACKET_SIZE);
    // Формируем строку зыпроса NTP сервера
      packetBuffer[0] = 0b11100011;   // LI, Version, Mode
      packetBuffer[1] = 0;     // Stratum, or type of clock
      packetBuffer[2] = 6;     // Polling Interval
      packetBuffer[3] = 0xEC;  // Peer Clock Precision
      // 8 bytes of zero for Root Delay & Root Dispersion
      packetBuffer[12]  = 49;
      packetBuffer[13]  = 0x4E;
      packetBuffer[14]  = 49;
      packetBuffer[15]  = 52;
    // Посылаем запрос на NTP сервер (123 порт)
      udp.beginPacket(address, 123);
      udp.write(packetBuffer, NTP_PACKET_SIZE);
      udp.endPacket();
    }


    /**
    * Посылаем и парсим запрос к NTP серверу
    */

    bool Get_NTP(void) {
      WiFi.hostByName(ntpServerName, timeServerIP);
      sendNTPpacket(timeServerIP);
      delay(1000);
     
      int cb = udp.parsePacket();
      if (!cb) {
        #ifdef DEBUG_MODE    
          Serial.println("No packet yet");
        #endif
       
        return false;
      }
      else {
        #ifdef DEBUG_MODE    
          Serial.print("packet received, length=");
        Serial.println(cb);
        #endif  
       
    // Читаем пакет в буфер  
        udp.read(packetBuffer, NTP_PACKET_SIZE);
    // 4 байта начиная с 40-го сождержат таймстамп времени - число секунд
    // от 01.01.1900  
        unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
        unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // Конвертируем два слова в переменную long
        unsigned long secsSince1900 = highWord << 16 | lowWord;
    // Конвертируем в UNIX-таймстамп (число секунд от 01.01.1970
        const unsigned long seventyYears = 2208988800UL;
        unsigned long epoch = secsSince1900 - seventyYears;
    // Делаем поправку на местную тайм-зону
        ntp_time = epoch + TIMEZONE*3600;  
        #ifdef DEBUG_MODE    
        Serial.print("Unix time = ");
        Serial.println(ntp_time);
        #endif
       
      }
      return true;
    }

    void setup() {
      Serial.begin(9600);
     
      // Инициализация дисплея
      tm1637.init();
      // Установка яркости дисплея
      tm1637.set(2);
     
      #ifdef DEBUG_MODE    
        Serial.println("");
        Serial.print("Free Memory: ");
        Serial.println(ESP.getFreeHeap());
      #endif

      // 2 вариант
      if( !WiFi_Connect() ){
         
           #ifdef DEBUG_MODE    
               Serial.println("Reset ESP8266 ...");
           #endif
         
           ESP.reset();
      }
     
      delay(1000);
     
      // Инициализауия UDP соединения с NTP сервером  
       udp.begin(localPort);
       #ifdef DEBUG_MODE
        Serial.println("Starting UDP");
        Serial.print("Local port: ");  
        Serial.println(udp.localPort());
       #endif
    }

    void loop() {
       
       cur_ms       = millis();
       t_cur        = cur_ms/1000;
    // Каждые 1 мин. считываем время в интернете
       if( cur_ms < ms2 || (cur_ms - ms2) > 60000*1){
           err_count++;

           if( Get_NTP() ){
              ms2       = cur_ms;
              err_count = 0;
              t_correct = ntp_time - t_cur;
           }
       }
     
    // Каждые 0.5 секунды выдаем время
       if( cur_ms < ms1 || (cur_ms - ms1) > 500 ){
           ms1 = cur_ms;
           ntp_time    = t_cur + t_correct;
           DisplayTime();
           points = !points;
       }
     
    // Если нет соединения с интернетом, перезагружаемся
       if( err_count > 10 ){
         
           #ifdef DEBUG_MODE
                Serial.println("NTP connect false");
            Serial.println("Reset ESP8266 ...");
           #endif
         
           ESP.reset();  
       }
     
       delay(100);
    }
     
  2. yden

    yden Гик

    Подпишусь на тему, так как проблема та же.
     
  3. Vad33

    Vad33 Капитан-оригинал

    Есть подозрение, что TM1637 нужно подключать к ESP8266-01 через конвертер уровней сигнала.
    Ну или косяк в схеме соединений / программе.
     
    obuhanoe нравится это.
  4. obuhanoe

    obuhanoe Гик

    Добрый день. Какое то время назад, собирал уже такое без конвертера уровня сигнала и запустилось все сразу и работало долго.
    Проверял 2 ESP8266 и 2 TM1637.
    думал об этом, но пока не нашел.
     
  5. obuhanoe

    obuhanoe Гик

    Вы правы, проблема в уровнях сигнала была.
    Спасибо
     
  6. yden

    yden Гик

    Поподробнее можно?
    благодарю
     
  7. obuhanoe

    obuhanoe Гик

    добрый день
    у меня было собрано так - земля общая, а вот питание - ESP8266 3.3В, а экрана 5В. Если TM1637 посадить на 3,3В все работает. Можно это же сделать и через логический конвертер уровней.