• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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, а не о том, как вы повторяли проверенную другими самоделку.
 
Сверху Снизу