Arduino: porta scorrevole automatica per pollaio ed altro

Moderatore: maxlinux2000

Rispondi
Avatar utente
calcola
Messaggi: 565
Iscritto il: 18 ott 2012, 9:51

Arduino: porta scorrevole automatica per pollaio ed altro

Messaggio da calcola » 14 feb 2014, 17:41

Repico sul forum con cui ho condiviso ilmio progetto sin dalle sue origini il software e lo schema dei collegamenti elettrici, spero che possa essere utile ad altri.

Di seguito il software di gestione.

PRECISO CHE IL SOFTWARE E LA SCHEDA INDICATA SONO STATI PRODOTTI PER DILETTO E STUDIO, OGNI USO S'INTENDE A PROPRIO RISCHIO E PERICOLO, COMPRESI I COLLEGAMENTI ELETTRICI CHE COMUNQUE ANDREBBERO ESEGUITI DA PERSONALE COMPETENTE

TUTTI I MATERIALI (CODICE, ELETTRONICA, E SCHEDA) SONO RILASCIATI SOTTO LICENZA CC BY-NC-SA 4.0 (CREATIVE COMMONS USO NON COMMERCIALE) http://creativecommons.org/licenses/by-nc-sa/4.0/deed.it

THIS PROJECT IS RELEASED ON CC BY-NC-SA 4.0 http://creativecommons.org/licenses/by-nc-sa/4.0/


Commento ed istruzioni:

Chiude la porta circa 15 minuti dopo che fa buio (le galline vanno a letto...presto) e la apre a giorno fatto, poichè l'ora dell'alba e del tramonto sono variabili nel corso dell'anno, ho inserito una tabella di valori che sposta in automatico l'apertura e la chiusura in base al mese. La configurazione iniziale delle variabili permette d'impostare le temperature e l'orario base d'apertura e di chiusura, poi il programma adatta in automatico l'orario ai mesi dell'anno. Il tutto è configurato per l'alba ed il tramonto del nord-ovest d'Italia, per personalizzare in base al luogo dove è ubicato il pollaio o la porta, occorre anticipare l'ora di apertura di 15 minuti per il meridiano di Roma, ancora di 15 minuti per il meridiano di Taranto. Non penso sia necessario modificare l'orario di apertura.
Il software è intuitivo le eventuali modifiche sono facili da fare, al limite si ricarica il programma originale.
Le sonde termiche sono individuate con un numero, i valori riportati sono quelli delle mie sonde e devono essere corretti con i valori delle sonde realmente usate. Dopo aver caricato il programma se le sonde sono compatibili con il software, il sistema le rileva e nel listato in scorrimento nel monitor seriale dell'IDE appariranno delle righe in cui si legge la temperatura ed un numero. Sostituire il numero identificativo delle vostre sonde (variabile da 1 a 255) nel software, salvare e ricaricare il software, attenti a non confondere la sonda termica della scheda con quella ambiente. In tutto occorrono due sonde termiche, la prima è inserita nei tre fori presenti nel pcb dell'RTC ed orientata in base alla serigrafia presente dal lato batteria. Comunque se è montata male per serigrafia errata la sonda riscalda, quindi è necessario staccarla e risaldarla ruotata di 180°C, però gli ultimi RTC in vendita sono ormai corretti e non dovrebbero esserci problemi. Saldare sui piedini della sonda termica un cavo a tre fili e saldare all'altra estremità la seconda sonda, rispettare il collegamento come per la prima, volendo in parallelo alla prima ed alla seconda si possono mettere altre sonde, in teoria 255, in realtà non più di 4-5 sonde.


Codice: Seleziona tutto

//---------------
//INIZIO LISTATO


//Aggiungo la libreria onewire va scaricata da http://www.pjrc.com/teensy/td_libs_OneWire.html
//
//ideato e realizzato da: antrec@geocities.com
//CC BY-NC-SA 4.0
//
//Versione che usa la stessa scheda del solare
//pin ancora liberi A2-A3-A6-A7;D9
#include "OneWire.h"
#include "Wire.h"
#include "RTClib.h"

RTC_DS1307 RTC;
#define RELAY 4 //acqua
#define RELAY1 5 //riscaldamento zona
#define VENTOLA 6 //raffreddamento arduino
OneWire  ds(3);

//////////////////////////////////////////////////////////////////////////////////////

// INIZIO DATI SETTABILI

//Porta

int ora_apertura = 8;
int ora_chiusura = 17;
int minuti_chiusura = 45;


//Temperatura acqua

int minima_acqua = 3;
int massima_acqua = 6;

//Lampada
int temp_accensione = -5;
int ora_spegnimento = 8;
int ora_accensione = 18;

//ventola

int temp_ventola_on = 45;
int temp_ventola_off = 35;
/////////////////////////////////////////////////////////////////////////////////

int calcolo_minuti_chiusura= (ora_chiusura*60)+(minuti_chiusura);
int calcolo_minuti_apertura= (ora_apertura*60);
int calcolo_minuti_chiusura2;
int calcolo_minuti_apertura2;

// SENSORI fine corsa comando motore

const int sensore_chiusura = 15;     
const int RELAY_chiusura =  7;     
                             
int stato_sensore_chiusura = 1;   

const int sensore_apertura = 2;   
const int RELAY_apertura =  8;   
                           
int stato_sensore_apertura = 1; 
//Variabile per memorizzare l'indirizzo della ram del DS1307
byte IndRam = 0x00;
//array per la data (unixtime)
byte Data[6];


int giorno;
byte mese;
int anno;
int ore;
int minuti;
int secondi;
float temp_scheda = -200;
float temp_ambiente = -200;



void setup()
{
  //Apro la comunicazion seriale
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  pinMode(RELAY, OUTPUT);
  pinMode(RELAY1, OUTPUT);
  pinMode(VENTOLA, OUTPUT);
  pinMode(RELAY_chiusura, OUTPUT);     
  pinMode(sensore_chiusura, INPUT);
  pinMode(RELAY_apertura, OUTPUT);     
  pinMode(sensore_apertura, INPUT);
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
 
}

void loop()

{DateTime now = RTC.now();
  ora_attuale();
  temperatura();
  acqua();
  zona();
  apertura_chiusura();
  ventola();
 
}


//VOID

void temperatura()
{
  byte i;
  byte present = 0;
  byte numero = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;

  if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }
  if (OneWire::crc8(addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return;
  }
  switch (addr[0]) {
  case 0x10:
    type_s = 1;
    break;
  case 0x28:
    type_s = 0;
    break;
  case 0x22:
    type_s = 0;
    break;
  default:
    return;
  }
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         
  delay(1000);     

  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);       

  for ( i = 0; i < 9; i++) {       
    data[i] = ds.read();
  }

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3;
    if (data[7] == 0x10) {
     
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  }
  else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3; 
    else if (cfg == 0x20) raw = raw << 2;
    else if (cfg == 0x40) raw = raw << 1;
   
  }
  celsius = (float)raw / 16.0;
  Serial.print("Codice sonda =");
  Serial.write(' ');
  Serial.print(addr [1], DEC);
  Serial.write(' ');
  Serial.print("Nome sonda =");
  Serial.write(' ');
  numero = addr [1], DEC;

  if (numero == 119) //sostituire il numero con quello che appare sul monitor seriale
  {
    Serial.print("Scheda");
    Serial.write(' ');
    temp_scheda = celsius;
  }
 
  if (numero == 208) //sostituire il numero con quello che appare sul monitor seriale
  {
    Serial.print("Pollaio");
    Serial.write(' ');
    temp_ambiente = celsius;
  }

 

  Serial.print("Temperatura = ");
  Serial.print(celsius);
  Serial.print(" C");
  Serial.println();
  Serial.println();
}



void acqua(){
if (temp_ambiente < minima_acqua ){
  digitalWrite(RELAY, HIGH);}
  else if (temp_ambiente > massima_acqua){
  digitalWrite(RELAY, LOW);
 
}}
void zona()
{
  if ((temp_ambiente<temp_accensione) && ((ore<ora_spegnimento) || (ore>=ora_accensione))){
  digitalWrite(RELAY1, HIGH);}
  else {
  digitalWrite(RELAY1, LOW);
}
}

void apertura_chiusura(){
 
  switch (mese){
 
    case 1: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+30));(calcolo_minuti_apertura2 = calcolo_minuti_apertura); break; //18,15 -- 8,00
    case 2: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+60)); (calcolo_minuti_apertura2 = calcolo_minuti_apertura-60);break; //18,45 -- 7,00
    case 3: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+95));(calcolo_minuti_apertura2 = (calcolo_minuti_apertura-60)); break;// 19,20 -- 7,00
    case 4: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+140));(calcolo_minuti_apertura2 = (calcolo_minuti_apertura-120)); break; //20,05 -- 6,00
    case 5: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+180)); (calcolo_minuti_apertura2 = (calcolo_minuti_apertura - 180));break; //20,45 -- 5,00
    case 6: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+180)); (calcolo_minuti_apertura2 = (calcolo_minuti_apertura - 180)); break;//20,45 -- 5,00
    case 7: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+165));(calcolo_minuti_apertura2 = (calcolo_minuti_apertura - 180)); break; //20,30 -- 5,00
    case 8: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+110));(calcolo_minuti_apertura2 = (calcolo_minuti_apertura - 180));break; //19,35 -- 5,00
    case 9: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+55)); (calcolo_minuti_apertura2 = (calcolo_minuti_apertura-120));break; // 18,40 -- 6,00
    case 10: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura+15));(calcolo_minuti_apertura2 = (calcolo_minuti_apertura-60)); break;// 18,00 -- 7,00
    case 11: (calcolo_minuti_chiusura2 = calcolo_minuti_chiusura); (calcolo_minuti_apertura2 = calcolo_minuti_apertura);break;// 17,45 -- 8,00
    case 12: (calcolo_minuti_chiusura2 = calcolo_minuti_chiusura);(calcolo_minuti_apertura2 = calcolo_minuti_apertura); break;// 17,45 -- 8,00
    default: (calcolo_minuti_chiusura2 = (calcolo_minuti_chiusura + 180)); (calcolo_minuti_apertura2 = (calcolo_minuti_apertura - 180)); //20,45 -- 5,00
  }
   
   
  int ore_minuti = (ore*60)+(minuti);
   Serial.println("Pollaio2_5_bis calcoli con ora solare");
  Serial.println();
  //Serial.print("mese: ");
 // Serial.println(mese);
  Serial.print("Minuto attuale: ");
  Serial.println(ore_minuti);
  Serial.print("Apertura al minuto: ");
  Serial.println(calcolo_minuti_apertura2);
  Serial.print("Chiusura al minuto: ");
  Serial.println(calcolo_minuti_chiusura2);
   
  stato_sensore_chiusura = digitalRead(sensore_chiusura);
  stato_sensore_apertura = digitalRead(sensore_apertura);
 
  if ((ore_minuti<calcolo_minuti_apertura2) || (ore_minuti>=calcolo_minuti_chiusura2)){
    if ((stato_sensore_chiusura) == LOW)
    {digitalWrite(RELAY_chiusura, HIGH);
   // delay(00);
    digitalWrite(RELAY_apertura, HIGH);}
     else{
      digitalWrite(RELAY_chiusura, LOW);
       delay(200);
       digitalWrite(RELAY_apertura, HIGH);}
       }
else{
   if ((stato_sensore_apertura)== LOW)
   {digitalWrite(RELAY_apertura, HIGH);
  // delay (00);
   digitalWrite(RELAY_chiusura, HIGH);}
   else
   {digitalWrite(RELAY_apertura, LOW);
   delay(200);
   digitalWrite(RELAY_chiusura, HIGH);}}
    }

void ventola() {
   {if (temp_scheda > temp_ventola_on )
  digitalWrite(VENTOLA, HIGH);}
  {if (temp_scheda < temp_ventola_off)
 digitalWrite(VENTOLA, LOW);}
}
 
void ora_attuale()
{
  DateTime now = RTC.now();
  Serial.print("Ora letta dall'RTC :");
  Serial.write(' ');
  Serial.print(now.day(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.year(), DEC);
  Serial.print(' ');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.println(now.second(), DEC);
  Serial.println();
  Serial.println();
  Serial.println();
  Serial.println();
  Serial.println("-------------------------------------");
  ore = (now.hour());
  minuti = (now.minute());
  mese = (now.month());
}

// FINE LISTATO
//----------------


[img]http://faidateoffgrid.altervista.org/forum/download/file.php?id=2752[/img]

Immagine

[img]http://faidateoffgrid.altervista.org/forum/download/file.php?id=1944[/img]

[img]http://faidateoffgrid.altervista.org/forum/download/file.php?id=1943[/img]

[img]http://faidateoffgrid.altervista.org/forum/download/file.php?id=2137[/img]
---------------

Rispondi

Torna a “Open HardWare”

Chi c’è in linea

Visitano il forum: Nessuno e 42 ospiti