Port I2C – PCF8574A
Klawiaturka, którą opisywałem niedawno przydała się do kolejnego „ćwiczebnego” tematu – sterowanie portem I/O – PCF8574A – po magistrali I2C.
Cały układ jest banalnie prosty. Do PCF-a podłączyłem miniaturowe przekaźniki, a do nich (wizualna prezentacja ich działania) LED-y. Płytka została mi ze starych eXperymentów i pierwotnie miała spełniać inną funkcję, dlatego jej układ ścieżek może wydać się Wam, nieco dziwny.
Poniżej kod programu. Pamiętajcie, że się uczę i nie umiem jeszcze stosować wyrafinowanych sztuczek programistycznych (pewnie szło by to napisać prościej) – za to przypuszczam, że kod jest przez to bardziej czytelny.
#include <Wire.h>
#include <LiquidCrystal.h>
//piny adresowe ukladu PCF8574A - wszystkie na VCC (1)
//adres w HEX 0x3f
int VKLAW = A0; // przypisanie portu analogowego
// 0 do odczytu napiecia z klawiatury
int KODKLAW = 20; // zmienna do przechowania kodu klawisza
int VHex; // w zmiennej VHex zapisujemy adczyt
// napiecia na AN0 - zapisany w HEX
byte StanPortu = B11111111; // aktualny stan portu - binarnie
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
lcd.begin(16,2);
Wire.begin();
}
void loop()
{
lcd.clear(); // wyczysc LCD i ustaw kursor na 0,0
pomiarV(); // pomiar napiecia AD klawiatura
identyfikacja(); // zdekoduj ktory przycisk
prezentacja(); // wyswietl na LCD
ustawport(); // procedura obsługi PCF8574AP
delay(200);
}
//*************************************************
void ustawport()
{
Wire.beginTransmission(0x3f);
Wire.write(StanPortu);
Wire.endTransmission();
}
//*************************************************
void pomiarV()
{
VHex = analogRead(VKLAW); // odczyt napiecia
}
//*************************************************
void identyfikacja()
{
if (VHex < 295)
{
KODKLAW = 0;
StanPortu = B11111110;
}
else if (VHex > 296 && VHex < 400)
{
KODKLAW = 1;
StanPortu = B11111101;
}
else if (VHex > 400 && VHex < 460)
{
KODKLAW = 2;
StanPortu = B11111011;
}
else if (VHex > 460 && VHex < 530)
{
KODKLAW = 3;
StanPortu = B11110111;
}
else if (VHex > 530 && VHex < 580)
{
KODKLAW = 4;
StanPortu = B11101111;
}
else if (VHex > 580 && VHex < 615)
{
KODKLAW = 5;
StanPortu = B11011111;
}
else if (VHex > 615 && VHex < 640)
{
KODKLAW = 6;
StanPortu = B10111111;
}
else if (VHex > 640 && VHex < 665)
{
KODKLAW = 7;
StanPortu = B01111111;
}
else if (VHex > 665 && VHex < 675)
{
KODKLAW = 8;
}
else if (VHex > 675 && VHex < 688)
{
KODKLAW = 9;
}
else if (VHex > 688 && VHex < 700)
{
KODKLAW = 10;
}
else if (VHex > 700 && VHex < 708)
{
KODKLAW = 11;
}
else if (VHex > 708 && VHex < 715)
{
KODKLAW = 12;
}
else if (VHex > 715 && VHex < 722)
{
KODKLAW = 13;
}
else if (VHex > 722 && VHex < 728)
{
KODKLAW = 14;
}
else if (VHex > 728 && VHex < 733)
{
KODKLAW = 15;
}
else
{
KODKLAW = 20;
}
}
//********************************************************
void prezentacja()
{
lcd.print(VHex, DEC);
lcd.print(" "); // spacja (odstep)
lcd.print(KODKLAW);
}