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

Dodaj komentarz

Twój adres email nie zostanie opublikowany.