ESP8266 с экраном RTC DS1307 - Экран WS2818B не мигает - проблема с I2C?

Уважаемые дамы и господа,

Я бы хотел, чтобы светодиод мигал в зависимости от времени суток. Поэтому я взял Wemos D1 mini и экран WS2818B и экран RTC DS107 для вышеупомянутой модели ESP8266.

Основываясь на моих наблюдениях, я могу позволить светодиоду мигать самостоятельно, не начиная инициализацию RTC. Как только я инициализирую связь с экраном DS1307, экран светодиода не будет переводить какие-либо команды в желаемое поведение (например, светодиод больше не будет мигать).

Что я делаю не так?

Я использую Ardunio IDE для программирования D1 mini.

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

Используемые библиотеки:
RTC: https://github.com/Makuna/Rtc
СВЕТОДИОД: Adafruit NeoPixel

Код:

// WIFI
#include <ESP8266WiFi.h>


// RTC
#include <RtcDateTime.h>
#include <RtcUtility.h>
#include <Wire.h> // должен быть включен здесь, чтобы ссылки на объектные файлы библиотеки Arduino работали
#include <RtcDS1307.h>
RtcDS1307<TwoWire> Rtc(Wire);

// СВЕТОДИОД
#include <Adafruit_NeoPixel.h>
#define PIN        D2
#define NUMPIXELS 1
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ400);


int DELAYVAL = 1000; // Время (в миллисекундах) для паузы между пикселями



void setup() {
  
  Serial.begin(57600);
  Serial.println();
  Serial.flush();
  
  setupLed();

  setupWifiConnection();

  setupRtc();

}


void loop() {


  pixels.clear(); // Установите для всех цветов пикселей значение "выкл."
  pixels.show();   // Отправить обновленные цвета пикселей на оборудование.
  delay(DELAYVAL); // Пауза перед следующим прохождением цикла


  pixels.setPixelColor(0, pixels.Color(0, 150, 0));
  pixels.show();   // Отправить обновленные цвета пикселей на оборудование.
  delay(DELAYVAL); // Пауза перед следующим проходом
  
}



void setupRtc () {

  Rtc.Begin();

  RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
  Serial.println();

  if (!Rtc.IsDateTimeValid()) 
  {
      if (Rtc.LastError() != 0)
      {
          // у нас ошибка связи
          // см . https://www.arduino.cc/en/Reference/WireEndTransmission для
          // что означает это число
          Serial.print("RTC communications error = ");
          Serial.println(Rtc.LastError());
      }
      else
      {
          // Общие причины:
          // 1) при первом запуске, а устройство еще не работало
          // 2) батарея на устройстве разряжена или даже отсутствует

          Serial.println("RTC lost confidence in the DateTime!");
          // следующая строка устанавливает RTC на дату и время, когда был скомпилирован этот скетч
          // он также сбросит допустимый флаг внутренне, если устройство Rtc не
          // возникли проблемы

          Rtc.SetDateTime(compiled);
      }
  }

  if (!Rtc.GetIsRunning())
  {
      Serial.println("RTC was not actively running, starting now");
      Rtc.SetIsRunning(true);
  }

  RtcDateTime now = Rtc.GetDateTime();
  if (now < compiled) 
  {
      Serial.println("RTC is older than compile time!  (Updating DateTime)");
      Rtc.SetDateTime(compiled);
  }
  else if (now > compiled) 
  {
      Serial.println("RTC is newer than compile time. (this is expected)");
  }
  else if (now == compiled) 
  {
      Serial.println("RTC is the same as compile time! (not expected but all is fine)");
  }

  // никогда не предполагайте, что Rtc был настроен вами в последний раз, поэтому
  // просто очистите их до нужного вам состояния
  Rtc.SetSquareWavePin(DS1307SquareWaveOut_Low); 
}

void setupLed () {
  
  pixels.begin();

  pixels.clear();
  pixels.show();
}


void setupWifiConnection () {
  
  WiFi.begin("some ap", "some password");

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
}

, 👍1

Обсуждение

Можете ли вы проверить, если и где код застревает? Вы можете сделать это, вставив серийные отпечатки в нескольких позициях, чтобы отследить точное местоположение проблемы, @chrisl

пожалуйста , опишите , что вы наблюдаете ... добавьте описание к своему сообщению, а не к комментариям... похоже, что setupRtc должен генерировать некоторый вывод на последовательный монитор, @jsotola


1 ответ


2

Согласно вашему коду, вы подключили Neopixel к D2. RTC - это устройство I2C, поэтому оно также подключено к D2. Как это должно работать? Neopixel не является устройством I2C.

Переместите Neopixel на другой вывод, который больше ничем не используется - так что не D1. Попробуйте D3. Обновите свой код, чтобы использовать D3. Могут быть и другие проблемы, но, по крайней мере, вы не будете пытаться использовать один и тот же выход для связи с двумя совершенно разными устройствами.

,

Абсолютно правильно. Что я заметил, так это тот факт, что Neopixel LED shield не является устройством I2C. Как и было предложено, я подключил контакт к D3, и он сразу же заработал. Спасибо тебе, @romkey., @owi