Проблемы с rtc ds1302 и card reader spi

Тема в разделе "ESP8266, ESP32", создана пользователем Buzya, 17 апр 2021.

  1. Buzya

    Buzya Нуб

    Здравствуйте, делаю курсовую работу по теме "Разработка и программирование термогигрометра на базе Arduino". Написал уже полностью скетч который читает данные с модуля dht11 и сохраняет их на microsd. Далее при подключении модуля rtc ds1302 файл перестал создаваться на microsd. Методом тыка я выяснил что дело в строчке rtc.begin(). Когда она закоментированна файл создается и все работает исправно, только без времени соответственно, а когда строчка активна программа почему то перестает сохранять данные в файл. Ниже прикрепляю код, надеюсь на вашу помощь.
    Код (C++):
    //Раздел 1
    //Измерение температуры и влажности
    //Запись на карту памяти
    //SD card attached to SPI bus as follows:
    //MOSI - pin 11
    //MISO - pin 12
    //SCK - pin 13
    //CS - pin 10(SS pin)
    //Раздел 2
    //Используется бибилиотека:
    //DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
    #include <DHT.h>
    //Подключаем библиотеки для SD ридера
    #include <SPI.h>
    #include <SD.h>
    //Подключаем библиотеку для часов реального времени
    #include "RTClib.h"

    //SS - pin 10
    const int chipSelect = 10;

    //Используется датчик DHT11
    #define DHTTYPE DHT11 // Строка означает, что переменная DHTTYPE=DHT11
    //Датчки подключим к цифровому порту 4
    #define DHTPIN D14 //Строка означает, что переменная DHTPIN=4
    //Инициализируем датчик DHT11
    //Создадим Объект dht Класса DHT с параметрами DHTPIN и DHTTYPE
    DHT dht(DHTPIN, DHTTYPE);
    //Создадим объект rtc класса DS1302 с параметрами D8, D6, D7
    DS1302 rtc(D8, D6, D7);

    //Раздел 3
    void setup()
    { //открываем порт на скорости 9600 бод
      Serial.begin(9600);
      while (!Serial) {
       ; //ждем подключения порта
      }
      //Подключаем SD карту
       Serial.print("Подключение SD карты...");

      // Проверяем подключение карты, пока это не случится:
      if (!SD.begin(chipSelect)) {
        Serial.println("Карта не читается, или отсутствует");
       while(1);
      }
      Serial.println("Карта установлена.");
      //Приветствие перед началом работы датчика
    Serial.println("Начинаем измерять влажность и температуру");
    //"Открываем" датчик измерения температуры и влажности
    dht.begin();
    //Запускаем rtc модуль
    rtc.begin();
      //Проверяем модуль на работоспособность
    if (!rtc.isrunning()) {
       Serial.println("RTC не работает!");}
    }
     
    void loop()
    {
    // Чтение температуры и влажности занимает примерно 250 мс!
    // Датчик очень медленный, может выдавать данные 2-х
    //секундной давности
    //Используем Метод readHumidity Объекта dht
    //Влажность записываем в переменную h типа float
    float h = dht.readHumidity();
    //Используем Метод readTemperature Объекта dht
    //Температуру в градусах Цельсия записываем в переменную h
    //типа float
    float t = dht.readTemperature();
    //Проверим данные на выходе датчика. Проверяем, пока данные не
    //появятся
    if (isnan(h) || isnan(t)) {
    //Нет данных? Выводим сообщение об ошибке в
    //последовательный порт
    Serial.println("Ошибка датчика!");
    //Возвращаемся к проверке данных на выходе датчика
    return;
    }
    //Создаем переменную даты и времени
    DateTime now = rtc.now();
    //Выводим данные в серийный порт
    Serial.print("Влажность: ");
    Serial.print(h);
    Serial.print("% Температура: ");
    Serial.print(t);
    Serial.print("°C ");
    Serial.println(now.toStr());


     
      //Создаем строку, в которой будем писать влажность и температуру
      String dataString = "";
      // Записываем подряд влажность,температуру и дату/время через ";"
      dataString = String(h, 2)+";"+String(t, 2)+";"+now.toStr();
      //Открываем файл на карте памяти
      File dataFile = SD.open("datalog.csv", FILE_WRITE);
      //Если с файлом все хорошо, то пишем переменную dataString
      if (dataFile) {
        dataFile.println(dataString);
        dataFile.close();
        //Для проверки пишем тоже в монитор порта
        Serial.println(dataString);
      }
      //Если что-то не так то
      else {
         Serial.println("Ошибка при открытии datalog.csv");
      }
      //Делаем паузу между измерениями пару секунд, см. коммент.
    //ниже
    delay(3000);
    }
    Используется плата Wemos D1 R2.
     
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

    На одной шине стояли часы и OLED дисплей. На дисплее отображались кракозябры. Потому что в память дисплея пролезали артефакты обмена по шине часов с ардуиной. Поэтому пришлось перед циклом работы с дисплеем вводить команду обнуления памяти дисплея. Может у вас что-то подобное с кардридером.
     
  3. ZAZ-965

    ZAZ-965 Гуру

    @Buzya, замените DS1302 с трехпроводным интерфейсом на I2C DS3231.
     
  4. a1000

    a1000 Гуру

    У вас часы вообще запустить получилось. Возьмите пример из библиотеки с выводом времени в монитор.
     
  5. Buzya

    Buzya Нуб

    да запустить получилось, проблема не в часах, а в том что кард ридер перестает создавать файл, когда часы появляются в основном скетче
     
  6. Buzya

    Buzya Нуб

    видимо прийдется так и сделать, потому что дедлайн уже 30 апреля