Alfa 166 Ripristino Funzioni Clima e Consumi Senza ICS (Car PC)

Eric51238

Nuovo Alfista
5 Maggio 2023
21
2
2
Regione
Emilia-Romagna
Alfa
Brera
Come sappiamo il sistema ICS col tempo è soggetto a diversi malfunzionamenti, inoltre in quanto a navigazione e infotainment è obsoleto, perciò è arrivato il momento di comprenderne il funzionamento, rimuoverlo e rivenderlo a 500euro su ebay ahahah.
Partiamo dalla base:
Tra l'ICS e i Comandi Clima cè un cavo che li collega (esattamente tra il Pin 15 del connettore verde dell'ICS e il pin 8 del connettore bianco dei Comandi Clima)
Facendo una serie di prove ho scoperto che:

I Comandi Clima Alimentano quel tratto di linea BUS a 12V
L'ICS trasmette un segnale continuo ai Comandi Clima (senza questo i Comandi Clima non iniziano la comunicazione)
La linea Bus è una KKL con baud a 9600
Il segnale che che viene trasmesso è composto da 15 caselle (byte) composte da 2 valori es: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
Il segnale che l'ICS manda in continuazione per attivare la comunicazione è: 04 01 00 00 05
i restanti 10 byte riguardano dati clima o serbatoio ecco l'elenco da 0 a 14:

byte 0: segnale ICS: 04
byte 1: segnale ICS 01
byte 2: segnale ICS 00
byte 3: segnale ICS 00
byte 4: segnale ICS 05
byte 5: sconosciuto
byte 6: sconosciuto
byte 7: selettore temperatura clima (low=0F, da 16 a 28 gradi = 10 11 12 13 14 15 16 17 18 19 1A 1B 1C, high=1D)
byte 8: temperatura esterna (registrati da 4 a 21 gradi = 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D)
byte 9: prima cifra velocità ventola da 2 a E, seconda cifra flaps
(PARABREZZA = 2, PARABREZZA + PIEDI = 3, PIEDI = 4, PIEDI + FACCIA = 5, FACCIA = 6)
byte 10: funzioni clima (FULL+AUTO = 03 o 0B, AUTO = 01 o 02, MANUAL = 08)
byte 11: prima cifra (logica a somma: DEFROST POST = 1, DEFROST ANT = 4, RICIRCOLO = 2) (ES: DEFROST ANT+POST = 5, DEFROST POST + RICIRCOLO = 3), seconda cifra ECON = 8
byte 12: livello carburante serbatoio (non ancora decifrato)
byte 13: sconosciuto
byte 14: sconosciuto
OFF: byte 9 prima cifra 0, byte 10 prima cifra 1, byte 11 prima cifra A o B (DA VERIFICARE MEGLIO)

Per ricevere e trasmettere è sufficente un adattatore OBD KKL (quello per diagnosticare proprio l'Alfa 166 )
Come collegare l'adattatore OBD KKL: pin 7 al cavo BUS (tra ICS e Comandi Clima), pin 4 e 5 a Massa, pin 16 a 12V (i pin sono numerati in base alla presa sull'auto, quindi sul nostro adattatore saranno specchiati)

Per quanto riguarda il consumo carburante (da non confondere con il livello carburante serbatoio) e il segnale velocita vettura arrivano precisamente al pin 23 e 24 del connettore nero dell'ICS, per ora li sto leggendo con Arduino Nano (ma penso di passare a ESP32), sto ottenendo valori discreti ma cè ancora da lavorare

A quanto pare è l'ICS che di norma fa il calcolo dell'autonomia e dei consumi tramite il cavo consumi, il cavo velocità e il byte serbatoio, perciò dovrà essere il nostro programma a rifare il calcolo più preciso possibile riutilizzando gli stessi dati

Ci tengo a precisare che non sono un programmatore e quindi sto usando delle IA per programmare quindi se qualcuno ne capisce di piu è il benvenuto.
Allego i 2 programmi per leggere i byte tra ICS e Comandi Clima (uno funziona con ICS collegato = riceve e basta, l'altro funziona senza ICS = trasmette il segnale 0401000005),
NON UTILIZZARE IL PROGRAMMA CHE TRASMETTE CON ICS COLLEGATO,
(per eseguire i codici dovete avere installato Python)
Infine allego il codice arduino per leggere consumi e velocita (pin arduino D2 - diodo FR107 - cavo consumi pin 23 ICS) (pin arduino D3 - diodo FR107 - cavo velocita pin 24 ICS) (resistenza 10kohm tra D2 e 5V arduino) (resistenza 10kohm tra D3 e 5V arduino)
Più avanti caricherò immagini con illustrazioni piu chiare
 

Allegati

Ultima modifica:
  • Mi piace
Reazioni: Melo81
Ecco una brevissima prova (qui ancora usavo Arduino per leggere il BUS, poi sono passato all'adattatore KKL che rileva meno artefatti e interferenze)
 
Informazione Pubblicitaria - Continua la Lettura Sotto
Logica da aggiungere al programma per simulare l'interfaccia ICS: ECON e FULL non possono essere attivi tutti e due nello stesso momento (logica XOR)
 
Ecco la versione ancora incompleta della nuova interfaccia ICS, fatta interamente in Python, testata su windows ma dovrebbe andare anche su linux senza troppi cambiamenti, per il controllo volume bisogna scaricare nircmd.exe e metterlo nella stessa cartella del programma ICS, funziona tutto tranne la sezione consumi (ancora interamente da programmare)
 

Allegati

  • ICSREBUILD1.webp
    ICSREBUILD1.webp
    45.6 KB · Visualizzazioni: 13
  • ICSREBUILD2.webp
    ICSREBUILD2.webp
    354 KB · Visualizzazioni: 12
  • ics_dashboard_fixed_23_.zip
    ics_dashboard_fixed_23_.zip
    36 KB · Visualizzazioni: 8
AGGIORNAMENTO: la codifica precedente aveva delle imperfezioni e a volte avrebbe potuto non funzionare, in sostanza ora la logica invece di ragionare in hex ragiona con i singoli bit, ecco la parte di codice aggiornata:
def _parse_kkl_data(self, packet):
try:
# --- Byte 7: Temperatura Target ---
b7 = packet[7] if len(packet) > 7 else 0x0F
if b7 == 0x0F:
self.temp_clima = "LOW"
elif b7 == 0x1D:
self.temp_clima = "HIGH"
elif 0x10 <= b7 <= 0x1C:
self.temp_clima = b7 - 0x10 + 16
else:
self.temp_clima = "--"

# --- Byte 8: Temperatura esterna ---
b8 = packet[8] if len(packet) > 8 else 0x28
temp_calc = b8 - 40
self.temp_esterna = temp_calc if -40 <= temp_calc <= 60 else "--"

# --- Byte 9: Ventola + Flaps ---
b9 = packet[9] if len(packet) > 9 else 0x00
ventola_hex = (b9 >> 4) & 0x0F # Prima cifra
flaps_hex = b9 & 0x0F # Seconda cifra

# Velocità Ventola (da 2-E hex a 1-13)
self.ventola = (ventola_hex - 1) if 0x02 <= ventola_hex <= 0x0E else 0

# Mappa Flaps (Uscita aria)
flaps_map = {
0x02: "PARABREZZA",
0x03: "PARABREZZA+PIEDI",
0x04: "PIEDI",
0x05: "PIEDI+FACCIA",
0x06: "FACCIA",
0x00: "OFF"
}
self.flaps = flaps_map.get(flaps_hex, "--")

# --- Byte 10: Funzioni e Master Standby ---
b10 = packet[10] if len(packet) > 10 else 0x00
funzione_low = b10 & 0x0F
clima_master_standby = (b10 >> 4) == 0x01 # Prima cifra = 1

# Modalità Auto/Full/Man (Bit 0 e 1)
mode_bits = funzione_low & 0x03
self.full = (mode_bits == 0x03)
self.auto_mode = (mode_bits != 0x00)
self.man_mode = (mode_bits == 0x00)

# --- Byte 11: Defrost, Ricircolo, Standby e ECON ---
b11 = packet[11] if len(packet) > 11 else 0x00
funzioni_high = (b11 >> 4) & 0x0F
funzioni_low = b11 & 0x0F

# Logica Parte Alta (A=1010, B=1011)
self.defrost_post = (funzioni_high & 0x01) != 0 # Bit 0
self.ricircolo = (funzioni_high & 0x02) != 0 # Bit 1
self.defrost_ant = (funzioni_high & 0x04) != 0 # Bit 2
funzioni_standby = (funzioni_high & 0x08) != 0 # Bit 3 (attivo con A, B, 8, 9...)

# ECON (Bit 3 del nibble basso: valore 8)
self.econ = (funzioni_low & 0x08) != 0

# Precedenza FULL su ECON
if self.full:
self.econ = False

# --- Logica OFF (Rilevata: Ventola 0, Master 1, Funzioni Standby) ---
ventola_off = (ventola_hex == 0)
self.off_mode = ventola_off and clima_master_standby and funzioni_standby

# Aggiornamento UI
self._update_ui()

except Exception as e:
print(f"Errore nel parsing dati ICS: {e}")
 
  • Mi piace
Reazioni: Melo81