Мои часы реального времени блокируют мой Arduino? Если да, то как мне это решить?
У меня очень странная проблема с часами реального времени в Arduino, которую я не могу решить. По сути, у меня есть программа, которая записывает данные из террариумного комплекта и сохраняет каждый сеанс на SD-карту в виде файла, названного в честь времени запуска программы. 0
Проблема программы в том, что код зависает на операторе перед разделом настройки: «DateTime now = RTC.now()». Кажется, что часы реального времени работают правильно в примере программы, что делает эту проблему еще более странной. Я не уверен, является ли это чисто программной или аппаратной проблемой. Просматривая Интернет, я нашел людей с похожей на мою проблемой: RTC зависает на шине i2c на Arduino. Однако я не уверен, беспокоит ли меня эта проблема. Если это действительно проблема моей программы, я не знаю, как ее обойти. Я нашел онлайн-решение здесь, однако моя программа зависает при запуске, поэтому у меня это не сработает.
На данный момент я попробовал: -Замена батарейки типа «таблетка» в часах реального времени (я использую батарейки на 3 Вольта) -Замена щитка регистратора на новый. -Замена Arduino на новую -Проверка правильности припаивания перемычек к щитку регистратора данных (служба поддержки Adafruit проверила мои изображения и сказала, что они выглядят хорошо)
Я запускаю эту программу в IDE версии 1.6.9 с помощью программы с новым модулем регистрации данных Adafruit на Arduino Mega.
Будем очень благодарны за любую помощь
//Библиотеки, которые нам нужны для нашего террариумного набора
//Скачайте и установите их все по этой ссылке: https://drive.google.com/drive/folders/10XAFdYmnyz0dg9I6YYj80vJlHebFIZhN
#include <OneWire.h> //Импортируем библиотеку OneWire
#include <DallasTemperature.h> //Импортируем библиотеку DallasTemperature
#include <Adafruit_Sensor.h> //Импортируем библиотеку Adafruit Sensor
#include <DHT.h> //Импортируем первую часть библиотеки DHT
#include <TimerOne.h> //Импортируем библиотеку TimerOne
#include <SPI.h>
#include <SD.h> //это относится к старой SD-библиотеке, необходимой специально для
#include "RTClib.h" //это из примера кода папки rtc
//SD-карта & Часы реального времени: инициализация
File logfile;
RTC_DS1307 RTC;
//Датчик влажности: константы
//Этот #define определяет контакт, к которому подключен DHT
#define DHT_PIN 2
//Этот #define определяет тип DHT
#define DHT_TYPE DHT22
//Это сообщает коду, что DHT подключен к порту DHT_PIN и что DHT имеет тип DHT_TYPE
DHT dht(DHT_PIN, DHT_TYPE);
//Датчик влажности: переменные
int MS_sigPin = A5; //Устанавливаем сигнальный контакт как аналоговый контакт 5
int MS_digPin = 7; //Установим цифровой вывод как 2
float MS_upper = 0; //Объявляем переменную с наибольшим значением
//Другие переменные
int measurementNumber = 1; //Количество проведенных измерений
//Имя файла:
DateTime now = RTC.now(); //Инициализируем RTC
// Строка секунд = (String)(now.секунда()); //Сохраняет секунды из RTC после настройки в виде строки
const String minutes = (String)(now.minute()); //Сохраняет секунды из RTC после настройки в виде строки
const String hours = (String)(now.hour()); //Сохраняет секунды из RTC после настройки в виде строки
const String days = (String)(now.day()); //Сохраняет секунды из RTC после настройки в виде строки
const String months = (String)(now.month()); //Сохраняет секунды из RTC после настройки в виде строки
const String years = (String)(now.year()); //Сохраняет секунды из RTC после настройки в виде строки
const String filename = "D_" + minutes + hours + days + months + years; //Создаем имя файла как временную метку
void setup() {
int chipSelect = 10; //chipSelect контакт для SD-карты
// поместите сюда свой код установки для однократного запуска:
Serial.begin(115200); //Установим скорость передачи данных 56700 бод
//Если RTC уже обновлен, ниже закомментировано
RTC.begin();
RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));//это принудительное обновление RTC
// если (!RTC.isrunning()) {
//
// Serial.println("RTC НЕ работает! Запускаем его сейчас.");
// RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
//
// }// завершаем RTC, если
//{
//Ниже скопировано из проводного соединения, содержит вторую попытку, в надежде на успех.
pinMode(chipSelect, OUTPUT);
digitalWrite(chipSelect, HIGH);
SD.begin(chipSelect);
// if (!SD.begin(10, 11, 12, 13)) {
// Serial.println("Карта неисправна или отсутствует");
// задержка(50);
// Serial.println("Повторяем попытку...");
// if (!SD.begin(50, 51, 52, 53)) {
// Serial.println("Карта неисправна или отсутствует");
// }
// }
/******************************** CSV FORMAT ******************************/
// Serial.print("Текущая позиция: ");
// Serial.println(logfile.position());
if(logfile.position() == 0)//Ниже строки заголовка печати файла данных
logfile.println("Unix Time, Date, Time, Light, Humidity, Temperature");
//logfile.println("uni,date,time,Temperature");
/**************************************************************************/
// датчики.begin();
// датчики.setResolution(12);
//Датчик влажности:
dht.begin();
//Датчик влажности:
pinMode(MS_sigPin, OUTPUT); //Устанавливаем сигнальный контакт как выход
pinMode(MS_digPin, OUTPUT); //Устанавливаем цифровой вывод как выход
digitalWrite(MS_digPin, HIGH); //Включаем цифровой пин
Serial.println("DIP THE MOISTURE SENSOR IN A CUP OF WATER MAKING SURE NOT TO SUBMERGE THE TOP OF IT INTO THE WATER, ENTER IN ANY KEY WHEN YOU ARE READY TO CALIBRATE"); //Распечатываем полезную информацию
while (Serial.available() == 0) // Подвешиваем программу, пока пользователь не введет ключ для продолжения
{
}
Serial.println("Starting Calibration"); //Распечатываем полезную информацию
Timer1.initialize(1000000); //Инициализируем прерывание каждую 1 секунду
Timer1.attachInterrupt(Calibrate); //При вызове прерывания запускаем функцию «Калибровка»
}
//Калибруем датчик влажности
void Calibrate() //Функция для калибровки датчика
{
if (analogRead(MS_sigPin) > MS_upper) //Если значение, считанное датчиком, выше, чем последнее самое высокое значение
{
MS_upper = analogRead(MS_sigPin); //Устанавливаем текущее значение как новое максимальное значение
}
}
void loop() {
//Фотоэлемент: переменные
int photocellPin = A0; // ячейка и раскрывающийся список 10 КБ подключены к a0
char fileCharStorage[(filename.length()+5)]; //+4 символа для включения ".csv"
filename.toCharArray(fileCharStorage, filename.length()+5);
fileCharStorage[filename.length()] = 'V'; //Устанавливаем имя файла
fileCharStorage[filename.length()-1] = 'S'; //Устанавливаем имя файла
fileCharStorage[filename.length()-2] = 'C'; //Устанавливаем имя файла
fileCharStorage[filename.length()-3] = '.'; //Устанавливаем имя файла
Serial.println(filename); //Распечатываем имя файла
Serial.println(sizeof(fileCharStorage)); //Распечатываем длину массива, в котором хранится имя файла
logfile = SD.open(fileCharStorage, FILE_WRITE); //Создает (или открывает) файл с именем "MMHHDDMMYYYY.CSV"
if (logfile)
{
Serial.println("The SD Card is functioning properly");
}
else
{
Serial.println("A Critical Error occured while trying to initialize the SD Card!");
}
//Часы реального времени
DateTime now = RTC.now();
//Фотоэлемент:
int photocellReading = analogRead(photocellPin); //Переменная, в которой хранится количество света, обнаруженное фотоэлементом, в виде целого числа
// Этот код получает данные о влажности от DHT
float dhtHumidity = dht.readHumidity();
/*
This code gets the temperature from the DHT
*/
float dhtTemperature = dht.readTemperature();
Serial.println(""); //Форматирование текста
Serial.println("Starting New Measurement (" + (String)measurementNumber + ")");
Serial.println(""); //Форматирование текста
delay(1000);
//Распечатываем данные по количеству проведенных измерений
Serial.println("The Arduino has been active for " + (String)((measurementNumber*10)-10) + " seconds");
measurementNumber++;
//Распечатываем данные из RTC
Serial.print("Unix Time (Seconds since 1/1/1970): ");
Serial.print(now.unixtime()); // секунды с 01.01.1970
Serial.println(", ");
Serial.print("RTC time: ");
Serial.print(now.month(), DEC);
Serial.print("/");
Serial.print(now.day(), DEC);
Serial.print("/");
Serial.print(now.year(), DEC);
Serial.print(",");
Serial.print(now.hour(), DEC);
Serial.print(":");
Serial.print(now.minute(), DEC);
Serial.print(":");
Serial.print(now.second(), DEC);
Serial.println("");
Serial.println("");
//Фотоэлемент:
Serial.println("Data from the photocell:");
Serial.print("Analog reading = ");
Serial.print(photocellReading); // необработанное аналоговое чтение
if (photocellReading < 10) {
Serial.println(" - Dark"); //говорит, что если какое-либо число меньше 10, оно печатается темным цветом.
} else if (photocellReading < 200) {
Serial.println(" - Dim"); //говорит, что если какое-либо число меньше 200, то выводится dim.
} else if (photocellReading < 500) {
Serial.println(" - Light"); //говорит, что если какое-либо число меньше 500, то выводится свет.
} else if (photocellReading < 800) {
Serial.println(" - Bright"); //говорит, что если какое-либо число меньше 800, оно печатается ярко
} else {
Serial.println(" - Very bright"); //говорит, что если какое-либо число больше 800, то оно печатается очень ярко
}
Serial.println("");
// Датчик влажности:
Serial.println("Data from the humidity sensor:");
Serial.print("Humidity: ");
Serial.print(dhtHumidity);
Serial.print(" %, Temp: ");
Serial.print(dhtTemperature);
Serial.println(" Celsius");
Serial.println("");
//Датчик влажности:
Serial.println("Data from the moisture sensor:");
float percent = (analogRead(MS_sigPin)/MS_upper)*100; //Рассчитываем процент влажности
Serial.println("Moisture = " + (String)percent + "%"); //Распечатываем процент влажности
Serial.println("");
Serial.println("--------------------------------------------------");
//Записываем все на SD-карту
logfile.print(now.unixtime()); // секунды с 01.01.1970
logfile.print(", ");
logfile.print(now.month(), DEC);
logfile.print("/");
logfile.print(now.day(), DEC);
logfile.print("/");
logfile.print(now.year(), DEC);
logfile.print(",");
logfile.print(now.hour(), DEC);
logfile.print(":");
logfile.print(now.minute(), DEC);
logfile.print(":");
logfile.print(now.second(), DEC);
logfile.print(", ");
logfile.print(photocellReading);
logfile.print(", ");
logfile.print(dhtHumidity);
logfile.print(", ");
logfile.print(dhtTemperature);
logfile.println();
logfile.close();
// Задержка на 1+9 (10) секунд между измерениями
delay(9000);
}
1 ответ
Я предполагаю, что вы не можете вызвать RTC.now()
до такой настройки.
Было бы полезно, если бы вы рассказали нам, какой RTC вы использовали, и предоставили ссылку на библиотеку, которую вы для этого использовали.
Полагаю, поскольку у меня нет этой информации, вам, вероятно, следует изменить объявление следующим образом:
//Имя файла:
DateTime now;
И затем в вашем setup()
:
RTC.begin();
if (!RTC.isrunning()) {
Serial.println("RTC is NOT running! Starting it now.");
RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
} // завершаем RTC, если
now = RTC.now(); //Инициализируем RTC
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора