Bonjour,
Je suis en terminale Sti2D specialité sin et jai un projet de fin d'année(bien avancé) qui est une station meteo.Elle recoit des donné et grace a un programme(arduino) les transformes en variables. Je dois ensuite envoyer ces variables sur une seconde carte arduino grace a deux cartes xbee. Le programme des capteurs n'etant pas ma partie , jai du mal a le comprendre, surtout qu'ilo est assez complexe. le voici
citation :
#include "DHT.h"
#define uint unsigned int
#define ulong unsigned long
#define DHTPIN 11 // Digital 6
#define PIN_ANEMOMETER 9 // Digital 2
#define PIN_RAINGAUGE 10 // Digital 3
#define PIN_VANE 5 // Analog 5
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// Combien de fois nous voulons calculer la vitesse ou la direction du vent
#define MSECS_CALC_WIND_SPEED 2000
#define MSECS_CALC_WIND_DIR 2000
#define MSECS_CALC_RAIN_FALL 2000
volatile int numRevsAnemometer = 0; // Incrémenté à l'interruption
volatile int numDropsRainGauge = 0; // Incrémenté à l'interruption
ulong nextCalcSpeed; // Quand nous avons ensuite calculé la vitesse du vent
ulong nextCalcDir; // Quand nous avons ensuite calculé la direction
ulong nextCalcRain; // Quand nous avons ensuite calculé la chute de pluie
ulong time; // Millis () à chaque début de boucle ().
#define NUMDIRS 8 // Lectures ADC:
ulong adc[NUMDIRS] = {26, 45, 77, 118, 161, 196, 220, 256};
// Ces directions correspondent à 1-for-1 avec les valeurs dans adc, mais // devra être ajusté comme indiqué ci-dessus. Modifiez 'dirOffset' // auquel la direction est 'loin' (c'est l'Ouest ici).
char *strVals[NUMDIRS] = {"W","NW","N","SW","NE","S","SE","E"};
byte dirOffset=0;
int humidi;
int temper;
// innitialisation
void setup() {
Serial.begin(9600);
pinMode(PIN_ANEMOMETER, INPUT);
digitalWrite(PIN_ANEMOMETER, HIGH);
digitalWrite(PIN_RAINGAUGE, HIGH);
attachInterrupt(0, countAnemometer, FALLING);
attachInterrupt(1, countRainGauge, FALLING);
nextCalcRain = millis() + MSECS_CALC_RAIN_FALL;
nextCalcSpeed = millis() + MSECS_CALC_WIND_SPEED;
nextCalcDir = millis() + MSECS_CALC_WIND_DIR;
dht.begin();
}
void loop() {
// lire la température el l'humidité tout les 250 milliseconds!
time = millis();
float h = dht.readHumidity();
float t = dht.readTemperature();
// Vérifier si les rendements sont valables si elles sont NaN (not a number) puis quelque chose s'est mal passé!
if (time >= nextCalcSpeed) {
calcWindSpeed();
nextCalcSpeed = time + MSECS_CALC_WIND_SPEED;
}
if (time >= nextCalcDir) {
calcWindDir();
nextCalcDir = time + MSECS_CALC_WIND_DIR;
}
if (time >= nextCalcRain) {
calcRainFall();
nextCalcRain = time + MSECS_CALC_RAIN_FALL;
}
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
} else {
Serial.print("Humidite: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
humidi = analogRead(h);
Serial.print(h);
delay(50);
temper = analogRead(t);
Serial.print(t);
delay(50);
}
}
// Interrompre l'entraîneur pour l'anémomètre. Appelé chaque fois le roseau(l'anche)
// Commuter(changer) de détentes (une révolution).
void countAnemometer() {
numRevsAnemometer++;
}
// Interrompre l'entraîneur pour le pluviomètre. Appelé chaque fois le roseau(l'anche)
// Commuter(changer) de détentes (une baisse(goutte)).
void countRainGauge() {
numDropsRainGauge++;
}
// Trouver la direction des ailettes.
void calcWindDir() {
int val;
byte x, reading;
val = analogRead(PIN_VANE);
val >>=2;
reading = val;
// Regard(apparence) la lecture en haut dans table de directions. Trouvez la première valeur
// C'est > = à ce que nous sommes arrivés.
for (x=0; x<NUMDIRS; x++) {
if (adc[x] >= reading)
break;}
x = (x + dirOffset) % 8; // Adjuster l’orientation
Serial.print(" Direction: ");
Serial.println(strVals[x]);
Serial.print(x);
delay(50);
}
// Calculer la vitesse de vent et montrer(afficher-le) (ou enregistrer-le, indépendamment de ).
// 1 rev/seconde = 1.492 kms/h = 2.40114125 kms/h
void calcWindSpeed() {
int x, iSpeed;
// Ceci produira le km/h * 10
// (N'a pas fait calc de droit quand fait comme une déclaration)
long speed = 24011;
speed *= numRevsAnemometer;
speed /= MSECS_CALC_WIND_SPEED;
iSpeed = speed; // Avoir-en besoin pour formater ci-dessous
Serial.print("vitesse du vent: ");
x = iSpeed / 10;
Serial.print(x);
Serial.print('.');
x = iSpeed % 10;
Serial.print(x);
numRevsAnemometer = 0; // compteur remis à zéro
Serial.println(iSpeed);
delay(50);
}
// Calculer la pluie et montrer(afficher-le) (ou enregistrer-le, indépendamment de ).
// 1 seau = 0.2794 mm
void calcRainFall() {
int x, iVol;
// Ceci produira le mm * 10000 // (n'a pas fait calc de droit quand fait comme une déclaration)
long vol = 2794; // 0.2794 mm
vol *= numDropsRainGauge;
vol /= MSECS_CALC_RAIN_FALL;
iVol = vol; // Avoir-en besoin pour formater ci-dessous
Serial.print("pluie: ");
x = iVol / 10000;
Serial.print(x);
Serial.print('.');
x = iVol % 10000;
Serial.print(x);
Serial.println();
numDropsRainGauge = 0; // compteur remis à zéro
Serial.print(iVol);
}
Donc il affiche 5 varaibles( vitesse vent, direction,humidité temperature , et pluviometre) dans le moniteur serie de la premiere arduino.
comme sa :
http://imagesia.com/sans-titre_g3pv
Pouvez vous m'aidez a mettre les "instructions" (lignes)pour pouvoir envoyer ces 5 variables tel quelle et les afficher sur le moniteur serie de la seconde arduino. Je sais envoyer une variable a partir d'un potentiometre mais la c'est pas du tout pareil.
J'ai aussi mon programme recepteur qui n'est peut etre pas juste :
citation :
int incomingByte = 0; // for incoming serial data
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
Donc si vous pouvez m'aidez pour l'emission des 5 variables , sa serait vraiment cool ! merci !!!!!!!!! et désolé si les programmes sont mal affichés.
Hors ligne
Hors ligne
Pages: 1