Materiale di recupero:
3 bottiglie plastica, 3 staffe alluminio, 1 cuscinetto a sfereMateriale da acquistare:
Moduli arduino (2 x 3€)
Modulo RX TX per Arduino (3€)
Modulo display LCD (2€)
Contachilometri per bici (6€) – opzionale
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);
}