Метеостанция на Iskra Neo

Тема в разделе "Arduino & Shields", создана пользователем Yaroslav1, 15 июл 2019.

  1. Yaroslav1

    Yaroslav1 Нерд

    Подскажите пожалуйста, почему на SD карту не каждый раз записывается строка?
    Вот код:
    Код (C++):
    #include <QuadDisplay2.h>
    #include <TroykaButton.h>
    #include <SD.h>
    #include <TroykaDHT.h>

    QuadDisplay qd(10, 11, 13);
    TroykaButton button1(4);
    TroykaButton button2(6);
    DHT dht(7, DHT11);
    boolean mode = true;
    boolean one = true;
    boolean power = true;
    unsigned long minutes = millis() / 60000;
    unsigned long minfu = 0;
    unsigned long hours = 0;

    void saveToSD(String filep, String dataString) {
      File dataFile = SD.open(filep, FILE_WRITE);
      dataFile.print(dataString);
      dataFile.close();
    }

    void setup() {
      qd.begin();
      button1.begin();
      button2.begin();
      SD.begin(8);
      dht.begin();
      dht.read();
      saveToSD("Info.csv", "Time;Humidity, %;Temp, C;Temp, F\r\n");
      int tempv = dht.getTemperatureC();
      String temp = String(tempv);
      int temp2v = dht.getTemperatureF();
      String temp2 = String(temp2v);
      int humv = dht.getHumidity();
      String hum = String(humv);
      String minutesPrint = String(minfu);
      String hoursPrint = String(hours);
      String dataPrint = hoursPrint + ":" + minutesPrint + ";" + hum + ";" + temp + ";" + temp2 + "\r\n";
      saveToSD("Info.csv", dataPrint);
    }

    void loop() {
      button2.read();
      if (power) {
        button1.read();
        if (button1.isClick()) {
          mode = !mode;
        }
        if (button1.isHold()) {
          one = !one;
          if (one) {
            qd.displayTemperatureC(dht.getTemperatureC());
          } else {
            qd.displayTemperatureF(dht.getTemperatureF());
          }
          mode = false;
        }
      }
      if (button2.isClick()) {
        if (power) {
          qd.displayDigits(QD_O, QD_f, QD_f, QD_NONE);
          delay(3000);
          qd.displayClear();
        } else {
          qd.displayDigits(QD_O, QD_n, QD_NONE, QD_NONE);
          delay(3000);
        }
        power = !power;
      }
      if (power) {
        dht.read();
        if (mode) {
          qd.displayHumidity(dht.getHumidity());
        } else {
          if (one) {
            qd.displayTemperatureC(dht.getTemperatureC());
          } else {
            qd.displayTemperatureF(dht.getTemperatureF());
          }
        }
      }
      if (millis() / 60000 - minutes == 10) {
        minutes = millis() / 60000;
        minfu += 10;
        if (minfu == 60) {
          ++hours;
          minfu = 0;
        }
        dht.read();
        int tempv = dht.getTemperatureC();
        String temp = String(tempv);
        int temp2v = dht.getTemperatureF();
        String temp2 = String(temp2v);
        int humv = dht.getHumidity();
        String hum = String(humv);
        String minutesPrint = String(minfu);
        String hoursPrint = String(hours);
        String dataPrint = hoursPrint + ":" + minutesPrint + ";" + hum + ";" + temp + ";" + temp2 + "\r\n";
        saveToSD("Info.csv", dataPrint);
      }
    }
    Вот файл Info.csv:
    INFO.png
     
  2. a1000

    a1000 Гик

    SD карта какого класса? Может тупо не успевает.
     
  3. Yaroslav1

    Yaroslav1 Нерд

    10-ого.
    Нет, на компьютере нормально работает.
     
  4. a1000

    a1000 Гик

    10 должен тянуть. У меня когда-то была похожая проблема. Делал логер напряжения. Как только файл увеличивался - всё вешалось. Взял карту 10 класса (до этого было что-то древнее) - всё заработало.
     
  5. parovoZZ

    parovoZZ Гуру

    скорее всего, контроллер или библиотека не ждет готовности карты.
     
  6. Max_dk

    Max_dk Нерд

    Предположение - может после открытия файла добавить дэлэй на несколько десятков мс в процедуре записи на SD.

    Код (C++):
    void saveToSD(String filep, String dataString) {
      File dataFile = SD.open(filep, FILE_WRITE);
      delay(50);
      dataFile.print(dataString);
      dataFile.close();
    }
     
  7. Yaroslav1

    Yaroslav1 Нерд

    Уже пытался. Не работает.
     
  8. Max_dk

    Max_dk Нерд

    Можно попробовать проконтролить результаты работы с SD.
    Засылать в Serial результат открытия файла (false если не удалось открыть) и печати в него (print() и println() возвращает количество записанных байтов, да и саму строку для записи при неудаче можно вывести - мало ли она криво сформирована как то).
     
  9. Yaroslav1

    Yaroslav1 Нерд

    Я не могу на ночь компьютер оставить.
     
  10. Max_dk

    Max_dk Нерд

    Пиши данные чаще для отладки, каждую минуту например. А не каждые 10 как в рабочем режиме.
     
  11. Yaroslav1

    Yaroslav1 Нерд

    Попробую.