Advertisement
Guest User

Untitled

a guest
Mar 14th, 2013
739
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.54 KB | None | 0 0
  1. /*
  2.  
  3. Estado: Aparece solo en la pantalla la temperatura del agua y la fecha/hora
  4. Modificado para que quepa el ethernet encima del mega.
  5. Modificado lineas de codigo con la luz: todas las luces es luz y la luna es noche; Los ventiladores funcionan segun temperatura
  6. Pendiente: Añadir el codigo necesario para enviar le resto de informacion a la webserver
  7.  
  8. Primeras lineas de codigo del controlador de Acuario By Antonio David Torres
  9.  
  10. http://miacuarioplantado.comuv.com/
  11.  
  12. */
  13.  
  14. // include the library code:
  15. #include <Wire.h> // incluimos libreria wire
  16. #include <OneWire.h> // incluimos libreria de cables
  17. #include <DallasTemperature.h> // Incluimos libreria sensores
  18. #include <EEPROM.h> // Librería para poder escribir en la eprom del arduino
  19. #include <LiquidCrystal.h> // incluimos libreria LCD
  20. #include "RelojDS1307.h" // Libreria del Reloj
  21. #include <Ethernet.h>
  22. #include <SPI.h>
  23.  
  24. // Datos de red
  25.  
  26. byte mac[] = { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 };
  27. byte ip[] = { 192, 168, 1, 50 }; // Change this
  28. IPAddress subnet(255, 255, 255, 0);
  29.  
  30. EthernetServer servidor(54322);
  31.  
  32. // DEFINIMOS PINES DE SENSORES Y RELES
  33. #define PIN_P_LUCES 2 // AMARILLO LUCES 1
  34. #define PIN_P_LUCESN 4 // VERDE LUZ NOCHE (AZUL)
  35. #define PIN_P_VENTILADOR 3 // AZUL VENTILADOR
  36. #define PIN_P_TEMPER 5 // SENSORES TEMPERATURA
  37. #define PIN_D_RELE_CALENTADOR 28 //PIN 28 DIGITAL CONECTADO A RELE 2
  38. #define PIN_D_RELE_LUCES 34 //PIN 34 DIGITAL CONECTADO A RELE 1
  39. #define PIN_D_COMIDA 36
  40.  
  41. #define MARGEN_TEMPERATURA 0.2
  42.  
  43. #define DIMEO_LUZ 255
  44. #define DIMEO_NOCHE 255
  45.  
  46. #define BUFFER 10
  47. EthernetServer servidorArduino(3200);
  48.  
  49.  
  50. typedef struct Configuracio_struct
  51. {
  52.  
  53. float TermoAcuario; //Temperatura Acuario
  54. float TermoTapa; //Temperatura Tapa
  55.  
  56. int LuzH_ON; //Hora de encendido de la luz
  57. int LuzM_ON; //Minutos de encendido de la luz
  58. int LuzH_OFF; //Hora de apagado de la luz
  59. int LuzM_OFF; //Minutos de apagado de la luz
  60. int LuzNH_ON; //Hora de encendido de la luz NOCHE
  61. int LuzNM_ON; //Minutos de encendido de la luz NOCHE
  62. int LuzNH_OFF; //Hora de apagado de la luz NOCHE
  63. int LuzNM_OFF; //Minutos de apagado de la luz NOCHE
  64. int COMIDA_H; //Hora de COMIDA
  65. int COMIDA_M; //Minutos de COMIDA
  66. char comando[BUFFER];
  67. } Stru_Configuracion;
  68.  
  69.  
  70. void(* resetFunc) (void) = 0;
  71. DeviceAddress AguaTermo, TapaTermo; // Direcciones de los sensores de temperatura
  72.  
  73. void Alarma();
  74.  
  75. OneWire oneWire( PIN_P_TEMPER );
  76. DallasTemperature sensors(&oneWire);
  77. int Dimeo1, DimeoN;
  78. LiquidCrystal lcd(23, 25, 27, 29, 31, 33, 35);
  79. RelojDS1307Class Reloj; //Declaración de la variable del Reloj
  80. Stru_Configuracion CFG; //Variable de la configuración
  81.  
  82. boolean hancomido = false;
  83.  
  84.  
  85.  
  86.  
  87. void SetRele( int Index, int Pin, boolean Estado )
  88. {
  89. int I = 8-Index;
  90.  
  91. digitalWrite( Pin, !Estado );
  92.  
  93. }
  94.  
  95.  
  96. void setup()
  97. {
  98. Serial.begin(9600);
  99. Ethernet.begin(mac, ip);
  100. servidorArduino.begin();
  101. pinMode( PIN_P_LUCES, OUTPUT );
  102. pinMode( PIN_P_VENTILADOR, OUTPUT );
  103. pinMode( PIN_P_LUCESN, OUTPUT );
  104. pinMode( PIN_D_RELE_LUCES, OUTPUT );
  105. pinMode( PIN_D_RELE_CALENTADOR, OUTPUT );
  106. pinMode( PIN_D_COMIDA, OUTPUT );
  107.  
  108. byte n;
  109. for(n=28; n < 43; n = n + 2)
  110. {
  111. digitalWrite( n, HIGH);
  112. }
  113.  
  114.  
  115. Wire.begin();
  116.  
  117. Dimeo1 = 0; DimeoN = 0;
  118. CFG.TermoAcuario = 26; // AQUI PODEMOS MODIFICAR LOS VALORES QUE QUERAMOS.
  119. CFG.TermoTapa = 28.0;
  120. CFG.LuzH_ON = 11;
  121. CFG.LuzM_ON = 0;
  122. CFG.LuzH_OFF = 21;
  123. CFG.LuzM_OFF = 45;
  124. CFG.LuzNH_ON = 21;
  125. CFG.LuzNM_ON = 45;
  126. CFG.LuzNH_OFF = 23;
  127. CFG.LuzNM_OFF = 0;
  128. CFG.COMIDA_H = 15;
  129. CFG.COMIDA_M = 0;
  130.  
  131.  
  132.  
  133.  
  134. lcd.begin(16, 2); // Le decimos a la pantalla las dimensiones que tiene.
  135. //Reloj.SetDateTime( 28, 10, 12, 19, 20, 00 ); // Quitar comentario para ajustar la hora.
  136. /// LeerConfig();
  137. IniciarTemperaturas(); //Iniciamos los sensores de temperatura.
  138.  
  139. }
  140.  
  141.  
  142. void loop () // ***********Inicio del bucle del programa*********************
  143. {
  144.  
  145. MirarTemperaturas(); //Miramos la temperaturas
  146. horario_luces(); // LLAMADA A COMPROBAR HORARIO LUCES
  147. // SetRele( 1, PIN_D_RELE_LUCES, HIGH ); analogWrite( PIN_P_LUCES, 255 ); // Para dejar luces encendidas fijas
  148. comedero();
  149. fechahora();
  150. ethernet();
  151.  
  152. }
  153.  
  154.  
  155. /////////////////////// FIN DEL LOOP //////////////////
  156.  
  157.  
  158. ///////////////////////////////////////////////////////////////
  159. //
  160. // INICIAR LOS SENSORES DE TEMPERATURA Y ALARMAS
  161. //
  162. ///////////////////////////////////////////////////////////////
  163. void IniciarTemperaturas()
  164. {
  165. //Iniciamos el controlador del controlador/s DS18B20
  166. sensors.begin();
  167.  
  168. //Compruebo que estén todos los sensores.
  169. //Cuidado, ya que al llamar a “sensors.getAddress()”, lo que hacemos es definir que
  170. //variable es cada sensor, por ejemplo definimos que el sensor Nº0 es DepoTermo.
  171. if (sensors.getDeviceCount() < 2); //Serial.println( "Faltan sensores de temperatura");
  172. if (!sensors.getAddress(AguaTermo, 0)); //Serial.println("Falta el sensores de temperatura del agua");
  173. if (!sensors.getAddress(TapaTermo, 1)); //Serial.println("Falta el sensores de temperatura de la tapa");
  174.  
  175. sensors.setHighAlarmTemp( AguaTermo, 26.75 );
  176. sensors.setLowAlarmTemp( AguaTermo, 26.25 );
  177. sensors.setHighAlarmTemp( TapaTermo, 30.00 );
  178. sensors.setLowAlarmTemp( TapaTermo, 29.50 );
  179. }
  180.  
  181.  
  182. ///////////////////////////////////////////////////////////////
  183. //
  184. // MIRAR LAS TEMPERATURA
  185. //
  186. ///////////////////////////////////////////////////////////////
  187. void MirarTemperaturas()
  188. {
  189. float TemperaturaAcuario, TemperaturaTapa;
  190.  
  191. //Llamamos a la función requestTemperatures() de nuestro controlador de sensores
  192. //para que se prepare a nuestra llamada de lectura.
  193. sensors.requestTemperatures();
  194.  
  195. //llamamos a getTempC() pasándole la variable del sensor que queremos leer
  196. // y esta función nos devolverá la temperatura de el sensor llamado.
  197. TemperaturaAcuario = sensors.getTempC( AguaTermo ); // ACUARIO
  198. TemperaturaTapa = sensors.getTempC( TapaTermo ); // TAPA
  199.  
  200. // LEE Y ESCRIBE LA TEMPERATURA DEL AGUA
  201. // E INDICA SI EL CALENTADOR ESTA ON U OFF
  202.  
  203.  
  204.  
  205. lcd.begin(16, 2);
  206. lcd.print("Calentador: "); // Escribe calentador en el LCD.
  207. lcd.print(OFFON(digitalRead(PIN_D_RELE_CALENTADOR)));
  208. lcd.setCursor(0, 1); // Envia el cursor al comienzo de la segunda linea
  209. lcd.print("Temp. Agua:"); // Imprime la temperatura.
  210. lcd.print( TemperaturaAcuario );
  211. if ((sensors.getTempC(AguaTermo) < (CFG.TermoAcuario-MARGEN_TEMPERATURA)))
  212. SetRele( 2, PIN_D_RELE_CALENTADOR, HIGH );
  213. if ((sensors.getTempC(AguaTermo) > (CFG.TermoAcuario+MARGEN_TEMPERATURA)))
  214. SetRele( 2, PIN_D_RELE_CALENTADOR, LOW );
  215.  
  216. // LEE LA TEMPERATURA DE LA TAPA Y ACTIVA O DESACTIVA LOS VENTILADORES
  217.  
  218. if (sensors.getTempC(TapaTermo) < (CFG.TermoTapa) ) analogWrite(PIN_P_VENTILADOR, 0 );
  219. if (sensors.getTempC(TapaTermo) > (CFG.TermoTapa+3) ) analogWrite(PIN_P_VENTILADOR, 50 );
  220. if (sensors.getTempC(TapaTermo) > (CFG.TermoTapa+4) ) analogWrite(PIN_P_VENTILADOR, 100 );
  221. if (sensors.getTempC(TapaTermo) > (CFG.TermoTapa+5) ) analogWrite(PIN_P_VENTILADOR, 150 );
  222. if (sensors.getTempC(TapaTermo) > (CFG.TermoTapa+6) ) analogWrite(PIN_P_VENTILADOR, 200 );
  223.  
  224. delay (4000);
  225.  
  226. }
  227.  
  228.  
  229.  
  230. ////////////////// COMPROBACION HORARIO LUCES /////////
  231.  
  232. void horario_luces ()
  233.  
  234. {
  235.  
  236. /////////// LUCES /////////////////////
  237.  
  238. // ENCIENDE LUZ Nº1 PRIMERA TIRA DE LEDS EN LA PRIMERA MEDIA HORA DE ENCENDIDO VA AUMENTANDO EL VALOR DIMEO1 HASTA 200///////////////
  239. if(Reloj.IsLater( CFG.LuzH_ON, CFG.LuzM_ON ) && Reloj.IsPrevious( CFG.LuzH_OFF, CFG.LuzM_OFF ))
  240. {
  241. // Alimentar el transformador de la luz si no esta encendido
  242. if (digitalRead(PIN_D_RELE_LUCES)) SetRele( 1, PIN_D_RELE_LUCES, HIGH );
  243. if ( Dimeo1 < DIMEO_LUZ )
  244. {
  245. Dimeo1 += 2;
  246. if (Dimeo1 > DIMEO_LUZ) Dimeo1 = DIMEO_LUZ;
  247. // Si se a re-iniciado el sistema
  248. if(Reloj.IsLater( CFG.LuzH_ON, CFG.LuzM_ON+30 ) && Reloj.IsPrevious( CFG.LuzH_OFF, CFG.LuzM_OFF )) Dimeo1 = DIMEO_LUZ;
  249. analogWrite( PIN_P_LUCES, Dimeo1 );
  250. }
  251.  
  252. }
  253.  
  254. // APAGA LUZ Nº1 PRIMERA TIRA DE LEDS EN LA PRIMERA MEDIA HORA DE DESDE SU APAGADO VA DISMINUYENDO EL VALOR DIMEO1 HASTA 0
  255.  
  256. if(Reloj.IsLater( CFG.LuzH_OFF, CFG.LuzM_OFF ) && (Dimeo1 > 0) )
  257. {
  258. Dimeo1 -= 2;
  259. if (Dimeo1 < 0) Dimeo1 = 0;
  260. // Si se a re-iniciado el sistema
  261. if (Reloj.IsLater( CFG.LuzH_OFF, CFG.LuzM_OFF+30 )) Dimeo1 = 0;
  262. analogWrite( PIN_P_LUCES, Dimeo1 ); // APAGA LA TIRA DE LEDS 1
  263.  
  264. }
  265.  
  266. // ENCIENDE LUZ NOCHE /////////////////////////////////////////////////////////////////////////////////////////////////
  267. if(Reloj.IsLater( CFG.LuzNH_ON, CFG.LuzNM_ON ) && Reloj.IsPrevious( CFG.LuzNH_OFF, CFG.LuzNM_OFF ))
  268. {
  269. // Alimentar el tramformador de la luz si no esta encendido
  270. if (digitalRead(PIN_D_RELE_LUCES)) SetRele( 1, PIN_D_RELE_LUCES, HIGH);
  271. if ( DimeoN < DIMEO_NOCHE )
  272. {
  273. DimeoN += 2;
  274. if (DimeoN > DIMEO_NOCHE) DimeoN = DIMEO_NOCHE;
  275. // Si se a ri-iniciado el sistema
  276. if(Reloj.IsLater( CFG.LuzNH_ON, CFG.LuzNM_ON+30 ) && Reloj.IsPrevious( CFG.LuzNH_OFF, CFG.LuzNM_OFF )) DimeoN = DIMEO_NOCHE;
  277. analogWrite( PIN_P_LUCESN, DimeoN );
  278. }
  279.  
  280. }
  281.  
  282. // APAGA LUZ NOCHE
  283. if( Reloj.IsLater( CFG.LuzNH_OFF, CFG.LuzNM_OFF ) && (DimeoN > 0) )
  284. {
  285. DimeoN -= 2;
  286. if (DimeoN < 0) DimeoN = 0;
  287. // Si se a ri-iniciado el sistema
  288. if (Reloj.IsLater( CFG.LuzNH_OFF, CFG.LuzNM_OFF+30 )) DimeoN = 0;
  289. analogWrite( PIN_P_LUCESN, DimeoN );
  290.  
  291. // Apagamos el tranformador de la luz
  292. if ( DimeoN == 0 ) SetRele( 1, PIN_D_RELE_LUCES, LOW );
  293.  
  294. }
  295.  
  296. }
  297.  
  298. /////////////////////////////////////////////////////////////
  299. //
  300. ///IMPRIME LA HORA Y LA FECHA EN LA PANTALLA.
  301. //
  302. ///////////////////////////////////////////////////////////
  303.  
  304. void fechahora()
  305. {
  306. lcd.begin(16, 2);
  307. lcd.print("Fecha "); // Imprime la palabra fecha
  308. lcd.write( Reloj.Date()); // Imprime la variable fecha
  309. lcd.setCursor(0, 1); // Envia el cursor al comienzo de la segunda linea
  310. lcd.print ("Hora ");
  311. lcd.write( Reloj.Time()); // Imprime la hora y la variable hora
  312. delay (2000);
  313. }
  314.  
  315.  
  316. ///////////////////////////////////////////////////////////////
  317. //
  318. // GENERA PITIDOS DE ALARMA
  319. //
  320. ///////////////////////////////////////////////////////////////
  321. void Alarma()
  322. {
  323. // Aqui pondriamos la instruccion para que nos avise, mediante twiter o correo o algo...
  324. }
  325.  
  326. ///////////////////////////////////////////////////////////////
  327. //
  328. // DEVUELVE ON o OFF
  329. //
  330. ///////////////////////////////////////////////////////////////
  331. char * OFFON( int Valor )
  332. {
  333. if (Valor == LOW)
  334. {return "ON ";}
  335. else
  336. {return "OFF";}
  337. }
  338.  
  339.  
  340. ///////////////////////////////////////////////////////////////
  341. //
  342. // GRAVA LA CONFIGURACION EN LA EPROM
  343. //
  344. ///////////////////////////////////////////////////////////////
  345. void SalvarConfig()
  346. {
  347. uint8_t Valor[sizeof(CFG)];
  348. memcpy( &Valor, &CFG, sizeof(CFG));
  349. for (int i = 0; i <= sizeof(Valor); i++)
  350. EEPROM.write(i, Valor[i]);
  351. }
  352. ///////////////////////////////////////////////////////////////
  353. //
  354. // LEE LA CONFIGURACION DE LA EPROM
  355. //
  356. ///////////////////////////////////////////////////////////////
  357. void LeerConfig()
  358. {
  359. uint8_t Valor[sizeof(CFG)];
  360.  
  361. for (int i = 0; i <= sizeof(CFG); i++)
  362. Valor[i] = EEPROM.read(i);
  363.  
  364. memcpy( &CFG, &Valor, sizeof(CFG));
  365. }
  366.  
  367. /////////////////////////////////////////////////////////////
  368. //
  369. // COMEDERO
  370. //
  371. //////////////////////////////////////////////////
  372.  
  373. void comedero()
  374. {
  375. if ((Reloj.GetHour() == (CFG.COMIDA_H)) && (Reloj.GetMinute() == (CFG.COMIDA_M )) && (!hancomido ));
  376. {
  377. SetRele( 4, PIN_D_COMIDA, HIGH );
  378. delay(3000);
  379. SetRele( 4, PIN_D_COMIDA, LOW );
  380. hancomido = true;
  381. }
  382. if (Reloj.GetHour() != (CFG.COMIDA_H) && (Reloj.GetMinute() != (CFG.COMIDA_M ))) hancomido= false;
  383.  
  384. }
  385.  
  386. ///////////////////////////////////////////////////////////////
  387. //
  388. // Empieza ethernet
  389. //
  390. //////////////////////////////////////////////////////////////
  391.  
  392. void ethernet()
  393.  
  394. {
  395. int index = 0;
  396. char comando[BUFFER];
  397. EthernetClient clienteApp = servidorArduino.available();
  398. if (clienteApp)
  399. {
  400. if (clienteApp.connected()) {
  401. while (clienteApp.available()) {
  402. char caracter = clienteApp.read();
  403. if (caracter != '\n') {
  404. comando[index] = caracter;
  405. index++;
  406. if (index >= BUFFER) index = BUFFER -1;
  407. continue;
  408. }
  409. comando[index] = '\0';
  410. }
  411.  
  412. if (strstr(comando, "holaArdu")) {
  413. clienteApp.println("done");
  414. }
  415. clienteApp.println("Estado del agua: ");
  416. clienteApp.println( sensors.getTempC( AguaTermo ) );
  417. }
  418. }
  419. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement