Термогигрометр
- Войдите на сайт для отправки комментариев
Всем добрый вечер!) Собираю на 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(); //Вызов функции для сохранения данных }
Парни, как вернуться в меню, я придумал. Я убрал "приглашение" к работе, сделав его просто текстом в функции void setup(), а перед "меню" очистил экран и сделал ссылку для функции longjump(), так что одной проблемой меньше) Но теперь не сохраняются результаты замеров. Вообще. Код в функции sv() практически не менял (кроме "лонгджампа"), так что если кто может помочь с записью данных, прошу)