//*******************************************************//
// //
// Vérification Fonctionnement Platine PCF8575 //
// 16 LED par platine //
// //
// UAICF Nevers-Vauzelles //
// http://www.modelisme58.fr //
// //
// Février 2026 - Vers 1.0 //
// //
//*******************************************************//
//*** A MODIFIER ******************************************************************
#define DemoWOKI // Pour l'utilisation du simulateur WOKI
#define EcranLCD // Pour la mise en oeuvre d'un écran LCD 20x4
#define LcdI2C 0x27 // Adresse I2C de l'écran LCD
byte NbMaxPCF = 7; // Nombre maximal de platine PCF8575
#define PCFi2c 0x20 // Adresse I2C de la première platine PCF8575
#define TempoDefaut 100 // Temporisation par defaut en millisecondes
//*** FIN des modifications *******************************************************
// *** Bibliothèques à utiliser ***
#include <Wire.h>
#include <EEPROM.h>
#ifdef EcranLCD
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(LcdI2C, 20, 4);
#endif
// *** Variables & constantes
#define AdresseEepromTempo 10
#define AdresseEepromI2C 3
boolean Sens, Cycle;
byte BusAdresseI2C[8], Valeur0, Valeur1, Ordre, NbreCycle;
int Tempo;
unsigned int DataEnvoi;
unsigned long AncienMillis;
// --- Ecriture des 2 Bytes pour PCF8575 (Bus I2C) ---
void Pcf8575_Envoi(uint16_t data, byte Bus)
{
Wire.beginTransmission(Bus);
Wire.write(lowByte(data));
Wire.write(highByte(data));
Wire.endTransmission();
}
#include "scanner_I2C.h"
#include "portserie.h"
//----------------------------------------------------------------------------------------
void setup()
{
Wire.begin();
Serial.begin(9600);
#ifdef EcranLCD
lcd.init();
lcd.backlight();
lcd.setCursor(4, 0);
lcd.print("Test PCF8575");
#endif
// *** Récupération des données dans l'Eeprom ***
for (byte i = 0; i < NbMaxPCF; i++)
{
BusAdresseI2C[i] = EEPROM[AdresseEepromI2C];
if (BusAdresseI2C[i] < 0 || BusAdresseI2C[i] > 254)
{
BusAdresseI2C[i] = PCFi2c;
BusAdresseI2C[i] = BusAdresseI2C[i] + i;
EEPROM.update(AdresseEepromI2C, BusAdresseI2C[i]);
}
#ifdef DemoWOKI
BusAdresseI2C[i] = BusAdresseI2C[i] + i;
NbMaxPCF = 3;
#endif
#ifdef EcranLCD
if (i < 4)
{
lcd.setCursor(i * 5, 2); lcd.print("0x"); lcd.print(BusAdresseI2C[i], HEX); lcd.print(" ");
} else {
lcd.setCursor((i - 4) * 5, 3); lcd.print("0x"); lcd.print(BusAdresseI2C[i], HEX); lcd.print(" ");
}
#endif
}
EEPROM.get(AdresseEepromTempo, Tempo);
if (Tempo > 15000 || Tempo < 100)
{
Tempo = TempoDefaut;
EEPROM.put(AdresseEepromTempo, Tempo);
}
// *** Message démarrage ***
Serial.println(F("UAICF Nevers-Vauzelles - http://www.modelisme58.fr"));
Serial.println(F("Test de carte PCF8575 - Gestion de platine 16 LED - v1.0"));
for (byte i = 0; i < NbMaxPCF; i++)
{
Serial.print(F("Adresse I2C = 0x")); Serial.print(BusAdresseI2C[i], HEX);
Serial.print (F(" | ")); Serial.println(BusAdresseI2C[i], DEC);
}
Serial.print (F("Tempo = ")); Serial.print(Tempo); Serial.println(" ms\n");
Serial.println(F("$H pour afficher l'aide"));
Serial.println(F("----------------------------------------------------"));
Cycle = true;
Sens = false;
Valeur0 = 255;
Valeur1 = 255;
DataEnvoi = word(Valeur0, Valeur1);
Serial.print(Valeur0); Serial.print("\t"); Serial.println(Valeur1);
Pcf8575_Envoi(DataEnvoi, BusAdresseI2C);
delay(2500);
#ifdef EcranLCD
lcd.init();
lcd.setCursor(4, 0);
lcd.print("Test PCF8575");
lcd.setCursor(0, 2);
lcd.print("Ordre : "); lcd.print(NbreCycle + 1);
lcd.print(" = "); lcd.print(BusAdresseI2C[NbreCycle]);
lcd.setCursor(0, 3);
lcd.print("Adresse : 0x"); lcd.print(BusAdresseI2C[NbreCycle], HEX);
#endif
}
//----------------------------------------------------------------------------------------
void loop()
{
serialEvent();
if (Cycle)
{
if ((millis() - AncienMillis) > Tempo && !Sens)
{
if (Ordre < 9)
{
bitWrite(Valeur0, Ordre - 1, 1);
bitWrite(Valeur1, Ordre - 1, 0);
DataEnvoi = word(Valeur0, Valeur1);
//Serial.print(Valeur0); Serial.print("\t"); Serial.println(Valeur1);
Pcf8575_Envoi(DataEnvoi, BusAdresseI2C[NbreCycle]);
Ordre++;
}
if (Ordre > 8)
{
Sens = !Sens;
Ordre--;
}
AncienMillis = millis();
}
if ((millis() - AncienMillis) > Tempo && Sens)
{
if (Ordre > 0)
{
bitWrite(Valeur0, Ordre - 1, 0);
bitWrite(Valeur1, Ordre - 1, 1);
DataEnvoi = word(Valeur0, Valeur1);
//Serial.print(Valeur0); Serial.print("\t"); Serial.println(Valeur1);
Pcf8575_Envoi(DataEnvoi, BusAdresseI2C[NbreCycle]);
Ordre--;
}
if (Ordre <= 0)
{
Sens = !Sens;
Ordre = 1;
NbreCycle++;
if (NbreCycle > NbMaxPCF - 1)
{
NbreCycle = 0;
}
#ifdef EcranLCD
lcd.setCursor(0, 2);
lcd.print("Ordre : "); lcd.print(NbreCycle + 1);
lcd.print(" = "); lcd.print(BusAdresseI2C[NbreCycle]);
lcd.setCursor(0, 3);
lcd.print("Adresse : 0x"); lcd.print(BusAdresseI2C[NbreCycle], HEX);
#endif
}
AncienMillis = millis();
}
}
}0x20 - 32
0x21 - 33
0x22 - 34