Логирование данных с нескольких датчиков температуры
- Войдите на сайт для отправки комментариев
Вс, 18/04/2021 - 07:29
Доброго дня. Нуждаюсь в совете как это реализуется и какой код должен быть. Изначально тестирую на двух датчиков DS18B20. Целью проекта снимать показания по адресу с 20 датчиков. На цифровой вход двух выходов подключить под 10штук и вести логирование на SD карту. Arduino Uno + SD модуль + rtc ds1307. Посмотрев реализацию в интернете написал сей код (какой есть)) )
Но значения у меня не выводятся, уже запутался в этом. И время не записывается в файл. Нужна ваша помощь
#include <RTClib.h> #include <SPI.h> #include <SD.h> #include <OneWire.h> #include <DallasTemperature.h> #define chipSelect 10 #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); uint8_t sensor1[8] = { 0x28, 0xFF, 0xDD, 0xC5, 0x68, 0x60, 0x19, 0x99 }; uint8_t sensor2[8] = { 0x28, 0xFF, 0x97, 0xC4, 0x68, 0x60, 0xCB, 0xA9 }; File myFile; RTC_DS1307 rtc; void setup() { Serial.begin(9600); sensors.begin(); while(!Serial); if(! rtc.begin()) { Serial.println("Couldn't find RTC"); while (1); } else { rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } if(! rtc.isrunning()) { Serial.println("RTC is NOT running!"); } Serial.print("Initializing SD card..."); if(!SD.begin(chipSelect)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); myFile=SD.open("DATA.txt", FILE_WRITE); if (myFile) { Serial.println("File opened ok"); myFile.println("Date,Time,Temperature ºC"); } myFile.close(); } void loggingTime() { DateTime now = rtc.now(); myFile = SD.open("DATA.txt", FILE_WRITE); if (myFile) { myFile.print(now.year(), DEC); myFile.print('/'); myFile.print(now.month(), DEC); myFile.print('/'); myFile.print(now.day(), DEC); myFile.print(','); myFile.print(now.hour(), DEC); myFile.print(':'); myFile.print(now.minute(), DEC); myFile.print(':'); myFile.print(now.second(), DEC); myFile.print(","); } Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.println(now.day(), DEC); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.println(now.second(), DEC); myFile.close(); delay(1000); } void loggingTemperature() { sensors.requestTemperatures(); delay(500); sensors.requestTemperatures(); delay(1000); Serial.print("Sensor 1: "); Serial.print("Sensor 2: "); Serial.println(" *C"); //Serial.print(f); //Serial.println(" *F\t"); myFile = SD.open("DATA.txt", FILE_WRITE); if (myFile) { Serial.println("open with success"); myFile.print("Sensor 1: "); myFile.print("Sensor 2: "); myFile.println(","); } myFile.close(); } void loop() { loggingTime(); loggingTemperature(); delay(1000); }
По отдельности что-то работает? Зачем всё сразу наваливать? Где лог монитора порта?
Сейчас проблема только в RTC, не синхронизируется с пк. Код подправил, взял из примеров, все заработало. Осталось только проверить на всех 20 датчиков и на большом временном промежутке. Лог порта убрал. А здесь есть ребята которые помогают в программировании кода? Ессесно за вознаграждение
Понял, спасибо
Доброго дня. Реализовал всю конструкцию, получилось 20 датчиков на одной линии и запись идет на sd карту. Есть только одна проблема, запись данных идет не более 10 часов. Дальше данные не пишутся, если только не перезапустить arduino. Никто не сталкивался с таким?
С каким - таким?
С тем что спустя определенное время данные перестают писаться на сд карту ииии все)
Да сколько угодно таких случаев. Вот у моего товарища был кот, который трогал провода на макетке, пока хозяин отсутствовал.
А если отбросить случаи когда самолет пролетел чайник закипел?
Так вот отбросьте эти случаи и приведите объективные данные, обнаруженные в результате исследования.
Например: с одним датчиком не вешается, с десятью - вешается через трое суток, с двадцатью - через 10 часов.
Датчики допускается программно отключать или только физически? Еще на питание думаю, везде пишут лучше его на цифровой вход ставить. Не тестировал, поставил на заметку. Из исследований делал только время измерений (1мин, 5мин, 30 мин) и замена портов - без изменений. Данные перестают записываться через 8-10 часов
И еще вопрос - если закрыть на это все глаза и поставить костыль ввиде таймера на сброс арудино или программно перезапуск(если есть, не в курсе еще) можно же назвать временным выходом? Собственно почему бы и нет, хоть и колхоз.
В коде хрень
К проблеме не относится, но: по какой схеме питание DS? Какой номинал кондера?
хоть один плюс от логирования на SD карту, а не в базу данных есть?
хоть один плюс от логирования на SD карту, а не в базу данных есть?
Не совсем понял что за база данных? На SD как самый распространенный вариант, в идеале на сервер конечно.
К проблеме не относится, но: по какой схеме питание DS? Какой номинал кондера?
Вечером доберусь до пк, напишу и нарисую все. С кодом подумаю что там.
хоть один плюс от логирования на SD карту, а не в базу данных есть?
Интернет не нужен?
STam, в сообщении #1 последняя версия кода? - если да, то там нет чтения температуры с датчиков вовсе, поэтому и выводить на экран и в лог просто нечего
STam, в сообщении #1 последняя версия кода? - если да, то там нет чтения температуры с датчиков вовсе, поэтому и выводить на экран и в лог просто нечего
Нет, это пробник первый. Вечером скину свою версию кода.
хоть один плюс от логирования на SD карту, а не в базу данных есть?
Интернет не нужен?
мне нет... можно жеж и в локальную базу лить...
мне непонятно, как далее с этой SD работают, девайс тушат что ли...
у меня так
Число записей в таблице - 117973
Данные по температуре за последние 120 минут!
Стандартное подключение которое было использовано. Число датчиков 23, все соединения пропаяны включая все контакты на самой arduino включая RTC и SD Module. Питание подается через штекер с блока питания +5В.
Сам код который используется.
Про массивы и циклы, стало быть, не слышали))
111 и 112 как то так себе
114: а если ровно в 30:00 контроллер будет чем то другим занятЪ, например отбывать блокирующий while из библиотеки Далласа?
Новичок по всем пунктам) Направление понял про for*, почитаю как делается. А что не так со временем?
А что не так со временем?
Ничего страшного, если бы не delay(1000) в каждом проходе loop(). Кстати, зачем он там? С учетом этого, условие может и не выполниться при неудачном стечении обстоятельств. Особенно, учитывая тот факт, что чтение данных из RTC тоже не супер-быстрая процедура.
И еще момент, не связанный с кодом. Каждый датчик по ДШ жрет от 1 до 1,5 мА, а у вас их 23. Не многовато тока на одну ногу? Особенно с учетом того, что они все хором вам рапортуют. Я уже не говорю об электролите, который просится на питание шины
Еще заметил: 63 и 65 как то не складываются у меня в один пазл
И еще не понял, зачем в одном проходе цикла постоянно дергать файл open/close? Нельзя все сразу записать?
А что не так со временем?
Ничего страшного, если бы не delay(1000) в каждом проходе loop().
ИМХО странно что вообще что-то пишется при таком строгом условии и такими таймингами... мне когда считать лень я использую флаг события...
скажем в 30:00 что-то делаю и флаг опускаю, а в 35:00 флаг поднимаю...
ИМХО странно что вообще что-то пишется при таком строгом условии и такими таймингами...
Скорее всего, в этом и есть причина. Какое то время все работает нормально, пока rtc.now() выполняется в начале 59-й секунды. Но начало цикла с каждым проходом сдвигается на несколько миллис и в какой то момент чтение RTC возвращает близкое к 29:59:999. И тут кажется, что все накрылось тазом, ибо после этого сразу наступает 30:01.
если дело в таймингах - из этого следует что в следующий час оно снова может сработать.
ТС. когда ваша программа через 10 часов перестает писать логи - вы пробовали оставить работать ее дальше? Может на 11 часу она снова будет писать?
А вообще весь код - просто кровь из глаз. Яркое подтверждение правила - если новичку в первом же проекте нужно 20 датчиков - это исключительно от дурости... ой. простите. я хотел сказать от неопытности :)
- это исключительно от дурости... ой. простите. я хотел сказать от неопытности :)
Если хотели так сказать, то зачем написали по другому?
не уймусь - обрабатывать данные физически как собираетесь?
А вообще весь код - просто кровь из глаз. Яркое подтверждение правила - если новичку в первом же проекте нужно 20 датчиков - это исключительно от дурости... ой. простите. я хотел сказать от неопытности :)
Исхожу от целей, мне для исследований надо 20 датчиков.
если дело в таймингах - из этого следует что в следующий час оно снова может сработать.
ТС. когда ваша программа через 10 часов перестает писать логи - вы пробовали оставить работать ее дальше? Может на 11 часу она снова будет писать?
Нет, дальше не пишет. Проверил на временном отрезке 48 часов.
не уймусь - обрабатывать данные физически как собираетесь?
Да вроде тут нет проблем, тот же Origin.
Берёшь несколько светодиодов, заставляешь их моргать каждый луп, каждый момент записи и пр. Включаешь и ждёшь 10 часов. Перестали моргать все - система зависла, только тот, что "запись" - в условие не попадаешь, моргают все, но данных на карте нет - проблема в районе SD.
Похоже перегревается КРЕН в ардуинке (пальцем через полчаса потрогайте). Питание нормально организуйте и всё заработает.
Похоже перегревается КРЕН в ардуинке (пальцем через полчаса потрогайте). Питание нормально организуйте и всё заработает.
Там вроде греться то не от чего. Пустой луп гоняетсо. Надо бы по человечески весь код переписать и там уже смотреть. Уверен, проблема исчезнет
UPD: Схему подключения питания ДСок не видел, но даже если от ноги, то с такой периодичностью не должно быть проблем.