• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

esp-12e и индикатор TM1637

YDen

Member
Здравствуйте.
Ребята, подскажите пожалуйста, не могу разобраться. Подключаю к esp-12e индикатор TM1637 - делаю часы аналогично статье: Дисплей на TM1637, часы с синхронизацией по NTP и программирование "народных" WiFi в среде Ардуино
Питание для индикатора беру с VCC (индикатор 5в), esp питаю от usb. На индикаторе горит диод питания. Выводы подключаю как в статье. Но не работают часы (нет циферок), хотя монитор показывает что esp взял значение времени с ntp.
Код из статьи:
Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include "TM1637.h"
#define TM1637_CLK  4
#define TM1637_DIO  5

TM1637 tm1637(TM1637_CLK,TM1637_DIO);

#define AP_SSID                  "m12"
#define AP_PASS                  "89086401772"

#define TIMEZONE 8

char ssid[] = "m12";  //  your network SSID (name)
char pass[] = "89086401772";       // your network 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;

void setup()
{
   Serial.begin(115200);
   Serial.println("");
   Serial.println("");
   Serial.print("Free Memory: ");
// Соединение с WiFi 
   Serial.println(ESP.getFreeHeap());
   if( !ConnectWiFi(AP_SSID,AP_PASS) ){
       Serial.println("Reset ESP8266 ...");
       ESP.reset();
   }
   delay(1000);
// Инициализация дисплея
  tm1637.init();
// Установка яркости дисплея
  tm1637.set(7);
 
// Инициализауия UDP соединения с NTP сервером
   Serial.println("Starting UDP");
   udp.begin(localPort);
   Serial.print("Local port: ");
   Serial.println(udp.localPort());
}

void loop(){
   cur_ms       = millis();
   t_cur        = cur_ms/1000;
// Каждые 60 секунд считываем время в интернете
   if( cur_ms < ms2 || (cur_ms - ms2) > 3600000 ){
       err_count++;
// Делаем три  попытки синхронизации с интернетом
       if( GetNTP() ){
          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 ){
       Serial.println("NTP connect false");
       Serial.println("Reset ESP8266 ...");
       ESP.reset();
  
   }
   delay(100);
}

/**
* Соединение с WiFi
*/
bool ConnectWiFi(const char *ssid, const char *pass) {
// Три попытки соединения по WiFi
   for( int i=0; i<3; i++){
      Serial.print("\nConnecting to: ");
      Serial.println(ssid);
      WiFi.begin(ssid,pass);
      delay(1000);
// Максиммум 12 раз проверка соединения     
      for( int j=0; j<12; j++ ){
          if (WiFi.status() == WL_CONNECTED) {
              Serial.print("\nWiFi connect true: ");
              Serial.print(WiFi.localIP());
              Serial.print("/");
              Serial.print(WiFi.subnetMask());
              Serial.print("/");
              Serial.println(WiFi.gatewayIP());
              return true;
          }
          delay(1000);
          Serial.print(WiFi.status());
      }
   } 
   Serial.println("\nConnect WiFi failed ...");
   return false;
}

/**
* Выдача текущего времени на индикатор
*/
void DisplayTime(void){
   uint16_t m = ( ntp_time/60 )%60;
   uint16_t h = ( ntp_time/3600 )%24;
   Serial.print("Time: ");
   Serial.print(h);
   Serial.print(":");
   Serial.println(m);
   tm1637.point(points);
   tm1637.display(0,h/10);
   tm1637.display(1,h%10);
   tm1637.display(2,m/10);
   tm1637.display(3,m%10);
  
}


/**
* Посылаем и парсим запрос к NTP серверу
*/
bool GetNTP(void) {
  WiFi.hostByName(ntpServerName, timeServerIP);
  sendNTPpacket(timeServerIP);
  delay(1000);
  int cb = udp.parsePacket();
  if (!cb) {
    Serial.println("No packet yet");
    return false;
  }
  else {
    Serial.print("packet received, length=");
    Serial.println(cb);
// Читаем пакет в буфер  
    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;  
    Serial.print("Unix time = ");
    Serial.println(ntp_time);
  }
  return true;
}

/**
* Посылаем запрос NTP серверу на заданный адрес
*/
unsigned long sendNTPpacket(IPAddress& address)
{
  Serial.println("sending NTP packet...");
// Очистка буфера в 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();
}
спасибо
 

Юрий Ботов

Moderator
Команда форума
  1. #define TM1637_CLK 4
  2. #define TM1637_DIO 5
4 и 5 вы воспринимаете как в ардуине как номера ног или как GPIO как в ESP?
 

mishgan

Member
Уже весь мозг себе сьел.
Не могу подружить TM1637 и NodeMCU. Гружу следующий код
Код:
#include "TM1637.h"

int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};

#define CLK 5 
#define DIO 4
TM1637 tm1637(CLK,DIO);

void setup()
{
  tm1637.set();
  tm1637.init();

}
void loop()
{
    TimeUpdate();
    tm1637.display(TimeDisp);
delay (3000);
}
void TimeUpdate(void)
{
  TimeDisp[0] = 1;
  TimeDisp[1] = 2;
  TimeDisp[2] = 3;
  TimeDisp[3] = 4;

}
Но дисплей ничего не отображает. CLK подключен к D1 (GPIO5). DIO подключен к D2 (GPIO4). Лампочка питания горит на циферблате. В ардуине все работает отлично. А esp не хочет работать. Делаю все в arduino ide 1.6.5. Что я делаю не так?
 

mishgan

Member
Разобрался наконец-то. Все сделал как вот в этом видео
. Библиотеку взял от туда-же и пины поставил такие-же
 

udavst

New member
Ну и к чему тут это Ваше видео? Лучше бы написали коротко, в чём были грабли, ведь вопрос был о неработающем индикаторе в esp, а не о том, как вы повторяли проверенную другими самоделку.
 
Сверху Снизу