Étape 6: programmation
Voir l’image un, vous pouvez définir le temps de travail, l’heure actuelle et la température de déclenchement dans les premières lignes de plusieurs.
Pour le module RTC, vous devez initialiser à réglage de l’heure actuelle. S’il vous plaît voir la photo 1, dans le setup(), exécutez le setDateDs1307() ; A l’heure actuelle le module RTC ; Cette fonction est seulement besoin d’exécuter une fois, après avoir réglé l’heure actuelle, vous devrez commenter cette ligne et re-télécharger le programme à votre arduino. Vous pouvez voir le temps RTC dans la fenêtre Moniteur.
Voici le code de ce projet, vous pouvez télécharger la pièce jointe dans le ci-dessous, ou tout simplement composer simplement le code dans le dessous à votre IDE Arduino et vers la crowduino.
#include « Wire.h »
#define DS1307_I2C_ADDRESS 0x68 / / l’adresse I2C du CCF minuscule
définir l’heure de début, par exemple, je veux suivi démarrer à 22:00
#define STA_HOUR 22
#define STA_MINUTE 00
#define STA_SECOND 0
définir l’heure de fin, cesser de surveiller à 06:30
#define END_HOUR 6
#define END_MINUTE 30
#define END_SECOND 0
définir l’heure actuelle, vous pouvez configurer l’heure ici
#define CURRENT_SECOND 0
#define CURRENT_MINUTE 0
#define CURRENT_HOUR 12
#define CURRENT_DAYOFWEEK 3
#define CURRENT_DAYOFMONTH 16
#define CURRENT_MONTH 3
#define CURRENT_YEAR 2013
définir la température de déclenchement, seulement la température supérieure à 22, le relais se déclenche dans le temps de spécifier
#define TRIGGER_TEMPERATURE 22
OneWire ds(14) ; sur la broche 14 pour température
indicateur booléen ; Pour recorde l’état de la sonde de température
octet seconde, minute, heure, dayOfWeek, dayOfMonth, mois, année ;
long staTotalSecond, endTotalSecond, currentTotalSecond ;
Convertir des nombres décimaux normales en décimale codée en binaire
decToBcd(byte val) octets
{
Return ((val/10 * 16) + (10 % de val)) ;
}
Convertir de décimale codée en binaire en nombres décimaux normal
bcdToDec(byte val) octets
{
Return ((val/16 * 10) + (val % 16)) ;
}
void setup() {}
Wire.Begin() ;
Serial.Begin(19200) ;
drapeau = true ;
staTotalSecond = long(STA_HOUR) * 3600 + long(STA_MINUTE) * 60 + long (STA_SECOND); //to caculate le total des secondes
Serial.println(staTotalSecond) ;
endTotalSecond = long(END_HOUR) * 3600 + long(END_MINUTE) * 60 + long (END_SECOND); //to caculate le total des secondes
Serial.println(endTotalSecond) ;
définir les axes de relais, le bouclier de relais ont des 4 relais
pinMode(4,OUTPUT) ;
pinMode(5,OUTPUT) ;
pinMode(6,OUTPUT) ;
pinMode(7,OUTPUT) ;
digitalWrite(4,LOW) ;
digitalWrite(5,LOW) ;
digitalWrite(6,LOW) ;
digitalWrite(7,LOW) ;
setDateDs1307() ; A l’heure actuelle le module RTC,
Ce code est uniquement besoin d’exécuter une fois, après avoir réglé le courant du temps avec succès, plaids commentaire cette ligne.
}
void loop()
{
température du flotteur ;
getDateDs1307 (); //get les données de temps de minuscule RTC
currentTotalSecond = long(hour) * 3600 + long(minute) * 60 + long(second) ;
Serial.println(currentTotalSecond) ;
Si (currentTotalSecond > endTotalSecond & & currentTotalSecond < staTotalSecond) / / pour juger si l’heure actuelle dans l’expression de paramètre
{
digitalWrite (5, LOW); //relay off
}
d’autre
{
température = getTemperature ("c"); //to obtenir la température
Si (drapeau)
{
Serial.println(temperature) ;
if(temperature > TRIGGER_TEMPERATURE) //if température supérieure à réglage de température, relais sur
{
digitalWrite (5, HIGH); //relay sur
}
d’autre
{
digitalWrite (5, LOW); //relay off
}
}
}
retard (60000); //detect l’heure et la température de chaque 60 secondes
}
Fonction pour régler l’heure currnt, modifiez la seconde & la minute et l’heure au bon moment
Sub setDateDs1307()
{
deuxième = 00 ;
minute = 51 ;
heure = 10 ;
dayOfWeek = 5 ;
dayOfMonth = 28 ;
mois = 2 ;
année = 13 ;
Wire.beginTransmission(DS1307_I2C_ADDRESS) ;
Wire.Write(decToBcd(0)) ;
Wire.Write(decToBcd(second)) ; 0 à bit 7 commence l’horloge
Wire.Write(decToBcd(minute)) ;
Wire.Write(decToBcd(Hour)) ; Si vous voulez 12 heures am/pm, vous devez définir
bit 6 (également la nécessité de changer de readDateDs1307)
Wire.Write(decToBcd(DayOfWeek)) ;
Wire.Write(decToBcd(DayOfMonth)) ;
Wire.Write(decToBcd(month)) ;
Wire.Write(decToBcd(Year)) ;
Wire.endTransmission() ;
}
Fonction pour obtient la date et l’heure de la ds1307 et imprime le résultat
Sub getDateDs1307()
{
Réinitialiser le registre de pointeur
Wire.beginTransmission(DS1307_I2C_ADDRESS) ;
Wire.Write(decToBcd(0)) ;
Wire.endTransmission() ;
Wire.requestFrom (DS1307_I2C_ADDRESS, 7) ;
seconde = bcdToDec(Wire.read() & 0x7f) ;
minute = bcdToDec(Wire.read()) ;
heure = bcdToDec(Wire.read() & 0x3f) ; Besoin de changer cette option si 12 heures am/pm
dayOfWeek = bcdToDec(Wire.read()) ;
dayOfMonth = bcdToDec(Wire.read()) ;
mois = bcdToDec(Wire.read()) ;
an = bcdToDec(Wire.read()) ;
Serial.Print (heure, DEC) ;
Serial.Print(":") ;
Serial.Print (minute, DEC) ;
Serial.Print(":") ;
Serial.Print (second, DEC) ;
Serial.Print("") ;
Serial.Print (mois, DEC) ;
Serial.Print("/") ;
Serial.Print (dayOfMonth, DEC) ;
Serial.Print("/") ;
Serial.Print(Year,DEC) ;
Serial.Print("") ;
Serial.println() ;
Serial.Print ("jour de la semaine:") ;
}
obtenir la température, le paramètre est un char, si elle est égale à « f », retournez celsius fahrenheit, sinon retour
flotteur getTemperature(char unit)
{
octet i ;
octet présent = 0 ;
type_s octets = 0 ;
octet de données [12] ;
addr octet [8] ;
flotteur de celsius, fahrenheit ;
Si (! ds.search(addr)) {}
Serial.println ("No more addresses.") ;
Serial.println() ;
DS.reset_search() ;
Delay(250) ;
drapeau = false ;
return 0 ;
}
d’autre
drapeau = true ;
Si (OneWire::crc8 (addr, 7)! = {addr[7])}
Serial.println (« le CRC est non valide!") ;
retour 2 ;
}
Serial.println() ;
le premier octet ROM indique quel puce
commutateur (addr[0]) {}
cas 0 x 10 :
type_s = 1 ;
rupture ;
cas 0 x 28 :
type_s = 0 ;
rupture ;
cas 0 x 22 :
type_s = 0 ;
rupture ;
par défaut :
retour 3 ;
}
DS.Reset() ;
DS.Select(addr) ;
DS.Write(0x44,1) ; lancer la conversion, avec puissance parasite sur à la fin
Delay(1000) ; 750ms est peut-être assez, peut-être pas
Nous pourrions faire un ds.depower() ici, mais la réinitialisation prendra soin de lui.
présent = ds.reset() ;
DS.Select(addr) ;
DS.Write(0xBE) ; Bloc-notes de lecture
pour (i = 0; j’ai < 9; i ++) {/ / nous avons besoin de 9 octets
données [i] = ds.read() ;
}
convertir les données à la température actuelle
raw unsigned int = (données [1] << 8) | Data [0] ;
Si {(type_s)
brut = raw << 3 ; défaut de 9 bit résolution
Si (données [7] == 0 x 10) {}
comte restent donne plein 12 bit résolution
brut = (brut & 0xFFF0) + 12 - données [6] ;
}
} else {}
cfg octet = (données [4] & 0 x 60) ;
Si (cfg == 0 x 00) brut = raw << 3 ; 9 bit résolution, 93,75 ms
ElseIf (cfg == 0 x 20) brut = raw << 2 ; 10 bit res, 187,5 ms
ElseIf (cfg == 0 x 40) brut = raw << 1 ; 11 bit res, 375 ms
valeur par défaut est 12 bits de résolution, temps de conversion 750 ms
}
Celsius = (float) brut / 16,0 ;
Fahrenheit = celsius * 1,8 + 32.0 ;
Si (« f » == unité)
retour fahrenheit ;
d’autre
retour celsius ;
}