Start Elkretssimulator Karnaughdiagram Quine McCluskey


LCD Keypad Display

Ett käckt kretskort med 16x2 rader LCD -skärm och lite knappar.



Kretskortet trycks fast på arduino -kortet, så inga övriga kablar behövs.

Så, vilka pinnar ockuperas av kortet? Skärmen använder D4, D5, D6, D7 för data samt pinne D8 (RS) och D9 (E). Dessutom används D11, D12, D13 för ICSP.

Knappar kopplade som spänningsdelare

Knapparna är kopplade i en spänningsdelare vars utspänning körs in på A/D -omvandlaren på pinne 0 (AD0). Dvs, ungefär som jag själv gjorde tidigare. Spänningsdelaren skapar alltså olika spänningsnivåer vilket ger en siffra 0-1023 när A/D -omvandlaren läses av i koden. Så vi kommer behöva läsa av denna nivå och sedan avgöra vilken knapp som är nertryckt.

Öppna spänningsdelaren, som de 5 knapparna utgör, i kretssimulatorn. Observera att spänningen in till AD -omvandlaren sedan blir en siffra 0-1023. Vi kan ju fuska lite i simulatorn och sätta en spänning på 1024 volt. På så vis får vi ut själva siffran, i vårt program, som kommer från ADC. Spänningsdelaren i simulatorn med 1024 volt in.

Hur som helst! Om vi kör programmet...

void setup() 
{
  Serial.begin(9600);
  Serial.println("Mäter analog pinne 0");
}

void loop() 
{
  Serial.println(analogRead(0));
}

...så ser det ut såhär i den seriella monitorn.



Vi kan konvertera de olika analoga nivåerna från ADCn till knappar numrerade 0-4. Det blir då ungefär såhär.

int button_upper_limit[5] ={ 30, 150, 360, 535, 760 };
int button_last_pressed = -1;

void setup() 
{
  Serial.begin(9600);
  Serial.println("Visar tryckt knapp 0-4");
}

int button(int analog_in)
{
  for(int i=0;i<5;i++)
  {
    if(analog_in<button_upper_limit[i])
    {
      return i; 
    }
  }
  return -1;
}

void loop() 
{
  int b = button(analogRead(0));
  if(b != button_last_pressed && b != -1)
  {
    Serial.println(b);
    button_last_pressed = b;
  }
}

I vår monitor ser det då ut såhär...



HD44780

Ganska många sådana här LCD -skärmar använder samma kontrollchip, nämligen Hitachi HD44780 eller något som är kompatibelt. Vi pratar alltså skärmar som sitter på printers, kopieringsmaskiner, industriprylar m.m. Det är käckt eftersom det då finns ett enkelt bibliotek för att skicka data till LCD-skämen. I arduino finns ett sådant bibliotek under namnet LiquidCrystal.

Så vi kan börja med att testa skriva text på skärmen med några få rader kod.

#include <LiquidCrystal.h>

LiquidCrystal lcd(8,9,4,5,6,7);

void setup() 
{
  // konfigurera displayens storlek
  lcd.begin(16, 2);
  lcd.print("EL.ST was here!");
}

void loop() 
{
  // sätt cursor till rad 2 
  // 0=rad 1, 1=rad 2
  lcd.setCursor(0, 1);
  lcd.print(millis() / 1000);
}



Styrka på texten

Om skärmen lyser men du inte ser någon text, så är det troligtvis så att du måste skruva upp tecken-styrkan med potentiometern. Detta hände mig och verkar vara ett vanligt problem som andra upplever. En del verkar tro att skärmen är trasig, andra att de kopplat fel. Men det är bara att skruva på potentiometern, så syns texten.

Så: Rotera skruven medurs ett antal varv, så syns texten på skärmen.

Vi vill kanske att knappen vi tryckte ner skall synas på vår display. Vad är annars meningen med en display?

#include <LiquidCrystal.h>

int button_upper_limit[5] ={ 30, 150, 360, 535, 760 };
int button_last_pressed = -1;

LiquidCrystal lcd(8,9,4,5,6,7);

int button(int analog_in)
{
  for(int i=0;i<5;i++)
  {
    if(analog_in<button_upper_limit[i])
    {
      return i; 
    }
  }
  return -1;
}

void setup() 
{
  // konfigurera displayens storlek
  lcd.begin(16, 2);
  lcd.print("EL.ST was here!");
}

void loop() 
{
  // sätt cursor till rad 2 
  // 0=rad 1, 1=rad 2
  int b = button(analogRead(0));
  if(b != button_last_pressed && b != -1)
  {
    lcd.setCursor(0, 1);
    lcd.print("Knapp:");    
    lcd.setCursor(8, 1);
    lcd.print(b);
    button_last_pressed = b;
  }  
}

För att positionera cursorn där texten skall skrivas, så har skärmen ett koordinatsystem.




Lycka till!