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());
}
@owi, 👍1
Обсуждение1 ответ
Согласно вашему коду, вы подключили Neopixel к D2. RTC - это устройство I2C, поэтому оно также подключено к D2. Как это должно работать? Neopixel не является устройством I2C.
Переместите Neopixel на другой вывод, который больше ничем не используется - так что не D1. Попробуйте D3. Обновите свой код, чтобы использовать D3. Могут быть и другие проблемы, но, по крайней мере, вы не будете пытаться использовать один и тот же выход для связи с двумя совершенно разными устройствами.
Абсолютно правильно. Что я заметил, так это тот факт, что Neopixel LED shield не является устройством I2C. Как и было предложено, я подключил контакт к D3, и он сразу же заработал. Спасибо тебе, @romkey., @owi
- Подключение esp8266 к контактам видеодомофона spi/i2c
- OVF в последовательном мониторе вместо данных
- Путаница между SPI и I2C для SSD1306 OLED
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?
- I2C и SPI одновременно?
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- Последовательная связь между несколькими устройствами (или ардуино)
- esp8266-01 и Arduino UNO обмен данными через i2c
Можете ли вы проверить, если и где код застревает? Вы можете сделать это, вставив серийные отпечатки в нескольких позициях, чтобы отследить точное местоположение проблемы, @chrisl
пожалуйста , опишите , что вы наблюдаете ... добавьте описание к своему сообщению, а не к комментариям... похоже, что setupRtc должен генерировать некоторый вывод на последовательный монитор, @jsotola