On revient à nos bonnes vieilles Arduino Uno avec un protoshield et un bornier à vis.
La communication ne se fera qu'en liaison série tant pis.
Le programme Arduino cesiSerialDt_2018_Uno.ino est le suivant :
// D2 = Sharky E // D3 = Sharky V // D4 = Ray1 E // D5 = Ray1 V // D6 = Ray2 E // D7 = Ray2 V // A0 = pyranomètre // A1 = PT1000 Regulateur // A2 = PT1000 Regulateur // A3 = PT100 extérieur // La durée des impulsions est de 125ms. C'est assez long mais surveiller qu'on n'en rate pas tout de même. // écriture sur la liaison série usb = 1 ms // gestion de l'analogique = 1ms #define nDPinsIn 6 byte dPinsIn[] = {2, 3, 4, 5, 6, 7}; #define nAPins 4 byte aPins[] = {0,1,2,3}; int periodeAnalog = 100; // en ms #define nDPinsOut 2 byte dPinsOut[] = {8,9}; int periodeEnvoi = 5; // en s boolean pEtat[nDPinsIn]; long pt[nDPinsIn]; float deltaTIn[nDPinsIn]; byte nImp[nDPinsIn]; long vAnalogSum[nAPins]; long toAnalog = 0; int nAnalog = 0; long toPeriodeEnvoi; long toTimeOut [nDPinsIn]; String chaineRecue = ""; boolean recuValid = false; void setup() { Serial.begin(57600); for (int i = 0; i < nDPinsIn ; i++){ pinMode(dPinsIn[i],INPUT_PULLUP); } for (int i = 0; i < nDPinsOut ; i++){ pinMode(dPinsOut[i],OUTPUT); digitalWrite(dPinsOut[i],LOW); } toPeriodeEnvoi=millis(); } void loop() { long maintenant = millis(); while (Serial.available()) { //tant que caractères en attente. char c = Serial.read(); //on lit le message if (c != 10 && c != 13) { //nettoyage de la chaine chaineRecue += c; //on ajoute le caractère } else{ recuValid = true; } } if(chaineRecue.substring(0,2) == "DO" && recuValid){ int nPin = chaineRecue.charAt(2)-48; int etat = chaineRecue.charAt(3)-48; if (nPin<nDPinsOut && etat<2){ Serial.print("DEBUG- pin "); Serial.print(dPinsOut[nPin]); Serial.print(" etat = "); Serial.println(etat); digitalWrite(dPinsOut[nPin],etat); }else{ Serial.println("DEBUG- chaine recue non conforme"); } } if (recuValid){ chaineRecue = ""; recuValid = false; } // chaine à envoyer if (maintenant-toPeriodeEnvoi>periodeEnvoi*1000){ String aEnvoyer; aEnvoyer += maintenant/1000; aEnvoyer += ";"; for (int i = 0; i < nDPinsIn ; i++){ if (nImp[i] == 0){ aEnvoyer += ";0"; } else{ aEnvoyer += round(deltaTIn[i]); aEnvoyer += ";"; aEnvoyer += nImp[i]; } aEnvoyer += ";"; nImp[i] = 0; } for (int i = 0; i < nAPins ; i++){ aEnvoyer += (float)vAnalogSum[i]/nAnalog; aEnvoyer += ";"; vAnalogSum[i] = 0; } nAnalog = 0; Serial.println(aEnvoyer.substring(0,aEnvoyer.length()-1)); toPeriodeEnvoi = maintenant; } // gestion des entrées digitales boolean etat; for (int i = 0; i < nDPinsIn ; i++){ etat = digitalRead(dPinsIn[i]); if (etat == 0 && pEtat[i] == 1){ long deltaT = maintenant-pt[i]; if (deltaT>1000){ nImp[i]++; deltaTIn[i] = ((nImp[i]-1)*deltaTIn[i]+deltaT)/nImp[i]; pt[i] = maintenant; Serial.print("DEBUG- imp/"); Serial.print(i); Serial.print(" -dt="); Serial.print(round(deltaTIn[i])); Serial.print("@"); Serial.println(maintenant); } } pEtat[i] = etat; } // gestion des entrées analogiques if (maintenant - toAnalog > periodeAnalog){ int valeur; for (int i = 0; i < nAPins ; i++){ valeur = analogRead(aPins[i]); vAnalogSum[i] += valeur; } nAnalog ++; toAnalog = maintenant; } }
Aucun commentaire:
Enregistrer un commentaire