Запись на SD через определенный интервал

Тема в разделе "Arduino & Shields", создана пользователем SDV, 27 апр 2018.

  1. SDV

    SDV Нерд

    Код (C++):
    [code]
    #include <Wire.h> // библиотека для работы I²C
    #include "TroykaRTC.h"// библиотека для работы с часами реального времени
    #include <SPI.h> // библиотека для работы с SPI
    #include <SD.h> // библиотека для работы с SD-картами
    #include <iarduino_DHT.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x3f,16,2);
    iarduino_DHT sensor(2);

    #define SD_CS_PIN  7
    #define LEN_TIME 12 // размер массива для времени
    #define LEN_DATE 12 // размер массива для даты
    #define LEN_DOW 12 // размер массива для дня недели

    RTC clock; // создаём объект для работы с часами реального времени

    char time[LEN_TIME]; // массив для хранения текущего времени
    char date[LEN_DATE]; // массив для хранения текущей даты
    char weekDay[LEN_DOW]; // массив для хранения текущего дня недели

    String dataString = "";

    const int analogInPin = A0;  // выход с датчика давления
    float P = 0;   //задаем переменную для давления
     
    void setup()
    {
      Serial.begin(9600);   // открываем последовательный порт
      clock.begin();   // инициализация часов
      // clock.set(10,25,45,27,07,2005,THURSDAY);  // метод установки времени и даты в модуль вручную  
      //clock.set(__TIMESTAMP__);   // метод установки времени и даты автоматически при компиляции
      // закоментируйте оба метода clock.set();   // что бы время менялось при прошивки или сбросе питания
      Serial.println("Initializing SD card...");
      // если microSD-карта не была обнаружена
      if (!SD.begin(SD_CS_PIN)) {
        // выводим сообщение об ошибке
        Serial.println("Card failed, or not present");
        // don't do anything more:
        return;
      } else {
        Serial.println("Card initialized.");
      }
    }
     
    void loop()
    {
      int check; // переменная состояния датчика
      int temperature;  // переменная покозания температуры
      int humidity; // переменная показания влажности
      int sensorValue = 0;        // считанное значение
      dataString = "";
      sensorValue = readSensor(10);
      P = 1.562 * (sensorValue / 7.5) - 6.25;  // вычесляем давление
      // мониторинг ошибок
      // считывание данных с датчика DHT11
      check = sensor.read();
        clock.read();   // запрашиваем данные с часов
      clock.getTimeStamp(time, date, weekDay);   // сохраняем текущее время, дату и день недели в переменные
      Serial.print(time); // выводим в serial порт текущее время, дату и день недели
      Serial.print("\t"); // выводим в serial порт текущее время, дату и день недели
      Serial.print(date); // выводим в serial порт текущее время, дату и день недели
      Serial.print("\t"); // выводим в serial порт текущее время, дату и день недели
      Serial.println(weekDay); // выводим в serial порт текущее время, дату и день недели
      switch (check) {
        case DHT_OK: // всё OK
          temperature = sensor.tem; // считываем показания влажности и температуры
          humidity = sensor.hum;
          dataString += String(time);       // формируем строку с результатами показаний датчика
          dataString += "\t"; // ставим знак табуляции
          dataString += String(temperature);
          dataString += "\t";
          dataString += String(humidity);
          dataString += "\t";
          dataString += String(P);
          dataString += "\t";

          Serial.print(dataString);     // выводим результаты в serial-порт
       
          saveSD();      // сохраняем на microSD
          break;
        case DHT_ERROR_CHECKSUM:    // ошибка контрольной суммы
          Serial.println("Checksum error");
          break;
        default:     // неизвестная ошибка
          Serial.println("Unknown error");
          break;
      }
      lcd.init();  //включение дисплея
      lcd.backlight();   //включение подсветки
      lcd.print("27 C"); //выводим сообщение
      lcd.setCursor(0, 1); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print(P);//выводим сообщение
      lcd.setCursor(5, 1); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print("b");//выводим сообщение
      lcd.setCursor(8, 1); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print(time);//выводим сообщение
      lcd.setCursor(7, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print(temperature);//выводим сообщение
      lcd.setCursor(9, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print(" C");//выводим сообщение
      lcd.setCursor(12, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print(humidity);//выводим сообщение
      lcd.setCursor(14, 0); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print(" %");//выводим сообщение
      lcd.setCursor(7, 1); //вводим координаты следущего вывода (8 - столбец в строке, 1 - номер строки)
      lcd.print("S");//выводим сообщение
      delay(1000);  // ждём одну секунду
    }
    int readSensor(int samples){ // samples - сколько раз нужно прочитать сенсор

       unsigned int avg_sum=0;
       for(byte i=0;i<samples;i++){
           avg_sum+=analogRead(analogInPin);
           delay(5); // небольшая пауза между замерами
       }
       return avg_sum/samples;
    }
    void saveSD()
    {
      File dataFile = SD.open("sdv.txt", FILE_WRITE);  // создаём файл для записи
      if (dataFile) {   // если файл доступен для записи
        dataFile.println(dataString);     // сохраняем данные
        dataFile.close();    // закрываем файл
        Serial.println("Save OK");    // выводим сообщение об удачной записи
      } else {
        Serial.println("Error opening sdv.txt");    // если файл не доступен
      }
    }

     
    [/code]
    Помогите пожалуйста изменить код так, чтобы запись на SD происходила каждые 15 секунд, а не каждое считывание показаний с датчика DHT. Сам ни как разобраться не могу….
     
  2. a1000

    a1000 Гуру

    Объявите в начале переменную
    Код (C++):
    unsigned long timing; // Переменная для хранения точки отсчета
    А потом вызывайте функцию записи на CD по условию
    Код (C++):
    if (millis() - timing > 15000){ // Вместо 15000 можно подставить другую периодичность для сохранения
      timing = millis();
      saveSD();     // сохраняем на microSD
    }
     
  3. fogary

    fogary Гик

    arkadyf нравится это.
  4. SDV

    SDV Нерд

    Не получается... так. Программа ждет 15 секунд затем записывает, а потом выдает ошибку.
     
  5. SDV

    SDV Нерд

    Все! Разобрался, спасибо за помощь. а1000 написал все верно! Это я нубас!)