Paso 6: programación
Ver el cuadro uno, se pueden definir el tiempo de trabajo, tiempo actual y la temperatura de disparo en las varias líneas de primera.
Para el módulo RTC, es necesario inicializar a su tiempo actual. Por favor ver el cuadro 1, en el setup(), ejecutar el setDateDs1307(); Establece la hora actual en el módulo RTC; Esta función es necesario sólo una vez, después de que usted ajuste la hora actual, tiene que comentar esa línea y volver a subir el programa a tu arduino. Puedes ver el tiempo RTC en la ventana de monitor.
Aquí está el código de este proyecto, usted puede descargar el archivo adjunto en el siguiente, o sólo simplemente enfrentar el código de la abajo a tu IDE de Arduino y subir a la crowduino.
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 / / la dirección I2C del minúsculo RTC
definir la hora de salida, por ejemplo, quiero monitoreo Inicio 22:00
#define STA_HOUR 22
#define STA_MINUTE 00
#define STA_SECOND 0
definir el tiempo del final, dejar de monitorear en el 6:30
#define END_HOUR 6
#define END_MINUTE 30
#define END_SECOND 0
definir el momento actual, puede configurar la hora actual en aquí
#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
definir el disparador, sólo la temperatura superior a 22, el relé se activará en el momento de especificar
#define TRIGGER_TEMPERATURE 22
OneWire ds(14); en el pin 14 de temperatura
Boolean bandera; A recorde el estado del sensor de temperatura
bytes segundo, minuto, hora, DíaDeLaSemana, dayOfMonth, mes, año;
staTotalSecond largo, endTotalSecond, currentTotalSecond;
Convierte a números decimales normales a binario codificado decimal
decToBcd(byte val) bytes
{
regresar ((val/10 * 16) + (val % 10));
}
Convertir a binario codificado decimal a números decimales normales
bcdToDec(byte val) bytes
{
regresar ((val/16 * 10) + (val % 16));
}
void setup() {}
Wire.Begin();
Serial.Begin(19200);
Bandera = true;
staTotalSecond = long(STA_HOUR) * 3600 + long(STA_MINUTE) * 60 + largo (STA_SECOND); //to caculate el total segundos
Serial.println(staTotalSecond);
endTotalSecond = long(END_HOUR) * 3600 + long(END_MINUTE) * 60 + largo (END_SECOND); //to caculate el total segundos
Serial.println(endTotalSecond);
definir los pines del relé, el escudo de relé tiene 4 relés
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(); Establece la hora actual en el módulo RTC,
Este código sólo es necesario ejecutar una vez, después de ajustar la corriente de tiempo, las súplicas comentario esta línea.
}
void loop()
{
Float temperatura;
getDateDs1307 (); //get los datos de tiempo de pequeño RTC
currentTotalSecond = long(hour) * 3600 + long(minute) * 60 + long(second);
Serial.println(currentTotalSecond);
Si (currentTotalSecond > endTotalSecond & & currentTotalSecond < staTotalSecond) / / para juzgar si la hora actual en el término de ajuste
{
digitalWrite (5, bajo), //relay de
}
otra cosa
{
temperatura = getTemperature ('c'); //to Haz el teperature
Si (bandera)
{
Serial.println(Temperature);
if(Temperature > TRIGGER_TEMPERATURE) //if temperatura superior de ajuste de temperatura, relé de
{
digitalWrite (5, HIGH); //relay en
}
otra cosa
{
digitalWrite (5, bajo), //relay de
}
}
}
retardo (60000); //detect el tiempo y la temperatura cada 60 segundos
}
Función para programar la hora de currnt, cambio el segundo, minuto y hora para el momento
void setDateDs1307()
{
en segundo lugar = 00;
minutos = 51;
hora = 10;
dayOfWeek = 5;
dayOfMonth = 28;
mes = 2;
año = 13;
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.Write(decToBcd(0));
Wire.Write(decToBcd(Second)); 0 a bit 7 empieza el reloj
Wire.Write(decToBcd(minute));
Wire.Write(decToBcd(hour)); Si quieres 12 horas am/pm es necesario establecer
bit 6 (también necesita cambiar readDateDs1307)
Wire.Write(decToBcd(dayOfWeek));
Wire.Write(decToBcd(dayOfMonth));
Wire.Write(decToBcd(month));
Wire.Write(decToBcd(Year));
Wire.endTransmission();
}
Función obtiene la fecha y hora del ds1307 e imprime el resultado
void getDateDs1307()
{
Restablece el puntero de registro
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.Write(decToBcd(0));
Wire.endTransmission();
Wire.requestFrom (DS1307_I2C_ADDRESS, 7);
= segundo bcdToDec(Wire.read() & 0x7f);
minutos = bcdToDec(Wire.read());
hora = bcdToDec(Wire.read() & 0x3f); Necesidad de cambiar este si 12 horas am/pm
dayOfWeek = bcdToDec(Wire.read());
dayOfMonth = bcdToDec(Wire.read());
mes = bcdToDec(Wire.read());
año = bcdToDec(Wire.read());
Serial.Print (hora, DEC);
Serial.Print(":");
Serial.Print (minuto, DEC);
Serial.Print(":");
Serial.Print (en segundo lugar, DEC);
Serial.Print("");
Serial.Print (mes, DEC);
Serial.Print("/");
Serial.Print (dayOfMonth, DEC);
Serial.Print("/");
Serial.Print(Year,DEC);
Serial.Print("");
Serial.println();
Serial.Print ("día de la semana:");
}
la temperatura, la paremeter es un char, si es igual a 'f', vuelve celsius fahrenheit, otra vuelta
flotador getTemperature(char unit)
{
byte me;
presente byte = 0;
byte type_s = 0;
datos del octeto [12];
addr Byte [8];
flotador de celsius, fahrenheit;
Si (! {ds.search(addr))}
Serial.println ("no hay más direcciones.");
Serial.println();
DS.reset_search();
Delay(250);
Bandera = false;
return 0;
}
otra cosa
Bandera = true;
Si (OneWire::crc8 (addr, 7)! = {addr[7])}
Serial.println ("CRC no es válido!");
retorno 2;
}
Serial.println();
el primer byte ROM indica que chip
interruptor (addr[0]) {}
caso 0 x 10:
type_s = 1;
rotura;
caso 0x28:
type_s = 0;
rotura;
caso 0x22:
type_s = 0;
rotura;
por defecto:
retorno 3;
}
DS.Reset();
DS.Select(ADDR);
DS.Write(0X44,1); iniciar la conversión, con la energía del parásito en el final
Delay(1000); tal vez 750ms es bastante, quizás no
podríamos hacer un ds.depower() aquí, pero el reset se hará cargo de él.
actual = ds.reset();
DS.Select(ADDR);
DS.Write(0xBE); Bloc de notas de lectura
para (i = 0; i < 9; i ++) {/ / necesitamos 9 bytes
datos [i] = ds.read();
}
convertir los datos a la temperatura real
unsigned int de crudo = (datos [1] << 8) | datos [0];
Si (type_s) {}
materia prima = raw << 3; por defecto de resolución 9 bits
Si (datos [7] == 0 x 10) {}
cuenta siendo da resolución de 12 bits completo
materia prima = (materia prima y 0xFFF0) + 12 - datos [6];
}
} else {}
cfg de byte = (datos [4] y 0x60);
Si (cfg == 0 x 00) crudo = raw << 3; resolución de 9 bits, ms 93,75
else if (cfg == 0 x 20) crudo = raw << 2; resolución de 10 bits, ms 187,5
else if (cfg == 0 x 40) crudo = raw << 1; resolución de 11 bits, de 375 ms
valor predeterminado es 12 bits de resolución, tiempo de conversión de ms 750
}
Celsius = (float) crudo / 16.0;
Fahrenheit = centígrados * 1.8 + 32.0;
Si ('f' == unidad)
volver fahrenheit;
otra cosa
volver celsius;
}