Geiger Libelium et shield Ethernet

Bonsoir

Réalisation d'une station d’acquisition de mesure extérieur (température/hygrométrie et radio-activité :wink: )
Suis partie sur un Shield compteur Geiger de chez cooking-hacks
http://www.cooking-hacks.com/index.php/documentation/tutorials/geiger-counter-arduino-radiation-sensor-board#intro
avec un shield Ethernet et code WebServer http://arduino.cc/en/Tutorial/WebServer

la vue du montage http://ezza.free.fr/UC/arduino_geiger_eth.pdf

je cherche a fusionné les deux code Arduino mais le peux d'essais réalisé du mélange des 2 code me donne des valeurs aléatoire sur les mesures :~

je coince sur le mélange des deux boucles "void loop" ..... la cause des erreurs sur les valeurs ??
( je débute en prog. C )

une idée ????? ........ merci

Bonjour et bienvenue

D'un point de vue purement C, je pense qu'il n'y a pas trop de problème a mélanger les 2 codes.
Mais si tu obtiens des mesures erronées c'est probablement parce que l'exécution de la partie Web perturbe la partie mesure Geiger.

Si tu ne cherches pas à accéder au serveur Web, est-ce que les mesures restent cohérentes ? les mesures sont-elles erronées que lorsqu'il y a un accès web ?
Si c'est le cas, je pense que le problème viens que le code de lecture du compteur Geiger considère qu'un temps précis (10 sec) s'écoule entre chaque mesure.
or l'exécution de la partie Webserver va perturber ce temps.

Je te propose alors cette petite modification ;

loop()
{
  // S'il s'est écouléplus de 10 secondes depuis la sernière mesure, il est temps d'en faire une nouvelle
  if (millis()-timePreviousMeassure > 10000){
    // calcul du temps écoulé en secondes
    unsigned long elaspedTime = (millis() - timePreviousMeassure) / 1000;
    // calcul du nombre d'impulsion par minute
    countPerMinute = 60*count/elapsedTime;
    // remise à zéro du compteur ici et surtout pas en fin de boucle;
    count = 0
    // calcul de la radiation
    radiationValue = countPerMinute * CONV_FACTOR;
    // mise à jour du temps
    // il est plus précis d'ajouter le tempsécoulé plutot que de relire millis(). cela permet de lisser des erreurs
    timePreviousMeassure += 1000 * elaspedTime;
    // .....

    // supprimer le count = 0; en fin de if car on l'a fait plus haut
  }

  // ici mettre le code Webserver

}

Dis moi si ca change quelque chose

ezza:
Réalisation d'une station d’acquisition de mesure extérieur (température/hygrométrie et radio-activité :wink: )
...
une idée ????? ........ merci

bonjour
en dehors de la reponse de barbudor et lorsque la 1ere partie sera au point, il est tres important de mettre une signalisation
rouge clignotante et un signal sonore lorsque ces 3 conditions sont reunies :
si augmentation brusque de la RA ET augmentation brusque de la T° (penser à mettre une detection de fusion de la sonde T° ) ET diminution brusque de H° alors gros problemes rapidement en vue :grin: :grin: ----->[]

Tu veux dire qu'on est déjà mort ]:smiley:
Je croyais que la guerre froide était terminée ?

barbudor:
Tu veux dire qu'on est déjà mort ]:smiley:
Je croyais que la guerre froide était terminée ?

[Hum]
Les "guerres tièdes" sont peut être relativement plus vicieuses :grin:

salut

Barbudor merci pour l'aide, d'abord une mis au propre de la fusion des 2 codes ( avec l'aération qu'il faut pour la présentation/lecture)
pour une mis en ligne se soir.

bon d'accord, radio-activité et température non rien de commun, bien que ...... comme le dit Artouste "détection de fusion de la sonde " :slight_smile:
il y plus personne pour lire les valeurs :~

je pense aussi rajouter:

  • une détection d'orage (schema dispo dans la revue Elektor)
  • niveau d’électricité statique
  • champs magnétique
  • niveau d'orgone :smiley:
  • Niveau CEM (HF)

merci les Arduinovore :astonished:

Re

la compil donne des erreurs, surement pas suite a ta modif Barbudor, mais plus a la structure du code, une fission ... heu ... fusion des deux codes ( suis nullos en C .... mais je creuse :slight_smile: )

les erreurs
test_web_geiger.cpp: In function ‘void loop()’:
test_web_geiger.cpp:187: erreur: ‘elapsedTime’ was not declared in this scope
test_web_geiger.cpp:191: erreur: expected `;' before ‘radiationValue’
test_web_geiger.cpp: At global scope:
test_web_geiger.cpp:226: erreur: expected declaration before ‘}’ token

je balance le Code ..... Aie ... attention l’œil
http://ezza.free.fr/UC/GeigerWebVersion01

A+
il y a un bon tuto sur le C et l'Arduino sur la toile!
(le livre de Tavernier est très bien, mais pas assez expliqué/imagé sur le C)

ezza:
Re

la compil donne des erreurs, surement pas suite a ta modif Barbudor, mais plus a la structure du code, une fission ... heu ... fusion des deux codes ( suis nullos en C .... mais je creuse :slight_smile: )

bonjour
faut nettoyer le code (à l'eau lourde de preference ! 8) )
elapsedTime epsaledTime (dyslexie ? :grin: )
manque un ;
une } en trop

ce code compile

/*
  Web Server et GEIGER
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)
 
 
 */

#include <SPI.h>
#include <Ethernet.h>
#include <LiquidCrystal.h>

// Enter a MAC address and IP address.
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 33);

// (port 80 is default for HTTP):
EthernetServer server(80);


// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(3,4,5,6,7,8);

// Threshold values for the led bar
#define TH1 45
#define TH2 95
#define TH3 200
#define TH4 400
#define TH5 600

// Conversion factor - CPM to uSV/h
#define CONV_FACTOR 0.00812

// Variables
int ledArray [] = {10,11,12,13,9};
int geiger_input = 2;
long count = 0;
long countPerMinute = 0;
long timePrevious = 0;
long timePreviousMeassure = 0;
long time = 0;
long countPrevious = 0;
float radiationValue = 0.0;

// fin partie 1 geiger


void setup() {
  pinMode(geiger_input, INPUT);
  digitalWrite(geiger_input,HIGH);
  for (int i=0;i<5;i++){
    pinMode(ledArray[i],OUTPUT);
  }

 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());

//partie geiger
//set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Radiation Sensor");
  lcd.setCursor(0,1);
  lcd.print("Board - Arduino");  
  delay(1000);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" Test Cooking Hacks");
  delay(1000);

  lcd.clear();
  lcd.setCursor(0,1);  
  lcd.print("www.cooking-hacks.com");
  delay(500);
  for (int i=0;i<5;i++){
    delay(200);  
    lcd.scrollDisplayLeft();
  }
  delay(500);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  - Libelium -");
  lcd.setCursor(0,1);
  lcd.print("www.libelium.com");    
  delay(1000);

  lcd.clear();  
  lcd.setCursor(0, 0);
  lcd.print("CPM=");
  lcd.setCursor(4,0);
  lcd.print(6*count);
  lcd.setCursor(0,1);
  lcd.print(radiationValue);

  attachInterrupt(0,countPulse,FALLING);

}
// fin partie geiger


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
                    // add a meta refresh tag, so the browser pulls again every 5 seconds:
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
           int sensorReading = analogRead(analogChannel);
            
            client.print("compteur Geiger");
            client.print(radiationValue);
            client.println("
");
            client.print("analog input ");
            client.print(analogChannel);
             client.print(" is ");
            client.print(sensorReading);
                        client.println("
");      
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }

// partie geiger

// S'il s'est écouléplus de 10 secondes depuis la sernière mesure, il est temps d'en faire une nouvelle
  if (millis()-timePreviousMeassure > 10000){
    // calcul du temps écoulé en secondes
    unsigned long elapsedTime = (millis() - timePreviousMeassure) / 1000;
    // calcul du nombre d'impulsion par minute
    countPerMinute = 60*count/elapsedTime;
    // remise à  zéro du compteur ici et surtout pas en fin de boucle;
    count = 0;
    // calcul de la radiation
    radiationValue = countPerMinute * CONV_FACTOR;
    // mise à  jour du temps
    // il est plus précis d'ajouter le tempsécoulé plutot que de relire millis(). cela permet de lisser des erreurs
    timePreviousMeassure += 1000 * elapsedTime;
   
    // supprimer le count = 0; en fin de if car on l'a fait plus haut
  }

    Serial.print("cpm = "); 
    Serial.print(countPerMinute,DEC);
    Serial.print(" - ");
    Serial.print("uSv/h = ");
    Serial.println(radiationValue,4);      
    lcd.clear();    
    lcd.setCursor(0, 0);
    lcd.print("CPM=");
    lcd.setCursor(4,0);
    lcd.print(countPerMinute);
    lcd.setCursor(0,1);
    lcd.print(radiationValue,4);
    lcd.setCursor(6,1);
    lcd.print(" uSv/h");

    //led var setting  
    if(countPerMinute <= TH1) ledVar(0);
    if((countPerMinute <= TH2)&&(countPerMinute>TH1)) ledVar(1);
    if((countPerMinute <= TH3)&&(countPerMinute>TH2)) ledVar(2);
    if((countPerMinute <= TH4)&&(countPerMinute>TH3)) ledVar(3);
    if((countPerMinute <= TH5)&&(countPerMinute>TH4)) ledVar(4);
    if(countPerMinute>TH5) ledVar(5);

    //  count = 0;

  }



void countPulse(){
  detachInterrupt(0);
  count++;
  while(digitalRead(2)==0){
  }
  attachInterrupt(0,countPulse,FALLING);
}

void ledVar(int value){
  if (value > 0){
    for(int i=0;i<=value;i++){
      digitalWrite(ledArray[i],HIGH);
    }
    for(int i=5;i>value;i--){
      digitalWrite(ledArray[i],LOW);
    }
  }
  else {
    for(int i=5;i>=0;i--){
      digitalWrite(ledArray[i],LOW);
    }
  }

}

bonsoir

Artouste merci de l'élagage, pas d'erreurs a la compil. , la partie Lan est fonctionnelle ........ C Super ..... merci =(

un pt'i prob. pour la partie barre Led de la carte, les seuils d'allumage ne sont pas respecté
( la partie du code avec #define TH1 45 ..TH2 95 ....etc )
j'ai déplacé plus haut dans le prog. les 5 lignes ( mis après include) ..... un léger mieux, plus que 2 led allumé pour une valeur "moyenne "de 38 CPM.

j'ai cherché sur le web "Optimisation de code" , et bien c pas gagner :~ .....la prog en C doit coller a l’architecture du micro-contrôleur :grin:
( et puis je me plante, avant de parlé d'optim. il faut que je commence a apprendre le C :blush: )

bon je retourne a mon cours, de bon tuto sur la toile.

merci a Vous
.... ne vous geigérizépa ....heu .. ne vous gêné pas pour allégé/modif le Code

bon reste une autre partie a faire, sous Ubuntu avec la bar des taches, a coter de météo http://ezza.free.fr/UC/barGeigerUbuntu.jpeg

ezza:
.... ne vous geigérizépa ....heu .. ne vous gêné pas pour allégé/modif le Code

bon reste une autre partie a faire, sous Ubuntu avec la bar des taches, a coter de météo http://ezza.free.fr/UC/barGeigerUbuntu.jpeg

bonjour

[HUM]
:grin: ----->[]


[/HUM]

Bonsoir

salut Artouste, ..... me suis un peux planté sur l'unité, c'est pas des µSv/h mais des grammes, pour reste dans ta vision tout en couleurs de ma recopie d'écran ...... je n’enduirai pas plus sur le chujet .... heu... sujet :zipper_mouth_face:

.... la suite, Arduino et Http.
me suis amusé avec d'autre exemple de code, pour la partie Ethernet du projet, et bien la aussi un autre monde :slight_smile:
l'écriture du code pour un débutant est mission z'impozible, donc je copi/coll, un peux comme les gommettes de couleur 8)
je me retrouve avec mon réseau local (IP fixe) saturé, le ping par en flèche, donc la aussi la structure du code est important.
( un des exemple http://linuxedu.ac-toulouse.fr/doku.php?id=materiel:arduino:ressources:pedagogiques)

bon je vais voir pour décortiquer la partie compteur Geiger, et comprendre les modifs que tu commenté Artouste (encore merci)

Apluch