Первое, что создало неудобства - это то, что шилд с дисплеем не предусматривает возможности подключить ещё что-то к ардуине, перекрывая все порты на плате и не имея "сквозных" разъемов.
В связи с этим возникла необходимость выяснить какие именно контакты используются для работы дисплея (пока только дисплея, в кнопках нет необходимости). Исходя из скетча по работе с шилдом и кнопками:#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
Сквозые выходы на шильде есть. Нужно допаять гребёнки
ВідповістиВидалити