Вывод данных на LCD1602 через кнопку
- Войдите на сайт для отправки комментариев
Пнд, 20/02/2017 - 17:54
Ребята, помогите пожалуйста новичку. Есть два скетча: один часы,дата, день недели, другой показания с датчика BMP180. Я хочу их объединить и выводить время с датой по нажатию на кнопку, чтобы время показывалось несколько секунд.
Я хочу их объединить
Разрешаем.
unsigned long сохрвремя; //................. if(кнопка){ сохрвремя=millis(); кнопка=!кнопка; // если переменная для кнопки глобальная и существует } while(millis()-сохрвремя>=несколькосекунд){ показатьчасы(); показатьbmp180(); }Время в мс. Возможно еще в условие кнопки приделать небольшое условие, выжидающее минимум 500 мс или в сколько там мс опрашивать кнопку чтобы не сворачивало крышу от повторов цикла, типа так:
if(кнопка && millis()-сохрвремя>=500){Все привет! Тема примерно таже, но не ладится вывод на LCD 1602.
Домашняя метеостанция: DHT11 на pin 2 - читаю только Влажность, BMP280 читаю температуру и давление.
Вот скетч...
#include <DHT.h> //библиотека для DHT11 //#include <DHT_U.h> //#include <Wire.h> //библиотека для I2C //#include <SPI.h> //библиотека для SPI #include <Adafruit_BMP280.h> //библиотека для BMP280 #include <LCD_1602_RUS.h> //библиотека для LCD1602 #define BMP_SCK 13 // connection BMP280 with SPI #define BMP_MISO 12 #define BMP_MOSI 11 #define BMP_CS 10 #define DHTPIN 2 // connection DHT11 with D2 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); LCD_1602_RUS lcd(0x27, 16, 2); Adafruit_BMP280 bme(BMP_CS); // датчик давления на шине SPI void setup() { Serial.begin(9600); lcd.init(); lcd.backlight(); // lcd.createChar(1, degree); // Создаем символ градуса под номером 1 //if (!bme.begin()) { // Serial.println(F("Could not find a valid BMP280 sensor, check wiring!")); //while (1); bme.begin(); dht.begin(); } void loop() { //сбор данных //float h = dht.readHumidity();//влажность от DHT11 // float t = dht.readTemperature(); /* if (isnan(h)) { Serial.println("Failed to read from DHT sensor!"); } Serial.print("Humidity: "); Serial.println(h,0); Serial.print(F("Temperature = ")); Serial.print(bme.readTemperature(),0); Serial.println(" C"); Serial.print(F("Pressure = ")); Serial.print(bme.readPressure()/133.3, 0); Serial.println(" mm"); Serial.println(); */ // вывод на LCD 1602 lcd.clear(); lcd.setCursor (0,0); lcd.print(L"TEMПEPATУPA C"); lcd.setCursor(13, 0); lcd.print (bme.readTemperature(),0); // вывод с ВМР280 lcd.setCursor(0, 1); lcd.print (L"ДABЛEHИE мм"); lcd.setCursor(11, 1); lcd.print (bme.readPressure()/133.3,0); // вывод с ВМР280 delay (3000); lcd.setCursor(0, 1); lcd.print(L"BЛAЖHOCTЬ %"); lcd.setCursor(12, 1); lcd.print(dht.readHumidity(),0); delay (3000); }Так вот на последовательном все вижу. А на LCD только температуру и давление от ВМР280. Влажность от DHT11 индицируется как "nan". А если комментирую // bme.begin(); то вижу Влажность и на LCD и в порту. Прям чудеса в решете. Перепробовал как видите разные библиотеки. Вопрос не решается.
похоже на конфликт библиотек dht и bmp
Это да, в bme280 тоже влажность меряется
Это да, в bme280 тоже влажность меряется
Вот ничего о HUMIDITY в ВМР280 здесь не сказано...
https://cdn-shop.adafruit.com/datasheets/BST-BMP280-DS001-11.pdf
Это да, в bme280 тоже влажность меряется
Вот ничего о HUMIDITY в ВМР280 здесь не сказано...
https://cdn-shop.adafruit.com/datasheets/BST-BMP280-DS001-11.pdf
а функции у вас от bme280 )))
Serial.print(bme.readPressure()/133.3, 0);Насчет конфликта у меня тоже появилось подозрение. Что то со скоростями считывания и вывода. Думаю, что передача через I2C, на которой сидит экран, происходит слишком медленно... Ну да ладно, делал как подарок внуку, а заодно и урок... Пусть тоже покумекает.
[/quote]
а функции у вас от bme280 )))
Serial.print(bme.readPressure()/133.3, 0);[/quote]
Да брал прямо из примера библиотечного. Всегда так делаю, поскольку подход в библиотеках разный. Я например переблал 4 библиотеки для DHT11. И все функции брал из примеров. Вот возможно DHT11 и ВМР280 по скоростям конфликтуют. Все и везде говориться , что DHT11 очень старый и медленный. Вероятно надо использовать DHT22
Пардон, сразу и не врубился. ВМЕ280 - давление и влажность. Так посмотрю....
Да нет все четко вот фрагмент из примера для ВМР280 тест
Похоже разговор лучше перенести вот сюда. Там и метео и те же (почти) датчики и разные комбинации
http://arduino.ru/forum/programmirovanie/problema-s-bmp-280?page=2
Всем привет! Победил!
Медленный DHT11 и современный ВМР280 живут прекрассно. Правильная индикация на последовательный порт это подтверждает.
Короче и ближе к делу. Проблемы же были с выводолм на LCD1602 RUS !!!
Да, да судя по всему "кривоватая" библиотека.
Сделал вот это
#include <LiquidCrystal_I2C.h>
Здравствуйте, я в возрасте и ещё и конкретный чайник в ардуино. Пытаюсь сделать погодную станцию, заодно и обучась потихоньку. Подскажите, пожалуйста, как добавить сюда
unsigned long сохрвремя; //................. if(кнопка){ сохрвремя=millis(); кнопка=!кнопка; // если переменная для кнопки глобальная и существует } while(millis()-сохрвремя>=несколькосекунд){ показатьчасы(); показатьbmp180(); }показания из этого скетча
#include <Wire.h> #include <BMP085.h> #include <LiquidCrystal.h> BMP085 dps = BMP085(); byte simvol[8] = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Задаем адрес и размер дисплея long Temperature = 0, Pressure = 0; void setup() { lcd.begin(16, 2); // Инициализация lcd lcd.setCursor(2,0); // Устанавливаем курсор на 1 строку, ячейка 2 lcd.print("TEMP"); // Выводим текст lcd.setCursor(1,1); // Устанавливаем курсор на 2 строку, ячейка 2 lcd.print("PRESS"); // Выводим текст Wire.begin(); delay(1000); dps.init(); } void loop() { dps.getPressure(&Pressure); dps.getTemperature(&Temperature); lcd.createChar(1, simvol); // Создаем символ под номером 1 lcd.setCursor(7,0); // Устанавливаем курсор на 1 строку, ячейка 7 lcd.print(Temperature*0.1); // Выводим показания температуры lcd.setCursor(12,0); // Устанавливаем курсор на 1 строку, ячейка 12 lcd.print("\1"); // Выводим символ градуса lcd.setCursor(13,0); // Устанавливаем курсор на 1 строку, ячейка 13 lcd.print("C"); // Выводим текст lcd.setCursor(7,1); // Устанавливаем курсор на 1 строку, ячейка 7 lcd.print(Pressure/133.3); // Выводим показания давления lcd.setCursor(13,1); // Устанавливаем курсор на 2 строку, ячейка 13 lcd.print("mm"); // Выводим текст delay(2000); }да и с кнопкой голову сломал.
Со скетчем часов наверное будет аналогично?
// Библиотеки необходимые для работы модуля часов #include "Wire.h" #include "DS1307new.h" #include "LiquidCrystal.h" // библиотека экрана LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup(){ Serial.begin(9600); if(RTC.isPresent()){ // обнаружен ли модуль? Serial.println("RTC Ready"); // все хорошо } else { Serial.println("Error!!!! RTC Module not found"); // сообщаем о проблеме while(1); // и останавливаем скетч } lcd.begin(16, 2); // запускаем библиотеку экрана } void loop(){ RTC.getTime();// получить время от модуля printTimeToSerial(); // выводим полученное время в лог printTimeToLCD();; // выводи время на экран doSerialCommands(); // слушаем и выполняем команды из Serial } // Выводит текущие время в Serial void printTimeToSerial(){ byte static prevSecond=0; // тут будем хранить, сколько секунд было при прошлом отчете if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись Serial.print(RTC.hour); // часы Serial.print(":"); // разделитель Serial.print(RTC.minute); Serial.print(":"); Serial.println(RTC.second); prevSecond=RTC.second; // запомнили когда мы "отчитались" } } // Выводит текущие время на LCD void printTimeToLCD(){ byte static prevSecond=0; // тут будем хранить, сколько секунд было при выводе if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись lcd.setCursor(4,1); // устанавливаем позицию курсора if(RTC.hour<10)lcd.print(" "); lcd.print(RTC.hour); // часы lcd.print(":"); // разделитель if(RTC.minute<10)lcd.print(0); // лидирующий ноль, если нужен lcd.print(RTC.minute); lcd.print(":"); if (RTC.second < 10) // correct second if necessary lcd.print("0"); lcd.print(RTC.second); lcd.setCursor(2,1); // устанавливаем позицию курсора lcd.print("*"); lcd.setCursor(13,1); // устанавливаем позицию курсора lcd.print("*"); lcd.setCursor(5,0); // устанавливаем позицию курсора lcd.print(" "); if (RTC.day < 10) // correct date if necessary { lcd.print(""); lcd.print(RTC.day); } else { lcd.print(RTC.day); } lcd.print("."); if (RTC.month < 10) // correct month if necessary { lcd.print("0"); lcd.print(RTC.month); } else { lcd.print(RTC.month); } lcd.print("."); lcd.print(RTC.year); // Year need not to be changed lcd.print(" "); lcd.setCursor(1,0); // устанавливаем позицию курсора switch (RTC.dow) // вывести день недели { case 1: lcd.print("MON"); break; case 2: lcd.print("TUE"); break; case 3: lcd.print("WED"); break; case 4: lcd.print("THU"); break; case 5: lcd.print("FRI"); break; case 6: lcd.print("SAT"); break; case 7: lcd.print("SUN"); break; } prevSecond=RTC.second; // запомнили когда мы "отчитались" } } // устанавливает часы модуля на какое-то заранее определенное время void setSomeTime(){ RTC.stopClock();// останавливаем часы RTC.fillByHMS(14,29,0); // подкручиваем стрелки на 19:15:00 RTC.fillByYMD(2017,2,3); // установить дату RTC.setTime();// отправляем "подкрученное время" самому модулю RTC.startClock(); // и опять запускаем часы } // слушает из Serial команды и выполняет их. Каждая команда - один символ. // доступны команды: // s - установить время указанное в функции setSomeTime() void doSerialCommands(){ if(Serial.available()){ // что-нибудь пришло? char ch=Serial.read(); // читаем что пришло switch(ch){ case 's': // команда установки времени setSomeTime(); // устанавливаем break; // тут, в будущем, мы можем добавлять дополнительные команды default:; // на неизвестную команду - ничего не делаем }; } }