Protocole de Communication :
Arduino =
// D9 = Sharky E // D13 = Sharky V // D0 = Ray1 E // D1 = Ray1 V // D2 = Ray2 E // D3 = Ray2 V // A18 = pyranomètre // A8 = PT1000 Regulateur // A11 = PT1000 Regulateur // A12 = PT100 extérieur
liaison Série = 17 octets
Tps Arduino;
SharkyE nImpulsions; SharkyE Dt; SharkyV nImpulsions; SharkyV Dt;
Ray1E nImpulsions; Ray1E Dt; Ray1V nImpulsions; Ray1V Dt;
Ray2E nImpulsions; Ray2E Dt; Ray2V nImpulsions; Ray2V Dt;
analog pyranomètre; analog PT1000 reg; analog PT1000 reg; analog PT100 ext
Fichier csv : 1 ligne = 18 Octets de l'Arduino, 12 Octet de MBus
TimeStamp;Temps Arduino;kWh cumulés par Sharky; puissance en Wh sur Sharky; l cumulés par Sharky; débit en l/h sur Sharky;
kWh cumulés par Ray1; puissance en Wh sur Ray1; l cumulés par Ray1; débit en l/h sur Ray1;
kWh cumulés par Ray2; puissance en Wh sur Ray2; l cumulés par Ray1; débit en l/h sur Ray2;
analog pyranomètre; analog PT1000 reg; analog PT1000 reg; analog PT100 ext;
énergie cumulée kWh;
volume cumulé m3; Volume = ??; volume = ?? Toujours 0,6; Volume = ?? Toujours 0,3;
Erreur;
Débit en m³/h; Puissance en W = 1,16*débit*deltaTemp;
temp sortie ballon en °C; temp entrée ballon en °C; deltaTemp;
energie = ??
Programme Arduino :
// D9 = Sharky E // D13 = Sharky V // D0 = Ray1 E // D1 = Ray1 V // D2 = Ray2 E // D3 = Ray2 V // A18 = pyranomètre // A8 = PT1000 Regulateur // A11 = PT1000 Regulateur // A12 = 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 d'une ligne lcd = 10ms (c'est le plus long mais c'est optionnel) // écriture sur la liaison série usb = 1 ms // gestion de l'analogique = 1ms // #include <UC1701.h> static UC1701 lcd; const int backlightPin = 26; const int buttonEnterPin = 24; const int buttonUpPin = 25; const int buttonDownPin = 23; #define nDPinsIn 6 byte dPinsIn[] = {9, 13, 0, 1, 2, 3}; #define nAPins 4 byte aPins[] = {18,8,11,12}; int periodeAnalog = 100; // en ms #define nDPinsOut 2 byte dPinsOut[] = {5,17}; int periodeEnvoi = 30; // 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() { pinMode(buttonEnterPin, INPUT); pinMode(buttonUpPin, INPUT); pinMode(buttonDownPin, INPUT); pinMode(backlightPin, OUTPUT); digitalWrite (backlightPin, 0); lcd.begin(); lcd.setCursor(0, 0); lcd.print("CESI"); SerialUSB.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 (SerialUSB.available()) { //tant que caractères en attente. char c = SerialUSB.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){ SerialUSB.print("DEBUG- pin "); SerialUSB.print(dPinsOut[nPin]); SerialUSB.print(" etat = "); SerialUSB.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; SerialUSB.println(aEnvoyer.substring(0,aEnvoyer.length()-1)); lcd.setCursor(0, 1); lcd.print(aEnvoyer.substring(0,21)); 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; SerialUSB.print("DEBUG- imp/"); SerialUSB.print(i); SerialUSB.print(" -dt="); SerialUSB.print(round(deltaTIn[i])); SerialUSB.print("@"); SerialUSB.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