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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

szesnaście − 6 =