Модуль часов реального времени 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 а i1. Предложения про отмыть флюс конечно дельное,
но как и совет укоротить провода
происходит от безысходности :
а вдруг поможет, ну сделайте же хоть что нибудь.
2. Почему вы при проверке подозрительного железа
используете непонятно откуда взявшийся код
вместо запуска примера из библиотеки?????
а зачем вам #include <iarduino_RTC.h> чем вас родная DS3231RTC.h не устраивает? может в библиотеке че перемудрили, и
lcd.print(time.gettime("H:i:s, D ")); смущает почему минуты не m а iПопробую родную, не помню почему не пользовался родной. возможно из-за незнания.
насчет (
"H:i:s, D "- показывает правильно, видно из библиотеку которую я взял, там так. Домой вернусь проверюКод писал сам, заисключением вебки, его просто взял с примера из библиотеки.
Да самое интересное, что если отключить питание, то, если я правильно понимаю, модуль должен дальше считать время.и с появлением питания отобразить.
Код писал сам, заисключением вебки, его просто взял с примера из библиотеки.
у вас там и ваш код, и куча обвески, и куча библиотек - как там они между собой разбмраются, нам неведомо.
после протирки (тонким слоем):
для диагностики 3231 отключите все ваши датчики/индикаторы, оставьте только ардуину + модуль часов. загрузите самый простой пример из библиотеки - только вывод времени в сериал.
Попробуйте подстроить часики как показано тута и подробнее ТУТКИ
Попробуйте подстроить часики как показано тута и подробнее ТУТКИ
Мощно, ток я не дорос ддо такой технике, придеться по знакомым поспрашивать. но направление интересное.
на данный момент сменил батарейки, аккумов не нашел, убрал диод, стала такая тенденция, после запуска идет просадка в 6 секунд отставания, но потом деградация не наблюдаеться, завтра смогу сказать увеличилось отставание или нет.