Мои часы реального времени блокируют мой 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);
}

, 👍0


1 ответ


2

Я предполагаю, что вы не можете вызвать 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
,