Модуль часов реального времени DS3231 и 24C32 I2C Отстает каждые 11 секунд на 1 сеунду
- Войдите на сайт для отправки комментариев
Вс, 14/01/2018 - 18:39
Добрый день
Проект делаю для себя, ардуинка к ней подключен экран 2004 по i2c, два датчика влажности и температуры dht22, содуль сетевой карты и модуль реального времени.
Проблема модуль часов реального времени DS3231 и 24C32 I2C Отстает каждые 11 секунд на 1 сеунду
модуль такой как на картинке
Код такой, батарейка новая, купил второй такойже модуль у другого продавца в другом городе, проблема осталась. Может кто знает куда копать.
#include <SPI.h> //библиотека для сетевой #include <Ethernet2.h> //библиотека для сетевой #include <Wire.h> //библиотека для инициализации I2C #include <LiquidCrystal_I2C.h> //библиотека для монитора #include "DHT.h" //библиотека для термодатчика #include <iarduino_RTC.h> //библиотека для датчика точного времени #define DHTPIN1 2 // пин для сигнала поступающего с датчика #define DHTPIN2 7 // пин для сигнала поступающего с датчика byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //Установка MAC адреса IPAddress ip(192, 168, 1, 177); //IP адресс IPAddress gateway(192, 168, 1, 254); //Шлюз IPAddress subnet(255, 255, 255, 0); //маска подсети EthernetServer server(80); //порт веб сервера DHT dht1(DHTPIN1, DHT22); //инициализация температурного датчика 1 DHT dht2(DHTPIN2, DHT22); //инициализация температурного датчика 2 iarduino_RTC time(RTC_DS3231); //инициализация датчика точного времени byte degree[8] = // кодируем символ градуса для вывода на экран { B00111, B00101, B00111, B00000, B00000, B00000, B00000, }; LiquidCrystal_I2C lcd(0x3F,20,4); // Задаем адрес и размерность дисплея int Relay1 = 3; //инициализируем реле на 3 пине int Relay2 = 4; //инициализируем реле на 4 пине void setup() { lcd.begin(); // Инициализация lcd lcd.backlight(); // Включаем подсветку lcd.createChar(1, degree); // Создаем символ под номером 1 time.begin(); //включаем датчик точного времени dht1.begin(); //включение температурного датчика 1 dht2.begin(); //включение температурного датчика 2 pinMode(Relay1, OUTPUT); //инициализация реле pinMode(Relay2, OUTPUT); //инициализация реле Ethernet.begin(mac, ip, gateway, subnet);//инициализация сетевой карты } void loop() { delay(1000); float h1 = dht1.readHumidity(); float t1 = dht1.readTemperature(); lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки lcd.print("Hum = % "); // Выводим текст lcd.setCursor(7, 0); // Устанавливаем курсор на 7 символ lcd.print(h1, 1); // Выводим на экран значение влажности lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки lcd.print("Temp = \1C "); // Выводим текст, \1 - значок градуса lcd.setCursor(7, 1); // Устанавливаем курсор на 7 символ lcd.print(t1,1); // Выводим значение температуры lcd.setCursor(0, 2); // Устанавливаем курсор в начало 1 строки lcd.print(Ethernet.localIP()); lcd.setCursor(0, 3); lcd.print(time.gettime("H:i:s, D " )); EthernetClient client = server.available(); if (client) { Serial.println("new client"); // an http request ends with a blank line boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); // if you've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so you can send a reply if (c == '\n' && currentLineIsBlank) { // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // the connection will be closed after completion of the response client.println("Refresh: 5"); // refresh the page automatically every 5 sec client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); // output the value of each analog input pin //for (int analogChannel = 0; analogChannel < 1; analogChannel++) { // int sensorReading = analogRead(analogChannel); client.print("Temperatura: "); client.print(t1); client.print("Hidro: "); client.print(h1); client.println("<br />"); // } client.println("</html>"); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(1); // close the connection: client.stop(); Serial.println("client disconnected"); } }
MasterMaa, IMHO любое отставание/убегание -это аппартная проблема. Из общих советов:
1- т.к. этот модуль под аккум -то нужно отключить цепь зарядки если ставите батарейку, иначе она быстро умрёт.
2- промыть спиртом плату если есть хоть малейшие следы флюса.
3- все контакты на пайку, провода минимальной длины.
3- питать желательно от 3,3 вольт.
PS: Происхождение этих плат тоже сомнительно, MAXIM продаёт эти чипы по 4$ /шт в партии 1000 шт. Китайцы продают по 1$ в розницу уже с платой... есть ли хоть один шанс что это не подделка? Риторический вопрос как говорится :)
Такой копеешный модуль работает у меня, скоро уже два года будет. Часики ушли вперед, где-то чуть меньше минуты. Подделка? Ничего не имею против таких подделок.
Цепь зарядки, диодик отпаять. да есть следы флюса но немного, промою.провода 20 см, менял.попробую найти аккум для них, СR2032 - 3 вольта дает. Думаю не подделка, брал у разных магазинов.
Цепь зарядки, диодик отпаять. да есть следы флюса но немного, промою.провода 20 см, менял.попробую найти аккум для них, СR2032 - 3 вольта дает.
литиевые батарейки нельзя проверить просто измерением напряжения, там может быть 3в, но она при этом может быть дохлой. Нужно чем-то нагрузить, и измерять. Я измеряю с подключеным паралельно резистором.
Думаю не подделка, брал у разных магазинов.
Какая разница в каком магазине, если производитель поддельных чипов один и тот же? :) Неподдельный стоит в разы больше, вот например в адафруте аналогичный модуль, 14$ . Микросхему отдельно рублей за 250 можно найти.
а зачем вам #include <iarduino_RTC.h> чем вас родная DS3231RTC.h не устраивает? может в библиотеке че перемудрили, и
lcd.print(time.gettime(
"H:i:s, D "
)); смущает почему минуты не m а i
1. Предложения про отмыть флюс конечно дельное,
но как и совет укоротить провода
происходит от безысходности :
а вдруг поможет, ну сделайте же хоть что нибудь.
2. Почему вы при проверке подозрительного железа
используете непонятно откуда взявшийся код
вместо запуска примера из библиотеки?????
а зачем вам #include <iarduino_RTC.h> чем вас родная DS3231RTC.h не устраивает? может в библиотеке че перемудрили, и
lcd.print(time.gettime(
"H:i:s, D "
)); смущает почему минуты не m а i
Попробую родную, не помню почему не пользовался родной. возможно из-за незнания.
насчет (
"H:i:s, D "
- показывает правильно, видно из библиотеку которую я взял, там так. Домой вернусь проверюКод писал сам, заисключением вебки, его просто взял с примера из библиотеки.
Да самое интересное, что если отключить питание, то, если я правильно понимаю, модуль должен дальше считать время.и с появлением питания отобразить.
Код писал сам, заисключением вебки, его просто взял с примера из библиотеки.
у вас там и ваш код, и куча обвески, и куча библиотек - как там они между собой разбмраются, нам неведомо.
после протирки (тонким слоем):
для диагностики 3231 отключите все ваши датчики/индикаторы, оставьте только ардуину + модуль часов. загрузите самый простой пример из библиотеки - только вывод времени в сериал.
Попробуйте подстроить часики как показано тута и подробнее ТУТКИ
Попробуйте подстроить часики как показано тута и подробнее ТУТКИ
Мощно, ток я не дорос ддо такой технике, придеться по знакомым поспрашивать. но направление интересное.
на данный момент сменил батарейки, аккумов не нашел, убрал диод, стала такая тенденция, после запуска идет просадка в 6 секунд отставания, но потом деградация не наблюдаеться, завтра смогу сказать увеличилось отставание или нет.