Помогите с программированием LCD 16x2 keypad Shield для UNO

Бородишка
Offline
Зарегистрирован: 12.05.2016

Написал вот такую штуку для двух датчиков, теперь думаю как сделать так, чтоб можно было кнопками на шилде переключать информацию с большего колличества датчиков. Кто сможет подсказать как это реализовать?

#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();
}

 

Бородишка
Offline
Зарегистрирован: 12.05.2016

Пока что у меня выглядит так.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, если датчиков много, то самый правильный путь - сделать "виртуальныый" экран для каждого датчика. Программа не задумываясь ни о чём просто пишет данные в ыиртуальный экран. И есть совершенно независимый кусок. который переключает (активирует) виртуальные экраны, т.е. связывает реальный экран с тем или иным виртуальным. При этом программам работы с датчиками не нужно знать показываются их данные в данный момент или нет - их дело писать на виртуальный экран и ни о чём не париться. А на физическом экране всегда показывается состояние активного в данный момент виртуального.

Бородишка
Offline
Зарегистрирован: 12.05.2016

C виртуальным экраном ясно но как это реализовать.... Обозначать экран не 16х2 а например 16х6 ? 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Бородишка пишет:

не 16х2 а например 16х6 ? 

256х256

Бородишка
Offline
Зарегистрирован: 12.05.2016

Клапауций 232 пишет:

Бородишка пишет:

не 16х2 а например 16х6 ? 

256х256

Смешно. И потеряться на этом поле. Осталось понять как управление приладить к перемещению по этому полю.

Бородишка
Offline
Зарегистрирован: 12.05.2016

Вот это отдельно работает. Осталось понять, как присовокупить к программе с датчиками :-)

#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;
       }
   }
}

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Бородишка пишет:

Клапауций 232 пишет:

Бородишка пишет:

не 16х2 а например 16х6 ? 

256х256

Смешно. И потеряться на этом поле. Осталось понять как управление приладить к перемещению по этому полю.

почему смешно? там, оказывается видеопамяти больше, чем размер стекла индикатора