Термогигрометр

depressive
depressive аватар
Offline
Зарегистрирован: 04.04.2017

Всем добрый вечер!) Собираю на Arduino Uno аппарат, позволяющий измерять освещённость, а также влажность и температуру окружающей среды. Измерять эти параметры он может как по отдельности, так и сразу все вместе, и, кроме того, он может сохранять их на карту памяти. При старте устройства появляется меню приветствия (в коде - функция f1() ), и при нажатии кнопки 1 появляется меню, в котором можно выбрать измерение освещённости, температуры и влажности, или всё сразу (этот код я поместил в void loop(), и там же, перед конструкцией if..else if есть вызов функции меню). После каждого измерения есть выбор - либо сохранить результат на карту памяти, либо вернуться в меню (за это отвечает функция sv() ).

Отсюда проблемы: 1) Данные пишутся на карту по нажатию соответствующей кнопки, т.е. функция вызывается, но на дисплее это не отображается. Вместо этого там остаются данные последних измерений (кнопка 4, которая должна обеспечивать возврат в меню ещё не реализована).  2) Если мы получим результат измерений, то помимо кнопок сохранения результата и выхода в меню остальные кнопки тоже работуют. Например, мы измерели температуру и влажность, но если нажмём кнопку для другого измерения, то оно произойдёт, хотя это не должно происходить.  Всех, кого заинтересовала эта проблема, прошу мне помочь, а именно поправить код или дать определённые советы. За код не пеняйте, ибо до этого программировал на ассемблере для КР580 и Vax (Древность, но в универе ничего другого, видимо, не знают).

Всем спасибо! Код под катом:

#include "Wire.h"
#include "BH1750FVI.h"  // Загрузка библиотек для работы с датчиком освещённости
BH1750FVI LightSensor;
#include "SD.h"
#include "SPI.h"  // Загрузка библиотек для работы с картой памяти
#include "DHT.h"  // Подключение библиотеки датчика
#define DHTPIN 2  
DHT dht(DHTPIN, DHT22); // Инициация датчика температуры и влажности
#include "LiquidCrystal_I2C.h" // Загрузка библиотеки для работы с с дисплеем посредством I2C
Sd2Card card;
SdVolume volume;
SdFile root;
File myFile;
LiquidCrystal_I2C lcd(0x3F,20,4);  // Установка адреса дисплея и его параметров
int KeyOutPin = 4;                  //Подключение клавиатуры
int KeyInPin1 = 6;                  
int KeyInPin2 = 5;                  
int KeyInPin3 = 8;                  
int KeyInPin4 = 7;                  
int x = 0;              // Переменные для хранения кое-каких данныъ            
int y = 0;
int z = 0;
void setup()
{
  LightSensor.begin();       // Запускаем сенсор
  LightSensor.SetAddress(Device_Address_L);
  LightSensor.SetMode(Continuous_L_resolution_Mode);
  SD.begin(10);         // Запускаем карту памяти
  dht.begin();          // Запускаем датчик
  pinMode(KeyOutPin, OUTPUT);       //4-й пин сконфигурировать на выход
    
  pinMode(KeyInPin1, INPUT);        //6-й пин сконфигурировать на вход, кнопка "2"
  digitalWrite(KeyInPin1, HIGH);    //Установить выскоий уровень
  
  pinMode(KeyInPin2, INPUT);        //5-й пин сконфигурировать на вход, кнопка "1"
  digitalWrite(KeyInPin2, HIGH);    //Установить выскоий уровень
  
  pinMode(KeyInPin3, INPUT);        //8-й пин сконфигурировать на вход, кнопка "3"
  digitalWrite(KeyInPin3, HIGH);    //Установить выскоий уровень
  
  pinMode(KeyInPin4, INPUT);        //7-й пин сконфигурировать на вход, кнопка "4"
  lcd.init();                       // Установить выскоий уровень 
  // Выводится инйормация на дисплей
  lcd.backlight(); // Включить подсветку
  lcd.setCursor(5,0); // Установить курсор на строку 0 и третий символ
  lcd.print("Welcome to");
  lcd.setCursor(2,1);
  lcd.print("thermohygrometer"); // Вывести приветствие
  lcd.setCursor(3,3);
  lcd.print("Press button 1");
}

  void f1() {                 // Функция 1, которая выводит меню управления
  if(!digitalRead(KeyInPin1)){  // Ожидание нажатия кнопки -1- для перехода в -меню-
      lcd.clear();  // Очистить экран
      delay(2000);
      lcd.setCursor(2,0);  // Установить курсор
      lcd.print("Choose the mode:");   // Вывести надпись
      lcd.setCursor(0,1);
      lcd.print("1) Luxmeter");    // Люксметр
      lcd.setCursor(0,2);
      lcd.print("2) Hygrometer");   // Гигрометр
      lcd.setCursor(0,3);
      lcd.print("3) Complex");     // Комплексное измерение
      } 
  else {} // Ничего не делаем
  }

  void sv() {           // Функция для сохранения данных
    if(!digitalRead(KeyInPin3))
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Saving data...");
    delay(2000);
    myFile = SD.open("Result.txt", FILE_WRITE);
    myFile.println("Temperature:");
    myFile.println(x);
    myFile.println("Humidity:");
    myFile.println(y);
    myFile.println("Light:");
    myFile.println(z);
    myFile.println("--------------");
    myFile.close();
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Saving complete!");
    delay(2000);
    }
    else if(!digitalRead(KeyInPin4))
    {
      return;
    }
  }
  

void loop() {
  f1();        // Вызов функции -меню-
  if(!digitalRead(KeyInPin1)){  //Если нажата кнопка 1, то..
      uint16_t z = LightSensor.GetLightIntensity();  //Считываем данные от датчика
      lcd.clear();  // Очистить экран
      delay(2000);
      lcd.setCursor(0,0);
      lcd.print("Light:"); //Вывод данных на экран
      lcd.setCursor(8,0);
      lcd.print(z);
      lcd.setCursor(0,2);
      lcd.print("3) Save data");
      lcd.setCursor(0,3);
      lcd.print("4) Return");
  }
  else if (!digitalRead(KeyInPin2)){ // Если нажата кнопка 2, то...
    lcd.clear();
      delay(2000); // Небольшая задержка
      x = dht.readHumidity(); // Считываем влажность
      y = dht.readTemperature(); // Считываем температуру
      lcd.setCursor(0,0);
      lcd.print("Hymidity:");   //Вывод полученной информации на экран
      lcd.setCursor(10,0);
      lcd.print(x);
      lcd.setCursor(15,0);
      lcd.print("%");
      lcd.setCursor(0,1);
      lcd.print("Temperature:");
      lcd.setCursor(13,1);
      lcd.print(y);
      lcd.setCursor(18,1);
      lcd.print("C");
      lcd.setCursor(0,2);
      lcd.print("3) Save data");
      lcd.setCursor(0,3);
      lcd.print("4) Return");  
  }
  else if(!digitalRead(KeyInPin3)){    // Если нажата кнопка 3, то переходим к комплексному измерению
    uint16_t z = LightSensor.GetLightIntensity();  //Считываем данные от датчика освещённости
      lcd.clear();  // Очистить экран
      delay(2000);
      lcd.setCursor(0,0);
      lcd.print("Light:");   
      lcd.setCursor(8,0);
      lcd.print(z);
      lcd.setCursor(0,1);
      x = dht.readHumidity(); // Считываем влажность
      y = dht.readTemperature(); // Считываем температуру
      lcd.print("Hymidity:");
      lcd.setCursor(10,1);
      lcd.print(x);
      lcd.setCursor(15,1);
      lcd.print("%");
      lcd.setCursor(0,2);
      lcd.print("Temperature:");
      lcd.setCursor(13,2);
      lcd.print(y);
      lcd.setCursor(18,2);
      lcd.print("C");
      lcd.setCursor(0,3);
      lcd.print("3)Save data 4)Return"); 
        
  }
  sv();  //Вызов функции для сохранения данных
  
   
}

      
      
   

 

depressive
depressive аватар
Offline
Зарегистрирован: 04.04.2017

Парни, как вернуться в меню, я придумал. Я убрал "приглашение" к работе, сделав его просто текстом в функции void setup(), а перед "меню" очистил экран и сделал ссылку для функции longjump(), так что одной проблемой меньше) Но теперь не сохраняются результаты замеров. Вообще. Код в функции sv() практически не менял (кроме "лонгджампа"), так что если кто может помочь с записью данных, прошу)