Ciao Michele…
Se avessi provato a compilare ciò che hai postato avresti saputo senza chiederlo che non può funzionare, per errori di vario genere…
Ad esempio hai usato il metodo di dichiarazione dei pin di Arduino per dichiarare i pin del PCF, eppure hai usato un esempio della IOexp ed avresti dovuto sapere che i pin del PCF non vanno dichiarati come input o output
schdosatore.write(P0,OUTPUT);
Non so quante volte te lo ho scritto, ma continuare ad usare sketch scritti da altri non solo non ti aiuta a capire cosa fai, ma ti fa commettere diversi errori, che da ciò che vedo sono soprattutto dovuti al fatto che non ti sei mai messo seriamente ad imparare come si programma Arduino…

In più, te lo scrivo simpaticamente

, mi metti nella condizione dello zoppo che aiuta lo sciancato perché non è che io sia questa grande cima in programmazione, credimi!

Ad ogni modo ecco cosa hai fatto: hai preso l'esempio dei millis, lo hai messo nel frullatore insieme a quello della IOexp e di nuovo hai chiesto se così poteva funzionare, ma non è così che si fa

Scrivendo oltretutto tre funzioni identiche ma una per ogni dosatore.
Voglio aiutarti, ma tu devi impegnarti e studiare un pochino come tutti io compreso facciamo.
Iniziamo:
Aprendo il file .h della IOexp vedrai che ogni pin del PCF ha un suo indirizzo, quindi puoi dichiarare come costanti i dosatori e dargli un nome per esmpio
const byte fertilizzante = 0x1; //corrisponde al pin 0 del pcf
const byte biocondizionatore = 0x2; //corrisponde al pin 1 del pcf
e via così per i dosatori.
Altra cosa, puoi dichiarare dei tempi di dosaggio, suppongo che a x tempo di funzionamento del dosatore corrispondano tot ml di liquido erogato, quindi puoi fare una cosa del genere:
unsigned long unadose = 10000; //1 secondo
unsigned long duedosi = 20000; //2 secondi
unsigned lond tredosi = 30000; //3 secondi
a questo punto puoi scriverti una funzione tipo questa:
void attivadosatore( byte dosatore, unsigned long dose)
{ schdosatore.write(dosatore, true); //attivo il dosatore
//calcolo il tempo trascorso in base a dose
// e se il tempo di funzionamento del dosatore è >= a dose…
schdosatore.write(dosatore, false); //disattivo il dosatore
}
All'interno del loop quando è il momento giusto richiamerai la funzione scrivendo:
attivadosatore(fertilizzante, tredosi);
attivadosatore(biocondizionatore, unadose);
Ora mi aspetto che tu metta su una bread o quello che ti pare per poter provare in modo efficace lo sketch che scriverai da solo senza scopiazzare in giro ]

]

]

Ciao
P.S. leggi qua e fatti due risate
http://www.leonardomiliani.com/2013/la-sindrome-di-gundam/