PCF8591: un expander i2c I/O analogico

Spread the love

Libreria per utilizzare l’integrato pcf8591 tramite protocollo i2c con arduino e esp8266.

Questo integrato può controllare fino a 4 ingressi analogici e una uscita analogica, utile per misurare la tensione leggere i valori di termistor o controllare l’intensità di led.

Può leggere e scrivere valori analogici con solo 2 fili (perfetto per ESP-01).

Cerco di semplificare l’uso di questo IC, riducendo al minimo le operazioni da fare.

Come funziona il protocollo I2c

Il protocollo I2C funziona con due fili, l’SDA (dati) e SCL (clock).

Questi pin sono open-drain, e sono in pull-up con delle resistenze.

Di solito c’è un master e uno o più slave sulla linea, anche se possono esserci più master, ma ne parleremo in altra occasione.

Entrambi i master e gli slave possono trasmettere o ricevere dati, pertanto un dispositivo può trovarsi in uno di questi quattro stati: trasmissione master, ricezione master, trasmissione slave, ricezione slave.

Modulo o IC

pcf8591 IC
pcf8592 module

Libreria

Puoi trovare la mia libreria qui .

Download

Fai clic sul   pulsante DOWNLOADS nell’angolo in alto a destra, rinominare la cartella non compressa PCF8591.

Verificare che la cartella PCF8591 contenga PCF8591.cpp e PCF8591.h.

Collocare la cartella della libreria PCF8591 come / librerie / cartella.

Potrebbe essere necessario creare la sottocartella librerie se è la tua prima libreria.

Riavvia l’IDE.

Uso

Sul costruttore è necessario passare l’indirizzo I2C, è possibile utilizzare i pins A0, A1, A2 per cambiare l’indirizzo, potete trovare il valore specifico qui (per verificare l’indirizzo potete usare questa guida  I2cScanner)

PCF8591(uint8_t address);

per l’esp8266 se vuoi specificare i pin SDA e SCL puoi usare questo:

	PCF8591(uint8_t address, uint8_t sda, uint8_t scl);

Leggere valori

Come puoi vedere dall’immagine questo integrato ha 4 ingressi analogici e 1 uscita

pcf8591 pinout

Quindi per leggere tutti gli input analogici con un comando puoi fare così (i valori vanno da 0 a 255):

	PCF8591::AnalogInput ai = pcf8591.analogReadAll();
	Serial.print(ai.ain0);
	Serial.print(" - ");
	Serial.print(ai.ain1);
	Serial.print(" - ");
	Serial.print(ai.ain2);
	Serial.print(" - ");
	Serial.println(ai.ain3);

se vuoi leggere un singolo ingresso o canale analogico:

	int ana = pcf8591.analogRead(AIN0); // read analog 0

Leggi un valore da un canale

Questo IC ha varie modalità di lettura, ed è possibile utilizzare l’ingresso analogico o il canale analogico (puoi leggere i singoli valori con una chiamata a valore o gli AND logici dei valori).

Per esempio per leggere il valore dal canale 0 in “Two differential” devi fare:

	int ana = pcf8591.analogRead(CHANNEL0, TWO_DIFFERENTIAL_INPUT); // read analog 0

Scrivi un valore

Se vuoi scrivere un valore analogico puoi fare così (il valore va da 0 a 255):

	pcf8591.analogWrite(128);

Caratteristiche aggiuntive

Ho aggiunto delle utilità che permettono di leggere o screvere una tensione: per il calcolo della tensione è necessario passare alcuni parametri:

  • microcontrollerReferenceVoltage: se a true ricava la tensione dal microcontrollore (solo AVR no esp8266 per esp 3.3v è fisso)
  • referenceVoltage : se microcontrollerReferenceVoltage è false è necessario passare la relativa tensione
	void voltageWrite(float value, bool microcontrollerReferenceVoltage = true, float referenceVoltage = 5.0);
	float voltageRead(uint8_t analogPin, bool microcontrollerReferenceVoltage = true, float referenceVoltage = 5.0);

Un esempio:

	pcf8591.voltageWrite(2.7); // 2.7Volts output
	delay(3000);
	float ana0V = pcf8591.voltageRead(AIN0); // Read voltage from analog 0
	Serial.println(ana0V);

Schema di esempio

Links utili

Potrebbero interessarti anche...