Remake Mosquito Killer(Arduino) (6 / 7 steg)
Steg 6: programmering
Se bild en, kan du definiera arbetstiden, aktuell tid och avtryckaren temperatur i de första flera linjerna.
För RTC modulen måste du initiera den till inställning av dess nuvarande tid. Vänligen se bild 1, i setup(), kör setDateDs1307(); Ange aktuell tid till RTC modul; denna funktion är bara behöver köra en gång, efter du ställa in aktuell tid, måste du kommentera denna linje och lägga upp programmet till din arduino. Du kan se RTC tiden i Övervakningsfönstret.
Här är koden för detta projekt, du kan ladda ner bilagan i nedan, eller bara helt enkelt klara koden i den nedan till din Arduino IDE, och belasta upp till crowduino.
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 / / I2C adress lilla RTC
Ange starttid, till exempel jag vill övervakning start kl 22:00:00
#define STA_HOUR 22
#define STA_MINUTE 00
#define STA_SECOND 0
definiera sluttiden, sluta övervaka på 6:30:00
#define END_HOUR 6
#define END_MINUTE 30
#define END_SECOND 0
definiera den aktuella tiden, kan du konfigurera den aktuella tiden här
#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
definiera utlösaren temperaturen, bara temperaturen högre än 22, reläet kommer att utlösa i ange tid
#define TRIGGER_TEMPERATURE 22
OneWire ds(14); på stift 14 för temperatur
boolesk flagga; Till recorde statligt av temperaturgivare
byte sekund, minut, timme, dayOfWeek, dayOfMonth, månad, år.
lång staTotalSecond, endTotalSecond, currentTotalSecond;
Konvertera normala decimaltal till binary coded decimal
byte decToBcd(byte val)
{
tillbaka ((val/10 * 16) + (val % 10));
}
Konvertera binary coded decimal till normala decimaltal
byte bcdToDec(byte val)
{
tillbaka ((val/16 * 10) + (val % 16));
}
void setup() {
Wire.BEGIN();
Serial.BEGIN(19200);
flagga = sant;
staTotalSecond = long(STA_HOUR) * 3600 + long(STA_MINUTE) * 60 + lång (STA_SECOND); //to caculate de totala sekunderna
Serial.println(staTotalSecond);
endTotalSecond = long(END_HOUR) * 3600 + long(END_MINUTE) * 60 + lång (END_SECOND); //to caculate de totala sekunderna
Serial.println(endTotalSecond);
definiera relä stift, relä sköld har 4 reläer
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(); Ange aktuell tid till modulen RTC
denna kod är bara behöver köra en gång, när du har nuvarande tid framgångsrikt, grunder kommentar denna linje.
}
void loop()
{
float temperatur;
getDateDs1307 (); //get tidsdata från tiny RTC
currentTotalSecond = long(hour) * 3600 + long(minute) * 60 + long(second);
Serial.println(currentTotalSecond);
om (currentTotalSecond > endTotalSecond & & currentTotalSecond < staTotalSecond) / / för att bedöma huruvida den aktuella tiden på sikt för inställning
{
digitalWrite (5, låg), //relay av
}
annat
{
temperatur = getTemperature ('c'); //to få temperatur
om (flagga)
{
Serial.println(temperature);
IF(temperature > TRIGGER_TEMPERATURE) //if temperatur högre än ställa in temperaturen, relä på
{
digitalWrite (5, hög), //relay på
}
annat
{
digitalWrite (5, låg), //relay av
}
}
}
fördröjning (60000); //detect tiden och temperaturen varje 60 sekunder
}
Funktion för att ställa in tiden i currnt, ändra andra & minut och timme till rätt tid
void setDateDs1307()
{
för det andra = 00.
minut = 51.
timme = 10;
dayOfWeek = 5;
dayOfMonth = 28;
månad = 2;
år = 13.
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(decToBcd(0));
Wire.write(decToBcd(Second)); 0 till stycke 7 börjar klockan
Wire.write(decToBcd(Minute));
Wire.write(decToBcd(Hour)); Om du vill ha 12 timmars am/pm måste du ange
bit 6 (också behovet av att ändra readDateDs1307)
Wire.write(decToBcd(DAYOFWEEK));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(Year));
Wire.endTransmission();
}
Funktion för att får datum och tid från ds1307 och skriver ut resultatet
void getDateDs1307()
{
Återställ registret pekaren
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(decToBcd(0));
Wire.endTransmission();
Wire.requestFrom (DS1307_I2C_ADDRESS, 7);
för det andra = bcdToDec(Wire.read() & 0x7f);
minut = bcdToDec(Wire.read());
timme = bcdToDec(Wire.read() & 0x3f); Behöver ändra detta om 12 timmars am/pm
dayOfWeek = bcdToDec(Wire.read());
dayOfMonth = bcdToDec(Wire.read());
månad = bcdToDec(Wire.read());
år = bcdToDec(Wire.read());
Serial.Print (timme, DEC).
Serial.Print(":");
Serial.Print (minut, DEC).
Serial.Print(":");
Serial.Print (andra, DEC);
Serial.Print("");
Serial.Print (månad, DEC).
Serial.Print("/");
Serial.Print (dayOfMonth, DEC);
Serial.Print("/");
Serial.Print(Year,dec);
Serial.Print("");
Serial.println();
Serial.Print ("dag i veckan:");
}
få temperaturen, paremeter är en röding, om det lika med "f", återvänder fahrenheit, annars avkastning celsius
float getTemperature(char unit)
{
byte i.
byte närvarande = 0;
byte type_s = 0;
byte data [12].
byte addr [8].
flyta celsius, fahrenheit;
om (! ds.search(addr)) {
Serial.println ("inga fler adresser.");
Serial.println();
DS.reset_search();
Delay(250);
flagga = false;
Return 0;
}
annat
flagga = sant;
om (OneWire::crc8 (addr, 7)! = addr[7]) {
Serial.println ("CRC är inte giltig!");
returnera 2.
}
Serial.println();
den första ROM byten indikerar vilket chip
Switch (addr[0]) {
fall 0x10:
type_s = 1;
bryta;
fall 0x28:
type_s = 0;
bryta;
fall 0x22:
type_s = 0;
bryta;
standard:
returnera 3.
}
DS.Reset();
DS.Select(addr);
DS.write(0x44,1); Starta konvertering, med parasit driver på i slutet
Delay(1000); kanske är 750ms nog, kanske inte
Vi skulle göra en ds.depower() här, men Återställ tar hand om den.
Nuvarande = ds.reset();
DS.Select(addr);
DS.write(0xBE); Läs Scratchpad
för (jag = 0; jag < 9; i ++) {/ / vi behöver 9 byte
data [i] = ds.read();
}
konvertera data till faktisk temperatur
unsigned int rå = (data [1] << 8) | data [0];
om (type_s) {
rå = rå << 3. 9 bit upplösning standard
om (data [7] == 0x10) {
greve förbli ger full 12 bitars upplösning
rå = (rå & 0xFFF0) + 12 - data [6].
}
} annat {
byte cfg = (data [4] & 0x60);
om (cfg == 0x00) rå = rå << 3. 9 bit upplösning, 93.75 ms
annars om (cfg == 0x20) rå = rå << 2. 10 bitars res, 187.5 ms
annars om (cfg == 0x40) rå = rå << 1. 11 bitars res, 375 ms
standard är 12 bitars upplösning, 750 ms omvandlingstid
}
Celsius = (float) raw / 16,0;
Fahrenheit = celsius * 1,8 + 32,0;
om ("f" == enhet)
returnera fahrenheit;
annat
returnera celsius;
}