PCF8591 i Arduino
4 kanałowy, ośmiobitowy przetwornik A/C, łatwy w użyciu, tani i bardzo popularny – PCF8591. Przydatny wszędzie tam gdzie musimy rozszerzyć możliwości naszego Arduino o dodatkowe kanały analogowe, a nie wymagamy od tych pomiarów nadzwyczajnej rozdzielczości (tylko 8 bitów).
Tu wrzuciłem notę aplikacyjną układu PCF8591 (pdf)
Zaprojektowałem prosty układ, jako uniwersalny, mały moduł wykorzystujący tylko niezbędne piny PCF8591 (w konfiguracji A/C, bez źródła referencyjnego), z dzielnikiem na każdym wejściu analogowym.
Dwa z pinów adresowych – do dowolnej konfiguracji poprzez podlutowanie do Vcc lub GND.
Płytka i jej montaż wyglądały tak :
Układ zmontowany i podłączony do kontrolera …
Na LCD wskazania to wynik pomiaru na poszczególnych kanałach, przedstawione dziesiętnie jako jeden z 256 poziomów przetwornika. Oczywiście w zależności od zastosowania należy je poddać dalszej obróbce …
Poniżej kod – adres układu to 0x48 (piny adresowe do GND) – nie jestem wirtuozem i pewnie dałoby się go nieco skrócić, ale może komuś się przyda :
#include <Wire.h> #include <LiquidCrystal.h> //dla adresu fizycznego 1001000x czyli piny adresowe A2,A1,A0 do GND //adres w HEX to 0x48 - 7 starszych bitów int wartosc_0 = 0; // odczyt kanalu 0 int wartosc_1 = 0; // odczyt kanalu 0 int wartosc_2 = 0; // odczyt kanalu 0 int wartosc_3 = 0; // odczyt kanalu 0 LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup() { lcd.begin(16,2); Wire.begin(); } void loop() { lcd.clear(); CH_0(); // pomiar kanału 0 lcd.print(wartosc_0); CH_1(); // pomiar kanału 1 lcd.setCursor(8,0); lcd.print(wartosc_1); CH_2(); lcd.setCursor(0,1); lcd.print(wartosc_2); CH_3(); lcd.setCursor(8,1); lcd.print(wartosc_3); delay(200); } //************************************************* void CH_0() { Wire.beginTransmission(0x48); Wire.write(0x00); // kanal 0 Wire.endTransmission(); Wire.requestFrom(0x48, 1); while(Wire.available()) { wartosc_0 = Wire.read(); } } void CH_1() { Wire.beginTransmission(0x48); Wire.write(0x01); // kanal 1 Wire.endTransmission(); Wire.requestFrom(0x48, 1); while(Wire.available()) { wartosc_1 = Wire.read(); } } void CH_2() { Wire.beginTransmission(0x48); Wire.write(0x02); // kanal 2 Wire.endTransmission(); Wire.requestFrom(0x48, 1); while(Wire.available()) { wartosc_2 = Wire.read(); } } void CH_3() { Wire.beginTransmission(0x48); Wire.write(0x03); // kanal 3 Wire.endTransmission(); Wire.requestFrom(0x48, 1); while(Wire.available()) { wartosc_3 = Wire.read(); } }