ANEMOMETRO CON TRASMISSIONE DATI CON MENO DI 20€

Materiale di recupero:

3 bottiglie plastica, 3 staffe alluminio, 1 cuscinetto a sfereDSCF0027Materiale da acquistare:                        

Moduli arduino (2 x 3€)

Modulo RX TX per Arduino (3€)

Modulo display LCD (2€)

Contachilometri per bici (6€) – opzionale

anemometro

 Programmi da caricare sui moduli arduino:

 /* ANEMOMETRO Arduino by Roberto Grassetti, da un modifica di: “Cycle Computer” By: Adam O’Hern, Alexdlp/Instructables, Enkel Bici, Vittorio Zuccalà, Matteo Calgaro) */

#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>
#include <math.h>
#include <SPI.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#include <VirtualWire.h>//libreria per moduli RTX
#include <stdio.h>//libreria necessaria per la funzione dtostrf
int LED = 13;
int SensorPin = 5; // ingresso inpulsi rotore
int raggio = 3100; //Diametro rotore in millimetri
int val = 0;
int previousVal = 0;
int debounce = 10;
int cycles = 1;
float velocitavento = 0;
float averageSpeed = 0;
unsigned long revTimer;
unsigned long serialTimer;
unsigned long rideTimer;
boolean activeRiding = false;
boolean activityChange = true;
long inactivityTimer;
long activeRidingOffset = 0;
boolean newRide = true;;
void setup() {
  lcd.begin(20,4);
  Serial.begin(9600); //inizializzo seriale
  vw_setup(2000); //inizializzo la trasmissione a 2000 bits per secondo
  pinMode(LED, OUTPUT);
  pinMode(SensorPin, INPUT);
lcd.clear();
Serial.begin(9600);
revTimer = millis();
serialTimer = millis();
rideTimer = millis();
}
void loop(){
if(!activeRiding) {
if(activityChange) {
inactivityTimer = millis();
activityChange = false;
}
}
else {
if(activityChange) {
activeRidingOffset += millis() - inactivityTimer;
activityChange = false;
}
}
val = digitalRead(SensorPin);
if (val==LOW) {
digitalWrite(LED, LOW);
previousVal = LOW;
}
else{
digitalWrite(LED, HIGH);
lcd.setCursor(1, 0);
lcd.print("*");
lcd.setCursor(1, 0);
lcd.print(" ");
if (previousVal != HIGH && millis() - revTimer > debounce) {
pulse();
}
previousVal = HIGH;
}
if(millis()-revTimer > 2000) {
velocitavento = 0;
sendStats();
if(activeRiding) {
activityChange = true;
activeRiding = false;
}
}
if (millis() - revTimer > 15*60*1000) {
newRide = true;
}
}
void pulse() {
if(newRide) {
lcd.clear();
cycles = 0;
averageSpeed = 0;
rideTimer = millis();
}
cycles++;
velocitavento = (float) (millis() - revTimer)*0.001;
velocitavento = raggio/velocitavento;
velocitavento = velocitavento*0.0036;
unsigned long activeRidingMillis = millis() - rideTimer - activeRidingOffset;
float activeRidingSeconds = (float) activeRidingMillis*0.001;
revTimer = millis();
sendStats();
newRide = false;
if(!activeRiding) {
activityChange = true;
activeRiding = true;
}
}
void sendStats() {
lcd.setCursor(0, 0);
lcd.print("Velocita' del vento: ");
lcd.setCursor(0, 1);
lcd.print(velocitavento,1);
lcd.setCursor(10, 1);
lcd.print("Km/h");
Serial.print(velocitavento,1);
Serial.println("Km/h");
serialTimer = millis();
char risultato[5]; //definisco il buffer che conterra' il valore del float convertito in stringa
float voltage = velocitavento;
dtostrf(voltage, 5, 2, risultato);//converto da voltage (float) a risultato (char)
send(risultato);//trasmetto via rf il contenuto di risultato (char)
}
void send (char *message)
{
  vw_send((uint8_t *)message, strlen(message));
  vw_wait_tx(); // Wait until the whole message is gone
}
RICEVITORE 
 

/*  Shield arduino per riceve il valore della velocità del vento misuratae trasmessa da arduino anemometro Il modulo RX si connette ad arduino al pin 11.*/

#include <Wire.h>  // Comes with Arduino IDE

#include <LiquidCrystal_I2C.h>

#include <math.h>

#include <SPI.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

#include <VirtualWire.h>//libreria per moduli RTX

#include <stdio.h>//libreria necessaria per la funzione dtostrf

byte message[VW_MAX_MESSAGE_LEN];    // a buffer to hold the incoming messages

byte msgLength = VW_MAX_MESSAGE_LEN; // the size of the message

char stringain [6];

int i=0;

void setup()

{

    lcd.begin(20,4);

    lcd.clear();

    Serial.begin(9600);

    // Initialize the IO and ISR

    vw_setup(2000);             // Bits per sec

    vw_rx_start();              // Start the receiver

}

void loop()

{

    lcd.setCursor(0, 0);

    lcd.print(“Velocita’ del vento: “);

    lcd.setCursor(0,1);

    if (vw_get_message(message, &msgLength)) // Non-blocking

    {

        Serial.print(“Km/ora : “);

        for (int i = 0; i < msgLength; i++)

    {

        Serial.write(message[i]);

        stringain [i]  = char (message[i]);

    }

    Serial.println();

     lcd.setCursor(i,1);

     lcd.print(stringain);

    }

    lcd.setCursor(10, 1);

    lcd.print(“Km/h”);

    delay(500);

}

 
ANEMOMETRO CON TRASMISSIONE DATI CON MENO DI 20€ultima modifica: 2016-03-13T22:53:27+01:00da roberto2109
Reposta per primo quest’articolo