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