mardi 13 février 2018

Arduino Processing 2

Les programmes



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