Arduino не сохраняет на SD правильно - PullRequest
0 голосов
/ 18 июня 2020

Я создал простой проект с моей дочерью, который снимает два временных показания и записывает их в файл на карте Micro SD.

Код довольно простой (если не немного запутанный) и создает файл, но только когда-либо, кажется, записывает одну и ту же строку данных дважды (из setup ()), а затем никогда не записывает снова, хотя, похоже, не вызывает ошибки.

Код:

#include <Wire.h> //Required for Realtime Clock
#include "RTClib.h" //Required for Realtime Clock
#include <SPI.h> //Required for SD card reader
#include <SD.h>  //Required for SD card reader

#include <dht11.h> //Required for Temp/humidity reader

#define DHTPIN 4  //Pin for temp sensor
#define LEDPIN 7  //Pin for led (status)
#define DHTTYPE DHT11 //define which temp sensor we are using (DHT11)

dht11 DHT11; //Create instance of DHT11 class to read sensor values
File myFile;
String filename;

uint32_t  start_min; //Store time the current loop started so we can work out how long we've been running for
RTC_DS3231 RTC;  //Create instance of real Time clock class

void setup() {

  Serial.begin(9600);  //start serial monitor for output
  Wire.begin();

  //begin the rtc, let us know if it fails
  if (! RTC.begin()) {
    Serial.println("Couldn't find RTC");
    abort();
  }

  Serial.print("Initializing SD card...");
  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    while (1);
  }

  Serial.println("initialization done.");
  //set RTC time and date to the time the app was compiled
  RTC.adjust(DateTime(__DATE__, __TIME__));

  //Get the current RTC time and sore it as a unix time
  DateTime now = RTC.now();
  start_min = now.unixtime();

  //Setup Filename
  String filename = String(start_min);
  int start = filename.length() - 8;
  int end = filename.length();
  filename = filename.substring(2,10) + ".csv";
  Serial.println(filename);

  //Write Header row
  myFile = SD.open(filename, FILE_WRITE);
  if(myFile) {
    myFile.println("timestamp|humidity|temperature1|temperature2");
    myFile.flush();
    myFile.close();
    delay(1000);
  }
  else {
    Serial.println("Error opening file");
  }
}

void loop() {

  //Get current RTC date and time
  DateTime now = RTC.now(); 

  //Convert to unix time
  uint32_t _now = now.unixtime();

 // work out if  x mins have passed
  if((_now - start_min) > (4*60)) {
    //Turn LED on
    digitalWrite(LEDPIN,HIGH);
    Serial.print("Looped - ");
    Serial.print(now.hour());
    Serial.print(":");
    Serial.println(now.minute());

    int chk = DHT11.read(DHTPIN);

    myFile = SD.open(filename, FILE_WRITE);
    if(myFile) {

      String output = String(now.getTimeStr());
      output += "|";
      output += String((float)DHT11.humidity,2);
      output += "|";
      output += String((float)DHT11.temperature, 2);
      output += "|";
      output += String(RTC.getTemperature());
      Serial.println(output);

      myFile.println(output);
      myFile.close();

      Serial.println("Write complete");
    } 
    else {
      Serial.println("Error opening file");
    }

    //reset start time
    start_min = now.unixtime();

  }

    delay(5000);
   //Turn LED off
   digitalWrite(LEDPIN,0);
   //wait 90 secs
   delay(5000);
}

Я использую Arduino Uno, DHT11 для температуры / влажности и DS3231 RT C (также захватывая темп).

После компиляции и загрузки. это результат:

Sketch uses 16798 bytes (52%) of program storage space. Maximum is 32256 bytes.

Global variables use 1290 bytes (62%) of dynamic memory, leaving 758 bytes for local variables. Maximum is 2048 bytes.

любая помощь оценена

...