jeudi 15 mars 2018

Arduino 1 - Industruino 0

Impossible de faire fonctionner les industruinos. Les entrées analogiques indiquent n'importe quoi.
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