Добрый день. Возникла следующая проблема, залил скетч в 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); }
Есть подозрение, что TM1637 нужно подключать к ESP8266-01 через конвертер уровней сигнала. Ну или косяк в схеме соединений / программе.
Добрый день. Какое то время назад, собирал уже такое без конвертера уровня сигнала и запустилось все сразу и работало долго. Проверял 2 ESP8266 и 2 TM1637. думал об этом, но пока не нашел.
добрый день у меня было собрано так - земля общая, а вот питание - ESP8266 3.3В, а экрана 5В. Если TM1637 посадить на 3,3В все работает. Можно это же сделать и через логический конвертер уровней.