Мониторинг влажности с записью логов на sd card

Тема в разделе "Arduino & Shields", создана пользователем Lunatic, 20 апр 2016.

  1. Lunatic

    Lunatic Нуб

    Всем привет. Собираю проект по мониторингу температуры и влажности в гараже с записью логов на sd card. Нужна помощь с кодом.

    вот кусок кода записывающий логи на карту
    dataFile.println("Humidity: ");
    dataFile.println(h);
    dataFile.println(" %\t");
    dataFile.println("Temperature: ");
    dataFile.println (t);
    dataFile.println(" *C");

    сам лог выглядит так

    Humidity:
    49.10
    %
    Temperature:
    26.50
    *C

    как поменять код что бы в две строчки логи были. вот так:

    Humidity: 49.10 %
    Temperature: 26.50 *C

    #include "SD.h" // Подключаем библиотеку SD card
    #include "Wire.h" // Подключаем библиотеку I2C
    #include "DHT.h" // Подключаем библиотеку DHT сенсора
    #define DHTTYPE DHT22 // Тип датчика DHT22
    #define DHTPIN 2 // Сигнал датчика DHT22 подключен к PIN 2
    #include "LiquidCrystal_I2C.h" // Подключаем библиотеку LCD
    LiquidCrystal_I2C lcd(0x3F,16,2); // Задаем адрес и размерность дисплея
    DHT dht22(DHTPIN, DHTTYPE); // Создаем объект DHT

    void setup(){
    Serial.begin(9600); // Открываем последовательный порт, задаем скорость передачи данных на 9600 бит/сек
    Serial.println("Garage Serial Monitor");
    dht22.begin(); // Начинается чтение DHT22

    Serial.print("Initializing SD card...");
    pinMode(4, OUTPUT);
    if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
    }
    Serial.println("initialization done.");
    lcd.init(); // Инициализация LCD
    lcd.backlight(); // Включаем подсветку
    File dataFile = SD.open("log.txt", FILE_WRITE);
    if (dataFile){
    Serial.print("Writing to log.txt...");
    dataFile.println("zapis temperatury i vlagnosti");
    dataFile.close(); // Закрываем файл
    Serial.println("done.");
    }else {
    Serial.println("error opening log.txt"); // откроем файл снова, для чтения:
    }
    dataFile = SD.open("log.txt");
    if (dataFile) {
    Serial.println("log.txt:");
    while (dataFile.available()) {
    Serial.write(dataFile.read());
    }
    dataFile.close();
    Serial.println("done.");
    }else {
    Serial.println("error opening test.txt");
    }
    }
    void loop(){
    float h = dht22.readHumidity(); // Влажность считывается с DHT22
    float t = dht22.readTemperature(); // Температура считывается с DHT22
    if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
    } else {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C");

    lcd.setCursor(0, 0); //Устанавливаем курсор в начало 1 строки
    lcd.print("Temp. :"); // Выводим текст
    lcd.setCursor(9, 0); // Устанавливаем курсор на 9 символ
    lcd.print(t); // Выводим текст
    lcd.setCursor(15, 0); // Устанавливаем курсор на 15 символ
    lcd.print("C"); // Выводим текст
    lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки
    lcd.print("Humid.:"); // Выводим текст
    lcd.setCursor(9, 1); // Устанавливаем курсор на 9 символ
    lcd.print(h); // Выводим текст
    lcd.setCursor(15, 1); // Устанавливаем курсор на 15 символ
    lcd.print("%"); //Выводим текст

    }
    File dataFile = SD.open("log.txt", FILE_WRITE);
    if (dataFile) {
    Serial.print("Writing to test.txt...");
    dataFile.println("Humidity: ");
    dataFile.println(h);
    dataFile.println(" %\t");
    dataFile.println("Temperature: ");
    dataFile.println (t);
    dataFile.println(" *C");
    dataFile.close(); // закрываем файл
    Serial.println("done.");
    } else {
    Serial.println("error opening test.txt");
    }
    }
     
  2. ImrDuke

    ImrDuke Гик

    Например так:
    Код (C++):
    dataFile.print("Humidity: ");
    dataFile.print(h);
    dataFile.println(" %\t");
    dataFile.print("Temperature: ");
    dataFile.print (t);
    dataFile.println(" *C");
     
    Lunatic нравится это.
  3. Lunatic

    Lunatic Нуб

    Большое спасибо.
    Проект собирался делать на arduino pro mini на ATmega168. Но возникла проблема с загрузкой скетча. Пишет:

    Скетч использует 18 352 байт (128%) памяти устройства. Всего доступно 14 336 байт.
    Глобальные переменные используют 1 392 байт (135%) динамической памяти, оставляя -368 байт для локальных переменных. Максимум: 1 024 байт.
    processing.app.debug.RunnerException: Скетч слишком большой; прочитайте http://www.arduino.cc/en/Guide/Troubleshooting#size
    at cc.arduino.Compiler.size(Compiler.java:315)
    at cc.arduino.Compiler.build(Compiler.java:156)
    at processing.app.Sketch.build(Sketch.java:1111)
    at processing.app.Sketch.build(Sketch.java:1081)
    at processing.app.Editor$BuildHandler.run(Editor.java:1962)
    at java.lang.Thread.run(Thread.java:745)
    Скетч слишком большой; прочитайте http://www.arduino.cc/en/Guide/Troubleshooting#size


    Вроде скетч не большой же. На уно все отлично работает.
     
  4. AlexVS

    AlexVS Гик

    Все просто и даже по русски написано, чего не понятно то?
    В УНО стоит ATmega328, у которой 32Кб флэш, а ATmega168 имеет только 16Кб флэш-памяти. Вот ваш скетч и не лезет. Для исправления ситуации возьмите ProMini на ATmega328.