Bonjour à tous,
Voici le code optimisé suivant vos suggestions et surtout celles de rjnc38 pour la gestion de la vitesse max avec un travail sur la variable "rotations" et une application de la formule de vitesse à la fin du traitement, juste avant la publication.
Encore merci à tous !
//Capteur anémomètre-Girouette DAVIS
//Inspiré du site ci dessous
//http://cactus.io/hookups/weather/anemometer/davis/hookup-arduino-to-davis-anemometer-software
#include <SPI.h>
#include <Ethernet.h>
#include "TimerOne.h"
#include <math.h>
#include "cactus_io_DS18B20.h"
#define TX_Pin 8
#define DS18B20_Pin 9
#define WindSensor_Pin (2)
#define WindVane_Pin (A2)
#define VaneOffset 0
volatile unsigned long tipCount;
volatile unsigned long contactTime;
volatile unsigned int timerCount;
//volatile unsigned long rotations;
volatile unsigned int rotations;
volatile unsigned int averageRotations;
volatile unsigned long contactBounceTime;
const float DEG2RAD = 3.14156 / 180.0; // convert degrees to radian
const float RAD2DEG = 180 / 3.14156; //convert radian to degrees
int winDir[48];
float sinSum = 0;
float cosSum = 0;
volatile float windSpeed;
volatile float xMin;
int vaneValue;
int vaneDirection;
int calDirection;
int lastDirValue;
float minTemp = 0;
float maxTemp = 0;
const int numReadings = 48;//5mn
//const int numReadings = 48;//2mn
int readings[numReadings];
int readIndex = 0;
int totalRotations = 0;
int windDirection = 0;
int windSpeedMax = 0;
int rotationsMax = 0;
int averageSpeed = 0;
int readingsDir[numReadings];
int readIndexDir = 0;
int avg_windDirection = 0;
int avgWinDir = 0;
String girouette = "";
DS18B20 ds(DS18B20_Pin); // on digital pin 9
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 19);
EthernetServer server(80);
void setup() {
lastDirValue = 0;
rotations = 0;
timerCount = 0;
ds.readSensor();
minTemp = ds.getTemperature_C();
maxTemp = ds.getTemperature_C();
// disable the SD card by switching pin 4 high
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
for (int readIndex = 0; readIndex < numReadings; readIndex++) {
readings[readIndex] = 0;
}
for (int readIndexDir = 0; readIndexDir < numReadings; readIndexDir++) {
winDir[readIndexDir] = 0;
}
pinMode(TX_Pin, OUTPUT);
pinMode(WindSensor_Pin, INPUT);
attachInterrupt(digitalPinToInterrupt(WindSensor_Pin), isr_rotation, FALLING);
// Setup the timer interupt for 0.5 second (500 000 microSecondes)
Timer1.initialize(500000);
Timer1.attachInterrupt(isr_timer);
sei();
}
void loop() {
ds.readSensor();
// update min and max temp values
if (ds.getTemperature_C() < minTemp) {
minTemp = ds.getTemperature_C();
}
if (ds.getTemperature_C() > maxTemp) {
maxTemp = ds.getTemperature_C();
}
getWindDirection();
// Only update the display if change greater than 5 degrees.
if (abs(calDirection - lastDirValue) > 5) {
lastDirValue = calDirection;
}
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
digitalWrite(TX_Pin, HIGH);
client.println(F("HTTP/1.1 200 OK"));
client.println(F("Content-Type: text/html"));
client.println(F("Connection: close"));
client.println(F("Refresh: 10"));
client.println();
client.println(F("<!DOCTYPE HTML>"));
client.println(F("<html><body>"));
client.print(F("<span style=\"font-size: 15px\";>"));
client.print(F("
Vent instantane : "));
client.print(windSpeed);
client.println(F(" Km/h"));
client.print(F("
Vent moyen (sur 2 mn) "));
client.print(averageSpeed);
client.println(F(" Km/h"));
client.print(F("
Vent maxi "));
client.print(windSpeedMax);
client.println(F(" Km/h"));
getWindDirection();
client.print(F("
Direction instantannee : "));
getHeading(calDirection);
client.print(girouette);
client.print(F(" - "));
client.print(calDirection);
client.print(F(" ° "));
getWindDirection();
client.print(F("
Direction moyenne (sur 2 mn) : "));
getHeading(avg_windDirection);
client.print(girouette);
client.print(F(" - "));
client.print(avg_windDirection);
client.print(F(" ° "));
client.print(F("
Temperature : "));
client.print(ds.getTemperature_C());
client.println(char(176));
client.println(F(" C"));
client.print(F("
Temperature mini : "));
client.print(minTemp);
client.println(char(176));
client.println(F(" C"));
client.print(F("
Temperature maxi : "));
client.print(maxTemp);
client.println(char(176));
client.println(F(" C </span>"));
client.println(F("</html>"));
digitalWrite(TX_Pin, LOW);
break;
}
if (c == '\n') {
currentLineIsBlank = true;
} else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
}
delay(1);
client.stop();
Ethernet.maintain();
}//Fin loop
// isr routine for timer interrupt
void isr_timer() {
timerCount++;
if (timerCount == 5)//5 x .5 = 2.5 s
{
// convert to mp/h using the formula V=P(2.25/T)- Davis Anemometer
// V = P(2.25/2.5) = P * 0.9
//en Km/h = P * 0.9 * 1.60934
windSpeed = rotations * 0.9 * 1.60934;
// ************Calcul moyenne sur 2 mn avec les rotations************
totalRotations = totalRotations - readings[readIndex];
readings[readIndex] = rotations;
totalRotations = totalRotations + readings[readIndex];
readIndex = readIndex + 1;
if (readIndex >= numReadings) {
readIndex = 0;
}
averageRotations = totalRotations / numReadings;
if (rotations >= rotationsMax) {
rotationsMax = rotations;
}
averageSpeed = averageRotations * 0.9 * 1.60934;
windSpeedMax = rotationsMax * 0.9 * 1.60934;
rotations = 0;
timerCount = 0;
}
}
// interrupt handler to increment the rotation count for wind speed
void isr_rotation () {
if ((millis() - contactBounceTime) > 15 ) {
rotations++;
contactBounceTime = millis();
}
}
// Get Wind Direction
void getWindDirection() {
vaneValue = analogRead(WindVane_Pin);
// Serial.print(vaneValue);
// Serial.println();
vaneDirection = map(vaneValue, 0, 1023, 0, 360);
calDirection = vaneDirection + VaneOffset;
if (calDirection > 360)
calDirection = calDirection - 360;
if (calDirection < 0)
calDirection = calDirection + 360;
//*********Calcul Moyenne Direction**************
winDir[readIndexDir] = calDirection;
readIndexDir = readIndexDir + 1;
if (readIndexDir == numReadings ) {
for (readIndexDir = 0; readIndexDir < numReadings; readIndexDir++)
{
sinSum += sin((winDir[readIndexDir]) * DEG2RAD);
cosSum += cos((winDir[readIndexDir]) * DEG2RAD);
}
float avgWinDir = atan2(sinSum, cosSum);
avgWinDir = avgWinDir / DEG2RAD;
if ( avgWinDir < 0 )
{
avgWinDir += 360;
}
int windDirection = (int)avgWinDir % 360;
avg_windDirection = windDirection;
sinSum = 0;
cosSum = 0;
readIndexDir = 0;
}
}
// Converts compass direction to heading
void getHeading(int direction) {
if (direction < 22)
girouette = (" N");
else if (direction < 67)
girouette = (" NE");
else if (direction < 112)
girouette = (" E");
else if (direction < 157)
girouette = (" SE");
else if (direction < 202)
girouette = (" S");
else if (direction < 247)
girouette = (" SO");
else if (direction < 292)
girouette = (" O");
else if (direction < 337)
girouette = (" NO");
else
girouette = (" N");
}