Помогите с программированием LCD 16x2 keypad Shield для UNO
- Войдите на сайт для отправки комментариев
Чт, 12/05/2016 - 14:46
Написал вот такую штуку для двух датчиков, теперь думаю как сделать так, чтоб можно было кнопками на шилде переключать информацию с большего колличества датчиков. Кто сможет подсказать как это реализовать?
#include <LiquidCrystal.h>
float temp;
int tempPin = 1;
int tempPin1 = 2;
byte TEMP_lit[8] =
{
B00110,
B01001,
B01001,
B00110,
B00000,
B00000,
B00000,
};
byte D_lit[8] =
{
B01110,
B01010,
B01010,
B01010,
B11111,
B10001,
B10001,
};
byte PE_lit[8] =
{
B11111,
B10001,
B10001,
B10001,
B10001,
B10001,
B10001,
B00000,
};
byte EL_lit[8] =
{
B00111,
B01001,
B10001,
B10001,
B10001,
B10001,
B10001,
B00000,
};
byte ZH_lit[8] =
{
B10001,
B10101,
B10101,
B01110,
B10101,
B10101,
B10001,
B00000,
};
byte MZ_lit[8] =
{
B10000,
B10000,
B10000,
B11110,
B10001,
B10001,
B11110,
B00000,
};
byte U_lit[8] =
{
B10001,
B10001,
B10001,
B01111,
B00001,
B00001,
B11110,
B00000,
};
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
const int inPin = 1;
const int inPin1 = 2;
void setup()
{
lcd.begin(16, 2);
lcd.createChar(7, TEMP_lit);
lcd.createChar(1, PE_lit);
lcd.createChar(2, U_lit);
lcd.createChar(3, EL_lit);
lcd.createChar(4, ZH_lit);
lcd.createChar(5, MZ_lit);
lcd.createChar(6, D_lit);
}
void loop()
{
int value = analogRead(inPin);
float millivolts = (value / 1024.0) * 5000;
float celsius = millivolts / 10;
if (celsius >= 60)
{
lcd.setCursor(5, 0);
lcd.write("ERROR");
}
else
{
lcd.setCursor(5, 0);
lcd.print(celsius);
lcd.write("\7C");
}
lcd.setCursor(0, 0);
lcd.write("\6OM");
int value1 = analogRead(inPin1);
float millivolts1 = (value1 / 1024.0) * 5000;
float celsius1 = millivolts1 / 10;
if (celsius1 >= 60)
{
lcd.setCursor(5, 1);
lcd.write("ERROR");
}
else
{
lcd.setCursor(5, 1);
lcd.print(celsius1);
lcd.write("\7C");
}
lcd.setCursor(0, 1);
lcd.write("\2\3");
delay(500);
lcd.clear();
}
Пока что у меня выглядит так.
Ну, если датчиков много, то самый правильный путь - сделать "виртуальныый" экран для каждого датчика. Программа не задумываясь ни о чём просто пишет данные в ыиртуальный экран. И есть совершенно независимый кусок. который переключает (активирует) виртуальные экраны, т.е. связывает реальный экран с тем или иным виртуальным. При этом программам работы с датчиками не нужно знать показываются их данные в данный момент или нет - их дело писать на виртуальный экран и ни о чём не париться. А на физическом экране всегда показывается состояние активного в данный момент виртуального.
C виртуальным экраном ясно но как это реализовать.... Обозначать экран не 16х2 а например 16х6 ?
не 16х2 а например 16х6 ?
256х256
не 16х2 а например 16х6 ?
256х256
Смешно. И потеряться на этом поле. Осталось понять как управление приладить к перемещению по этому полю.
Вот это отдельно работает. Осталось понять, как присовокупить к программе с датчиками :-)
#include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 int read_LCD_buttons(){ adc_key_in = analogRead(0); if (adc_key_in > 1000) return btnNONE; if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 250) return btnUP; if (adc_key_in < 450) return btnDOWN; if (adc_key_in < 650) return btnLEFT; if (adc_key_in < 850) return btnSELECT; return btnNONE; } void setup(){ lcd.begin(16, 2); // start the library lcd.setCursor(0,0); // set the LCD cursor position lcd.print("Push the buttons"); // print a simple message on the LCD } void loop(){ lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over lcd.print(millis()/1000); // display seconds elapsed since power-up lcd.setCursor(0,1); // move to the begining of the second line lcd_key = read_LCD_buttons(); // read the buttons switch (lcd_key){ // depending on which button was pushed, we perform an action case btnRIGHT:{ // push button "RIGHT" and show the word on the screen lcd.print("RIGHT "); break; } case btnLEFT:{ lcd.print("LEFT "); // push button "LEFT" and show the word on the screen break; } case btnUP:{ lcd.print("UP "); // push button "UP" and show the word on the screen break; } case btnDOWN:{ lcd.print("DOWN "); // push button "DOWN" and show the word on the screen break; } case btnSELECT:{ lcd.print("SELECT"); // push button "SELECT" and show the word on the screen break; } case btnNONE:{ lcd.print("NONE "); // No action will show "None" on the screen break; } } }не 16х2 а например 16х6 ?
256х256
Смешно. И потеряться на этом поле. Осталось понять как управление приладить к перемещению по этому полю.
почему смешно? там, оказывается видеопамяти больше, чем размер стекла индикатора