CAMERA TRAP – TRAPPOLA FOTOGRAFICA

Fotografare gli animali, per chi vuole farlo per hobby, non è facile. Gli animali sono guardinghi, un rumore, un ombra, un odore li allerta e non ci fa avvicinare.

Poi ci sono animai notturni ed animali diurni e restare sveglio tutta la notte per fotografare un riccio o una talpa si può fare una notte, ma spesso per catturare una bella immagine ci vogliono molte nottate.

In commercio ci sono numerosi prodotti che però hanno un costo che supera qualche centinaio di euro.

foto 1

Unendo la mia passione per la natura, la fotografia e l’elettronica, ho dealizzato una “Foto-trap” con poche decine di euro e di seguito ne fornisco la descrizione.

Ed ecco chi ha visitato il mio giardino stamani:

Nei prossimi giorni inserirò foto di chi verrà a fare visita nel mio giardino di notte …

Dettaglio costi con lo sketch del programma installato su arduino verrà inserito nel blog a giorni. 

foto 4

foto 3

foto 2

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);

}