Stap 6: programmeren
Zie de foto een, u kunt de werktijd, huidige tijd en de temperatuur van de trigger in de eerste paar regels definiëren.
Voor de RTC-module moet u voor het initialiseren van het aan het instellen van de huidige tijd. Raadpleeg de afbeelding 1, in de Setup, het uitvoeren van de setDateDs1307(); Huidige tijd instellen in de RTC-module; deze functie is moet slechts één keer, nadat u het instellen van de huidige tijd wordt uitgevoerd, moet u om die lijn te commentariëren en opnieuw uploaden van het programma aan uw arduino. De RTC tijd ziet u in het deelvenster monitor.
Hier is de code van dit project, kunt u het downloaden van de bijlage in de hieronder, of gewoon simpelweg de code in te gaan de hieronder aan uw Arduino IDE, en uploaden naar de crowduino.
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 / / de I2C adres van Tiny RTC
definiëren van de begintijd, bijvoorbeeld, ik wil controle start om 22:00:00
#define STA_HOUR 22
#define STA_MINUTE 00
#define STA_SECOND 0
define de eindtijd, niet meer wordt gecontroleerd om 6:30:00
#define END_HOUR 6
#define END_MINUTE 30
#define END_SECOND 0
definiëren van de huidige tijd, kunt u de huidige tijd hier
#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
definiëren van de trigger-temperatuur, alleen de temperatuur hoger dan 22, het Relais wordt geactiveerd in de tijd opgeven
#define TRIGGER_TEMPERATURE 22
Privacy ds(14); op pin 14 voor temperatuur
Boole-vlag; Naar recorde de staat van de temperatuursensor
byte seconde, minuut, uur, dayOfWeek, dayOfMonth, maand, jaar;
lange staTotalSecond, endTotalSecond, currentTotalSecond;
Normale decimale getallen omzetten in binary coded decimal
byte decToBcd(byte val)
{
retourneren ((val/10 * 16) + (val % 10));
}
Binary coded decimal converteren naar gewone decimale getallen
byte bcdToDec(byte val)
{
retourneren ((val/16 * 10) + (val % 16));
}
VOID Setup {}
Wire.begin();
Serial.begin(19200);
vlag = true;
staTotalSecond = long(STA_HOUR) * 3600 + long(STA_MINUTE) * 60 + lange (STA_SECOND); //to caculate de totale seconden
Serial.println(staTotalSecond);
endTotalSecond = long(END_HOUR) * 3600 + long(END_MINUTE) * 60 + lange (END_SECOND); //to caculate de totale seconden
Serial.println(endTotalSecond);
definiëren van de relais pinnen, het schild van de estafette hebben 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(); Huidige tijd instellen in de RTC-module,
Deze code is alleen nodig een runtime, na het instellen van de huidige tijd met succes, deze lijn pleidooien commentaar.
}
void loop
{
float temperatuur;
getDateDs1307 (); //get de tijdgegevens van tiny RTC
currentTotalSecond = long(hour) * 3600 + long(minute) * 60 + long(second);
Serial.println(currentTotalSecond);
Als (currentTotalSecond > endTotalSecond & & currentTotalSecond < staTotalSecond) / / om te beoordelen of de huidige tijd in de looptijd van de instelling
{
digitalWrite (5, laag); //relay uit
}
anders
{
temperatuur = getTemperature ("c"); //to krijgen de teperature
Als (vlag)
{
Serial.println(Temperature);
if(Temperature > TRIGGER_TEMPERATURE) //if temperatuur hoger dan het instellen van temperatuur, Relais op
{
digitalWrite (5, hoog), //relay op
}
anders
{
digitalWrite (5, laag); //relay uit
}
}
}
vertraging (60000); //detect de tijd en de temperatuur elke 60 seconden
}
Stel de tijd currnt, de tweede, minuut & uur omzetten in het juiste moment, functie
VOID setDateDs1307()
{
tweede = 00;
Minute = 51;
uur = 10;
dayOfWeek = 5;
dayOfMonth = 28;
maand = 2;
jaar = 13;
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(decToBcd(0));
Wire.write(decToBcd(Second)); 0 tot bits 7 begint de klok
Wire.write(decToBcd(Minute));
Wire.write(decToBcd(hour)); Als u wilt dat 12 uur am/pm moet u instellen
bit 6 (ook de noodzaak om te veranderen van readDateDs1307)
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(Year));
Wire.endTransmission();
}
Functie krijgt van de datum en tijd van de ds1307 en afgedrukt resultaat
VOID getDateDs1307()
{
Reset de aanwijzer register
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(decToBcd(0));
Wire.endTransmission();
Wire.requestFrom (DS1307_I2C_ADDRESS, 7);
tweede = bcdToDec(Wire.read() & 0x7f);
minuten = bcdToDec(Wire.read());
uur = bcdToDec(Wire.read() & 0x3f); Wilt wijzigen van deze instelling als 12 uur am/pm
dayOfWeek = bcdToDec(Wire.read());
dayOfMonth = bcdToDec(Wire.read());
maand = bcdToDec(Wire.read());
jaar = bcdToDec(Wire.read());
Serial.Print (uur, DEC);
Serial.Print(":");
Serial.Print (minuut, DEC);
Serial.Print(":");
Serial.Print (tweede, DEC);
Serial.Print("");
Serial.Print (maand, DEC);
Serial.Print("/");
Serial.Print (dayOfMonth, DEC);
Serial.Print("/");
Serial.Print(Year,DEC);
Serial.Print("");
Serial.println();
Serial.Print ("dag van de week:");
}
krijgen van de temperatuur, de paremeter is een char, als het gelijk is aan 'f', fahrenheit, anders terugkeer celsius terugkeren
float getTemperature(char unit)
{
byte i;
byte aanwezig = 0;
byte type_s = 0;
bytegegevens [12];
byte addr [8];
zweven celsius, fahrenheit;
Als (! ds.search(addr)) {}
Serial.println ("geen meer adressen.");
Serial.println();
DS.reset_search();
delay(250);
vlag = false;
keren 0;
}
anders
vlag = true;
Als (OneWire::crc8 (addr, 7)! = addr[7]) {}
Serial.println ("CRC is niet geldig!");
terug 2;
}
Serial.println();
de eerste ROM byte aangeeft welke chip
schakelaar (addr[0]) {}
Case 0x10:
type_s = 1;
breken;
Case 0x28:
type_s = 0;
breken;
Case 0x22:
type_s = 0;
breken;
standaard:
terug 3;
}
DS.reset();
DS.Select(addr);
DS.write(0x44,1); Start conversie, met kracht van de parasiet op eind
delay(1000); Misschien volstaat 750ms, misschien niet
wij hier een ds.depower() zou kunnen doen, maar het resetten zal verzorgen.
huidige = ds.reset();
DS.Select(addr);
DS.write(0xBE); Lees Kladblok
voor (ik = 0; ik < 9; i ++) {/ / moeten we 9 bytes
gegevens [i] = ds.read();
}
de gegevens converteren naar werkelijke temperatuur
unsigned int rauwe = (gegevens [1] << 8) | gegevens [0];
Als (type_s) {}
ruwe = rauwe << 3; 9 bits resolutie standaard
Als (gegevens [7] == 0x10) {}
Graaf blijven geeft volledige 12 bit resolutie
ruwe = (raw & 0xFFF0) + 12 - gegevens [6];
}
} else {}
byte cfg = (gegevens [4] & 0x60);
Als (cfg == 0x00) rauwe = rauwe << 3; 9 bit resolutie, 93.75 ms
anders als (cfg == 0x20) rauwe = rauwe << 2; 10 bit res, 187,5 ms
anders als (cfg == 0x40) rauwe = rauwe << 1; 11 bits res, 375 ms
Standaard is 12 bit resolutie, 750 ms conversietijd
}
Celsius = (zweven) rauwe / 16.0;
Fahrenheit = celsius * 1.8 + 32,0;
Als ('f' == eenheid)
retourneren fahrenheit;
anders
retourneren celsius;
}