ARDUINO + 16х2 LCD keypad shield (двухрядный дисплей с кнопками) + DHT11 (датчика температуры и влажности)

Проверив работу Bluno с мерцающими диодами, можно продолжить изучение работы с ARDUINO. Цель - получить информацию с датчика и передать её на экран. Для этого понадобится сама ардуина, модуль датчика температуры и влажности DHT11 и сам дисплей, в моем случае 16х2 LCD шилд с 6 кнопкам (брался на перспективу) но кнопки мы пока использовать не будем ну и конечно же монтажные аксессуары.
Основную информацию о работе с датчиком и дисплеем взято здесь: http://zelectro.cc/TemperatureHumiditySensor  Об LCD шилде с кнопками инфы найти не удалось, но для выяснения как и что работает достаточно было скетча с интернет-магазина где приобретался сам шилд.

Первое, что создало неудобства - это то, что шилд с дисплеем не предусматривает возможности подключить ещё что-то к ардуине, перекрывая все порты на плате и не имея "сквозных" разъемов.
В связи с этим возникла необходимость выяснить какие именно контакты используются для работы дисплея (пока только дисплея, в кнопках нет необходимости). Исходя из скетча по работе с шилдом и кнопками:
#include <LiquidCrystal.h> LiquidCrystal lcd (8,9,4,5,6,7);
//Key message
char msgs[5][15] = {"Right Key OK ",
"Up Key OK ",
"Down Key OK ",
"Left Key OK ",
"Select Key OK" };
int adc_key_val[5] ={30, 150, 360, 535, 760 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1; void setup() {
lcd.begin(16, 2);
//optionally, now set up our application-specific display settings, overriding whatever the lcd did in lcd.init()
//lcd.commandWrite(0x0F);//cursor on, display on, blink on. (nasty!)
lcd.clear();
lcd.write("ARDUINO-UA.COM");
lcd.setCursor(0,2);
lcd.write("press a key");
delay(1000);
lcd.setCursor(0,2);
lcd.write(" ");
}
void loop() {
adc_key_in = analogRead(0); // читаем значение из аналогового входа
key = get_key(adc_key_in); // конвертируем в нажатие кнопки
if (key != oldkey){ // если книпка нажата
delay(50); // ждем чтоб устранить дребезг
adc_key_in = analogRead(0); //читаем значение из аналогового входа
key = get_key(adc_key_in); // конвертируем в нажатие кнопки
if (key != oldkey) {
oldkey = key;
if (key >=0){
lcd.setCursor(0,2); //line=2, x=0
lcd.write(msgs[key]);
}
}
}

//delay(1000);
} // конвертируем аналоговое значение в код кнопки
int get_key(unsigned int input){
int k;
for (k = 0; k < NUM_KEYS; k++){
if (input < adc_key_val[k]){
return k;
}
}
if (k >= NUM_KEYS)
k = -1; // пришло некорректное значение
return k;
} 
Для его работы используются контакты 4-9, а также питание 5V и GND. Соединив шилд с ардуиной с помощью перемычек - получили свободные контакты для подключения модуля датчика температуры и влажности, который мы также запитаем от 5V и GND и подключим к 3 цифровому порту ардуины.
Скрестив скетч по работе с шилдом и модулем датчика температуры и влажности, получили код который информацию с датчика выводит на экран дисплея, а также его состояние (наличие ошибок):
#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 3
#include <LiquidCrystal.h>
LiquidCrystal  lcd (8,9,4,5,6,7);
void setup(){
  Serial.begin(9600);
    lcd.begin(16, 2);
  //optionally, now set up our application-specific display settings, overriding whatever the lcd did in lcd.init()
  //lcd.commandWrite(0x0F);//cursor on, display on, blink on.  (nasty!)
  lcd.clear();
  Serial.println("DHT TEST PROGRAM ");
  lcd.write("DHT TEST PROGRAM");
  delay(5000);
  Serial.print("LIBRARY VERSION: ");
  lcd.setCursor(0,0);
  lcd.write("LIBRARY VERSION:");
  lcd.setCursor(0,2);
  lcd.write(DHT11LIB_VERSION);
  Serial.println(DHT11LIB_VERSION);
  Serial.println();
  delay(5000);
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
  lcd.clear();
  lcd.write("ElitZoo Control");
  lcd.setCursor(0,2);
  lcd.write("Status H(%) T(C)");
  delay(5000);
  lcd.setCursor(0,2);
  lcd.write("                ");
}
void loop(){
  int chk;
  Serial.print("DHT11, \t");
  chk = DHT.read(DHT11_PIN);    // READ DATA
  switch (chk){
    case DHTLIB_OK:
                lcd.setCursor(0,2);  //line=2, x=0
         lcd.write("OK");
                Serial.print("OK,\t");
                break;
    case DHTLIB_ERROR_CHECKSUM:
                lcd.setCursor(0,2);  //line=2, x=0
         lcd.write("ERR");
                Serial.print("Checksum error,\t");
                break;
    case DHTLIB_ERROR_TIMEOUT:
                lcd.setCursor(0,2);  //line=2, x=0
         lcd.write("TOUT");
                Serial.print("Time out error,\t");
                break;
    default:
                lcd.setCursor(0,2);  //line=2, x=0
         lcd.write("UERR");
                Serial.print("Unknown error,\t");
                break;
  }
 // DISPLAT DATA
  Serial.print("H=");
  Serial.print(DHT.humidity,1);
  Serial.print(",\t");
  Serial.print("T=");
  Serial.println(DHT.temperature,1);
  lcd.setCursor(5,2);  //line=2, x=0
  lcd.write("H=");
  lcd.print(DHT.humidity,1);
  lcd.write("% T=");
  lcd.print(DHT.temperature,1);
  lcd.write("C");
  delay(5000);
  lcd.setCursor(0,2);
  lcd.write("            ");
}
Вместе с выводом на дисплей, информация с датчика передается на порт ардуины и может быть получена через монитор порта.
А подключив к источнику питания, получаем уже автономное устройство, которое с интервалом 5 сек обновлят информацию с датчика температуры и влажности и выводит на дисплей.

Есть вопросы или комментарии? Обсуждение статьи на странице в FB https://www.facebook.com/maker.sast/posts/938793726875742




Источник http://arduino-ua.com/prod235-LCD_keypad_shield

1 коментар: