Attivazione Relè con arduino e DS1302 per 15 secondi ogni 10 minuti

Salve a tutti del forum!!!
Sono di nuovo qua a chiedervi aiuto.

Sto costruendo un dissuasore sonoro per piccioni che riproduca il suono degli uccelli predatori per evitare di raccogliere continuamente il loro guano dalle grondaie di casa mia.

Avevo pensato di usare arduino, un modulo RTC Ds-1302 ed un relè che mi faccia partire un amplificatore che riproduca i richiami di questi uccelli predatori per 15 secondi ogni 10 minuti, dalle 7:30 di mattina alle 18:00 e stia inattivo per tutta la notte fino alle successive 7:30 dell'indomani.

Dopo varie ricerche ho trovato uno sketch molto semplice da capire e molto semplice nella struttura che recupera l'orario dall'RTC e fa attivare un relè ad una certa ora...

posto il codice:

#include <Wire.h>
#include "RTClib.h"
#define RELAY_PIN 2

RTC_DS1307 RTC;

void setup() {
  
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();  
  pinMode(7, INPUT);
  pinMode(RELAY_PIN, OUTPUT);
 }

void loop() {
  DateTime now = RTC.now();
  int nowHourMinute = now.hour() * 100 + now.minute();

      if(nowHourMinute > 1800 && nowHourMinute < 0100) {  // ORARIO ACCENSIONE FISSA
        digitalWrite(RELAY_PIN, HIGH);
    delay (1000);
      }
   else if(nowHourMinute == 0100) {
       digitalWrite(RELAY_PIN, LOW);
   }

C'è qualcuno che potrebbe darmi dei lumi su come muovermi per completare il mio progetto?

Grazie anticipatamente per l'aiuto!! :slight_smile: :slight_smile:

Ciao, una mia idea personale, io userei la lettura dell'orario solo per stabilire se riprodurre il suono o no.
Quindi dalle 7:30 alle 18 riproduco il suono, ma per produrre il suono ogni 10 minuti userei la funzione millis(), e se il programma deve fare solo questo metterei un delay(15000).

Esempio da adattare e da modificare, probabile che ci siano errori nel codice, non avendo la possibilità
di provarlo e correggere i bug...

#include <Wire.h>
#include "RTClib.h"
#define RELAY_PIN 2

RTC_DS1307 RTC;
unsigned long tempo=0;
unsigned long intervallo=0;
void setup() {
  
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();  
  pinMode(7, INPUT);
  pinMode(RELAY_PIN, OUTPUT);
 }

void loop() {
  
  DateTime now = RTC.now();
  int nowHourMinute = (now.hour() *60);
  int nowMinute=( now.minute()+ nowHourMinute);
  if(nowMinute>=(7*60+30 ) && nowMinute <=(18*60)){
  
      tempo=millis();
      
      if(tempo-intervallo>=(10*60*1000)){// 10 minuti in millisecondi
           intervallo=tempo;
           digitalWrite(RELAY_PIN, HIGH);
           delay (15000);
           digitalWrite(RELAY_PIN, LOW);
           
      }// end if()


   }// end if()
     

}// end loop()

Grazie Torn24 per il consiglio e l'idea... Oggi e domani sono troppo incasinato, ma domenica provo e ti faccio sapere se va bene.

Ancora grazie :slight_smile: :slight_smile:

Sapendo che gli uccelli non hanno l'orologio, ma "vanno" con la luce, e visto che i tempi non sono strettamente vincolati alla precisione puoi usare una fotoresistenza e millis() per compiere un ciclo giornaliero variabile con la luce ambientale; puoi tarare con un trimmer le soglie d'intervento ( ricordati l'isteresi).
Anch'io dovrei fare qualcosa del genere, cosa usi come verso?
Io penserei al falco...

Ciao Stilita, voglio usare i versi di alcuni falchi e di gufi...
I piccioni hanno tremendamente paura di questi versi.

La tua idea di usare una fotoresistenza per attivare il tutto in presenza di luce l'avevo già valutata ma siccome installerò l'arduino in una parte del sotto tetto praticamente al buio l'ho subito scartata. Per questo mi sono orientato ad un modulo RTC.

Ma comunque sono interessato lo stesso alla tua idea. Cosa intendi con

compiere un ciclo giornaliero variabile con la luce ambientale; puoi tarare con un trimmer le soglie d'intervento ( ricordati l'isteresi).

Grazie per la risposta.

Intendevo che il ciclo riparte ogni giorno attivato dalla fotoresistenza.

E' buona norma quando si fanno circuiti tipo un crepuscolare dargli una certa isteresi in modo che non
vi siano ripetuti scatti in base al variare repentino della luce ambientale, ma ho visto che non lo userai.
Io ho il problema che i merli scavano nei vasi alla ricerca dei vermi.
Sei sicuro che con il tempo non si abituino ai versi registrati dei rapaci?

Ciao Stilita, penso che non si abituino ai versi registrati ho letto tanto in merito, si abituano solo alla presenza di rapaci in plastica e quindi statici... E poi se si abituano posso cambiare i versi in altri tipi di versi...

Speriamo...

io farei cosi:

#include "Wire.h"
#include <HCRTC.h>
#include "RTClib.h"
#define I2CDS1307Add 0x68
#define RELAY_PIN 2
HCRTC HCRTC;
void setup()
{
  pinMode(RELAY_PIN, OUTPUT);
  Serial.begin(9600);
  Wire.begin();
  RTC_DS1307 RTC;
  HCRTC.RTCWrite(I2CDS1307Add, 13, 4, 24, 14, 21, 0, 3);
  analogReference(INTERNAL);
  RTC.adjust(DateTime(__DATE__, __TIME__)); //impostare data e ora del PC
  //HCRTC.RTCWrite(I2CDS1307Add, 17, 2, 27, 00, 0, 0, 1); //impostare una data predefinita, nell'esempio è 27 feb 2017 ore 00:00 numero weekend: 1

}

void loop()
{
  HCRTC.RTCRead(I2CDS1307Add);
  if ((HCRTC.GetHour() >= 7 && HCRTC.GetMinute() == 30) && (HCRTC.GetHour() <= 18 && HCRTC.GetMinute() == 0))
  {
    if (HCRTC.GetMinute() == 0 || HCRTC.GetMinute() == 10 || HCRTC.GetMinute() == 20 || HCRTC.GetMinute() == 30 || HCRTC.GetMinute() == 40 || HCRTC.GetMinute() == 50)
    {
      digitalWrite(RELAY_PIN, HIGH);
      delay(15000);
    }
  }
  else
  {
    digitalWrite(RELAY_PIN, LOW);
  }
}

Se non devi fare altro, va bene delay se no meglio usare millis..poi mi trovo molto bene con la libreria HCRTC dove QUI trovi le funzioni associate alla libreria...inoltre puoi scaricarla da QUI

@Gianky00, tu metti minuti==30 e minuti==0, vuol dire che se i minuti sono 10 o 20 o 40 o 50, il codice non viene eseguito, poi la condizione non può essere mai vera perché nell'if metti un and && minuti==30 && minuti==0, quindi deve essere contemporaneamente i minuti ==30 e i minuti ==0, non si verifica mai le condizioni e il codice non viene mai eseguito...

Nel codice che ho postato mi viene un dubbio, non avendo mai usato un modulo RTC, mi chiedo se non ci sia da impostare l'orario in qualche modo :slight_smile:

Ho trovato un thread che spiega come impostare l'ora da seriale, si carica un programma e si inserisce da seriale data e orario, ecco il link

http://forum.arduino.cc/index.php?topic=374965.0

torn24:
@Gianky00, tu metti minuti==30 e minuti==0, vuol dire che se i minuti sono 10 o 20 o 40 o 50, il codice non viene eseguito, poi la condizione non può essere mai vera perché nell'if metti un and && minuti==30 && minuti==0, quindi deve essere contemporaneamente i minuti ==30 e i minuti ==0, non si verifica mai le condizioni e il codice non viene mai eseguito...

nel mio sketch metto due semplici if concatenate. Dove la prima indica SE sono dalle 7:30 alle 18:00 allora entra nell'altra if...dove la condizione adesso è: SE sono i minuti 0, 10, 20, 30, 40 o 50 allora da alimentazione al pin del relè, se non rispetta l'if non da corrente.
Sketch aggiornato:

void loop()
{
  HCRTC.RTCRead(I2CDS1307Add);
  if ((HCRTC.GetHour() == 7 && HCRTC.GetMinute() >=30) || (HCRTC.GetHour() >=8 && HCRTC.GetHour() <=18))
  {
    if (HCRTC.GetMinute() == 0 || HCRTC.GetMinute() == 10 || HCRTC.GetMinute() == 20 || HCRTC.GetMinute() == 30 || HCRTC.GetMinute() == 40 || HCRTC.GetMinute() == 50)
    {
      digitalWrite(RELAY_PIN, HIGH);
      delay(15000);
    }
  }
  else
  {
    digitalWrite(RELAY_PIN, LOW);
  }
}

EDIT:
oppure si può fare cosi:

void loop()
{
  HCRTC.RTCRead(I2CDS1307Add);
  if (HCRTC.GetHour() >= 7  && HCRTC.GetHour() <= 18)
  {
    if (HCRTC.GetMinute() == 0 || HCRTC.GetMinute() == 10 || HCRTC.GetMinute() == 20 || HCRTC.GetMinute() == 30 || HCRTC.GetMinute() == 40 || HCRTC.GetMinute() == 50)
    {
      digitalWrite(RELAY_PIN, HIGH);
      delay(15000);
    }
  }
  else
  {
    digitalWrite(RELAY_PIN, LOW);
  }
}

cioè se sono dalle 7 alle 18 entra in un altra if e se sono i minuti 0, 10, 20, 30, 40 oppure 50 da alimentazione al relè...non so se è critico iniziare il programma mezz'ora prima (quindi farlo partire alle 7 di mattina) oppure mezz'ora dopo (alle 8 )...
per quel poco che so, ho dato una piccola mano :smiley:

P.S: lo sketch che ho postato ieri è sbagliato..questi sono giusti

Ciao Gianky00, il tuo ultimo sketch è molto semplice e di facile comprensione... Grazie a te e a tutti quelli che mi hanno risposto ai post.
Domani metterò mano al progetto e provo direttamente sul campo il suo funzionamento.
Ho un dubbio:
Io ho un modulo RTC Ds-1302, invece nel primo sketch che ho pubblicato ho copiato erroneamente questo:

 #include <Wire.h>
#include "RTClib.h"
#define RELAY_PIN 2

RTC_DS1307 RTC;

void setup() {

e si è ripetuto anche nelle vostre risposte giustamente...

Devo modificare solo la voce

RTC_DS1307 RTC;

in

RTC_DS1302 RTC;

o devo fare altre modifiche secondo voi?

Grazie anticipatamente...

Chiedo a tutti nel forum, cosa consigliate, per questo dissuasore, come lettore mp3 e come amplificatore?

Grazie.

Salve, io sto usando una MINI CASSA portatile (vedi allegato) opportunamente modificata e collegata ad un amplificatore con 2 uscite in cui collego due altoparlanti che metto nei due lati del tetto, in cui inserisco una chiavetta USB con i versi dei rapaci.

Per quanto riguarda la mia richiesta non ho ancora capito,

Devo modificare solo la voce
Quote
RTC_DS1307 RTC;
in
Quote
RTC_DS1302 RTC;
o devo fare altre modifiche secondo voi?

devo lasciare tutto come sta?

Lo ripeto perchè prima di provare vorrei essere sicuro di quello che faccio.

Scusate ancora e grazie.

$_57.jpg

Ciao, tu hai il tuo componente elettronico, devi cercare una libreria per arduino per utilizzarlo.
Una volta che hai trovato la libreria devi basarti su gli esempi forniti con la libreria, che possono essere molto diversi da un componente a un altro componente.

Quindi trova la libreria e guarda gli esempi, potrebbe cambiare di molto il modo per recuperare ora e minuti.

una libreria è questa

http://playground.arduino.cc/Main/DS1302RTC

Mi sa che BISOGNA CAMBIARE MOLTO o trovare un esempio per recuperare ora e minuti.

Funzionaaa!!!

Sono riuscito a risolvere con una libreria ds1302 e ho adattato lo sketch proposto da Gianky00 nell'esempio proposto dalla libreria trovata...

Lo sketch è questo:

// DS1302_Serial_Hard 
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// A quick demo of how to use my DS1302-library to 
// retrieve time- and date-date for you to manipulate.
//
// I assume you know how to connect the DS1302.
// DS1302:  CE pin    -> Arduino Digital 2
//          I/O pin   -> Arduino Digital 3
//          SCLK pin  -> Arduino Digital 4

#include <DS1302.h>

// Init the DS1302
DS1302 rtc(2, 3, 4);

// Init a Time-data structure
Time t;

void setup()
{
  // Set the clock to run-mode, and disable the write protection
  rtc.halt(false);
  rtc.writeProtect(false);

  
  // Setup Serial connection
  Serial.begin(9600);

  pinMode(13, OUTPUT);

  // The following lines can be commented out to use the values already stored in the DS1302
  //rtc.setDOW(WEDNESDAY);        // Set Day-of-Week to FRIDAY
  //rtc.setTime(23, 07, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(5, 4, 2017);   // Set the date to August 6th, 2010
}

void loop()
{
{
  // Get data from the DS1302
  t = rtc.getTime();

  if (t.hour >=7 && t.hour <= 18)
  {
    if (t.min == 0 && t.sec == 0 || t.min == 10 && t.sec == 0 || t.min == 20 && t.sec == 0 || t.min == 30 && t.sec == 0 || t.min == 40 && t.sec == 0 || t.min == 50 && t.sec == 0)
    {
      digitalWrite(13, HIGH);
      delay(5000);
      digitalWrite(13, LOW);
    }
  }
  else
    {
      digitalWrite(13, LOW);
    } 
  }
  
 {
  // Send date over serial connection
  Serial.print("Today is the ");
  Serial.print(t.date, DEC);
  Serial.print(". day of ");
  Serial.print(rtc.getMonthStr());
  Serial.print(" in the year ");
  Serial.print(t.year, DEC);
  Serial.println(".");
  
  // Send Day-of-Week and time
  Serial.print("It is the ");
  Serial.print(t.dow, DEC);
  Serial.print(". day of the week (counting monday as the 1th), and it has passed ");
  Serial.print(t.hour, DEC);
  Serial.print(" hour(s), ");
  Serial.print(t.min, DEC);
  Serial.print(" minute(s) and ");
  Serial.print(t.sec, DEC);
  Serial.println(" second(s) since midnight.");

  // Send a divider for readability
  Serial.println("  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -");
  
  // Wait one second before repeating :)
  delay (1000);
}
}

Il tutto funziona.

Grazie a tutti del forum.

Allora, l'hai collaudato?
Ci fai sapere se i volatili hanno paura o si sono già abituati?
Il mio l'ho sto finendo, a banco funziona
lo devo solo assemblare in tutte le sue parti.
Ho fatto così:
Fotoresistenza che attiva o disattiva il circuito, alba e tramonto
e quando attivato 3 minuti di silenzio e 10 secondi
di verso del falco; però questi tempi non so se
possono andare bene allo scopo, che ne pensate?
Ciao