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