Вывод данных на LCD1602 через кнопку

alex7106
Offline
Зарегистрирован: 05.02.2017

Ребята, помогите пожалуйста новичку. Есть два скетча: один часы,дата, день недели, другой показания с датчика BMP180. Я хочу их объединить и выводить время с датой по нажатию на кнопку, чтобы время показывалось несколько секунд.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

alex7106 пишет:

Я хочу их объединить

Разрешаем.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016
unsigned long сохрвремя;
//.................
if(кнопка){
 сохрвремя=millis();
 кнопка=!кнопка; // если переменная для кнопки глобальная и существует
}
while(millis()-сохрвремя>=несколькосекунд){
 показатьчасы();
 показатьbmp180();
}

Время в мс. Возможно еще в условие кнопки приделать небольшое условие, выжидающее минимум 500 мс или в сколько там мс опрашивать кнопку чтобы не сворачивало крышу от повторов цикла, типа так:

if(кнопка && millis()-сохрвремя>=500){
EuBeginer
Offline
Зарегистрирован: 16.11.2015

Все привет!  Тема примерно таже, но не ладится вывод на 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 и в порту. Прям чудеса в решете. Перепробовал как видите разные библиотеки. Вопрос не решается. 

 

vvadim
Offline
Зарегистрирован: 23.05.2012

похоже на конфликт библиотек dht и bmp

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Это да, в bme280 тоже влажность меряется

EuBeginer
Offline
Зарегистрирован: 16.11.2015

ua6em пишет:

Это да, в bme280 тоже влажность меряется

Вот ничего о HUMIDITY в ВМР280 здесь не сказано... 

https://cdn-shop.adafruit.com/datasheets/BST-BMP280-DS001-11.pdf

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

EuBeginer пишет:

ua6em пишет:

Это да, в bme280 тоже влажность меряется

Вот ничего о HUMIDITY в ВМР280 здесь не сказано... 

https://cdn-shop.adafruit.com/datasheets/BST-BMP280-DS001-11.pdf

а функции у вас от bme280 ))) Serial.print(bme.readPressure()/133.3, 0);

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Насчет конфликта у меня тоже появилось подозрение. Что то со скоростями считывания и вывода. Думаю, что передача через I2C, на которой сидит экран, происходит слишком медленно... Ну да ладно, делал как подарок внуку, а заодно и урок... Пусть тоже покумекает.

EuBeginer
Offline
Зарегистрирован: 16.11.2015

 

[/quote]

а функции у вас от bme280 ))) Serial.print(bme.readPressure()/133.3, 0);

[/quote]

Да брал прямо из примера библиотечного. Всегда так делаю, поскольку подход в библиотеках разный. Я например переблал 4 библиотеки для DHT11. И все функции брал из примеров. Вот возможно DHT11 и ВМР280 по скоростям конфликтуют. Все и везде говориться , что DHT11 очень старый и медленный. Вероятно надо использовать DHT22

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Пардон, сразу и не врубился. ВМЕ280 - давление и влажность. Так посмотрю....

Да нет все четко вот фрагмент из примера для ВМР280 тест

void loop() {
  Serial.print(F("Temperature = "));
  Serial.print(bme.readTemperature());
  Serial.println(" *C");

 

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Похоже разговор лучше перенести вот сюда. Там и метео и те же (почти) датчики и разные комбинации

http://arduino.ru/forum/programmirovanie/problema-s-bmp-280?page=2

 

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Всем привет!  Победил!

Медленный DHT11 и современный ВМР280 живут прекрассно. Правильная индикация на последовательный порт это подтверждает.

Короче и ближе  к делу. Проблемы же были с выводолм на LCD1602 RUS !!!

Да, да судя по всему "кривоватая" библиотека.

Сделал вот это

#include <LiquidCrystal_I2C.h>

//#include <LCD_1602_RUS.h> //библиотека для LCD1602 Russian
и все встало на места. Ну что ж дополнительный стимул для внука учить Англиский!!!

 

alex7106
Offline
Зарегистрирован: 05.02.2017

Здравствуйте, я в возрасте и ещё и конкретный чайник в ардуино. Пытаюсь сделать погодную станцию, заодно и обучась потихоньку. Подскажите, пожалуйста, как добавить сюда 




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:;
           // на неизвестную команду - ничего не делаем
    };
  }
}