Термогигрометр
- Войдите на сайт для отправки комментариев
Всем добрый вечер!) Собираю на 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() практически не менял (кроме "лонгджампа"), так что если кто может помочь с записью данных, прошу)