Помогите найти ошибку.
- Войдите на сайт для отправки комментариев
Сб, 13/07/2013 - 18:30
//Версия 1.10
//Программа выводит данные температуры и влажности с DHT 22
//(pin 2)в
//Processing, изменение IP адреса через Serial порт через "*"
//Подача сигнала на PIN 5 при выходе показателей температуры за
//заданные границы.
//EEPROM (0-3) - IP
//EEPROM (4-7) - temperature_up, temperature_down, signal_T_up, signal_T_down
//EEPROM (8-9) - humdity, signal_T_up
//DHT22 pin2
//DS18B20 pin3
//signal good pin4
//signal bad pin5
//relay pin6
//relay pin7
//ledpin 8
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"
#include <EEPROM.h>
//String relay="";
char flag=10;
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
EthernetServer server(80);
EthernetServer serverP(82);
byte ip1, ip2, ip3, ip4, temperature_up, temperature_down, humdity, signal_T_up, signal_T_down, signal_H_up;
int simbol, Relay1=6, Relay2=7, Sigood=4, Sibad=5;
float t, t0, t1, t2, t3, t4, h0, h1, h;
long previousMillis = 0;
long interval = 30000;
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define TEMPERATURE_PRECISION 9
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup()
{
Serial.begin(9600);
Serial.setTimeout(100);
dht.begin();
ip1 = EEPROM.read(0);
ip2 = EEPROM.read(1);
ip3 = EEPROM.read(2);
ip4 = EEPROM.read(3);
temperature_up = EEPROM.read(4);
temperature_down = EEPROM.read(5);
signal_T_up = EEPROM.read(6);
signal_T_down = EEPROM.read(7);
humdity = EEPROM.read(8);
signal_H_up = EEPROM.read(9);
IPAddress ip(ip1,ip2,ip3,ip4);
delay (1000);
Ethernet.begin(mac, ip);
server.begin();
Serial.print ("IP address: ");
// Serial.print (" of the device: ");
Serial.println (ip);
Serial.print ("The upper temp. ");
// Serial.print ("ature limit control: ");
Serial.println (temperature_up);
Serial.print ("The lower temp. ");
// Serial.print ("temperature");
// Serial.print (" limit control: ");
Serial.println (temperature_down);
//Serial.print ("The upper limit ");
// Serial.print ("of moisture for");
Serial.print ("Hum. normal operation: ");
Serial.println (humdity);
// Serial.print ("The upper tempe");
Serial.print ("Up temp. alarm signal: ");
Serial.println (signal_T_up);
// Serial.print ("The lower the tempe");
Serial.print ("Low temp. alarm signal: ");
Serial.println (signal_T_down);
//Serial.print ("The upper limit ");
// Serial.print ("of the humidity ");
Serial.print ("Hum. alarm signal: ");
Serial.println (signal_H_up);
// Serial.println ("To change the setting:");
// Serial.println ("* - IP address of a space * 192 168 1 10 ");
// Serial.println ("t-temperature, 4 values separated by a space: t 25 19 30 17");
// Serial.println ("h-humidity, two values separated by a space: h 55 80");
// Serial.println ("For the changes to take effect you must restart the controller");
sensors.begin();
pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
pinMode(Sigood, OUTPUT);
pinMode(Sibad, OUTPUT);
}
void loop()
{
if(Serial.available()){
simbol=Serial.read ();
if (simbol==116) {
byte t[4] = {0, 0, 0, 0};
for(byte i = 0; i < 4; i++)
{
t[i] = Serial.parseInt();
EEPROM.write(i+4, t[i]);
}
for(byte i = 0; i < 4; i++)
{
t[i] = EEPROM.read(i+4);
Serial.print(t[i]);
if(i < 1) Serial.print(',');
else Serial.println();
}
}
if (simbol==42) {
byte ip[4] = {0, 0, 0, 0};
for(byte i = 0; i < 4; i++)
{
ip[i] = Serial.parseInt();
EEPROM.write(i, ip[i]);
}
for(byte i = 0; i < 4; i++)
{
ip[i] = EEPROM.read(i);
Serial.print(ip[i]);
if(i < 3) Serial.print('.');
else Serial.println();
}
}
if (simbol==104) {
byte h[2] = {0, 0};
for(byte i = 0; i < 2; i++)
{
h[i] = Serial.parseInt();
EEPROM.write(i+8, h[i]);
}
for(byte i = 0; i < 2; i++)
{
h[i] = EEPROM.read(i+8);
Serial.print(h[i]);
if(i < 1) Serial.print(',');
else Serial.println();
}
}
}
t0 = dht.readTemperature();
h = dht.readHumidity();
sensors.requestTemperatures();
t1 = sensors.getTempCByIndex(0);
if (t1>temperature_up) {
int R1=HIGH;
digitalWrite (Relay1, R1);}
else {
if (t1<=temperature_down) {
int R1=LOW;
digitalWrite (Relay1, R1);}
}
t2 = sensors.getTempCByIndex(1);
if (t2>temperature_up) {
int R2=HIGH;
digitalWrite (Relay2, R2);}
else {
if (t2<=temperature_down) {
int R2=LOW;
digitalWrite (Relay2, R2);}
}
EthernetClient clientP = serverP.available();
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
//Печать в Processing
clientP.write('t');
clientP.print(t0, 2); //T DHT22
clientP.write(flag);
clientP.write('h');
clientP.print(h, 2); //H DHT22
clientP.write(flag);
clientP.write(1);
clientP.print(t1, 2); //T1 DS18B20
clientP.write(flag);
clientP.write(2);
clientP.print(t2, 2); //T2 DS18B20
clientP.write(flag);
//clientP.write(1);
//clientP.print (ip1+ip2+ip3+ip4); //ip адрес подключения устройства
// clientP.write(flag);
clientP.write(3);
clientP.print(temperature_up, DEC); //Верхняя температурная граница
clientP.write(flag);
clientP.write(4);
clientP.print(temperature_down, DEC); //нижняя температурная граница
clientP.write(flag);
clientP.write(5);
clientP.print(humdity, DEC); //максимальное значение влажности
clientP.write(flag);
//clientP.write(6);
// clientP.print(R1); //Состояние реле 1
// clientP.write(flag);
// clientP.write(7);
// clientP.print(R1); //Состояние реле 2
// clientP.write(flag);
}
// Печать в WEB
EthernetClient client = server.available();
client.println ("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'");
client.println ("<html>");
client.println ("<head> ");
client.println ("<meta http-equiv= refresh content=60;>");
client.println ("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> ");
client.println ("</head> ");
client.println ("<body>");
client.println ("<b><font size='+3'>Микроклимат серверной </font></b>");
client.println ("<br> ");
client.println ("<b>Датчик №1</b>");
client.println ("<br> ");
client.println ("Температура: ");
client.println (t0);
client.println (" *C");
client.println ("<br>");
client.println ("Влажность: ");
client.println (h);
client.println (" %");
client.println ("<br> ");
client.println ("<b>Датчик №2</b>");
client.println ("<br> ");
client.println ("Температура: ");
client.println (t1);
client.println (" *C");
client.println ("<br> ");
client.println ("<b>Датчик №3</b>");
client.println ("<br> ");
client.println ("Температура: ");
client.println (t2);
client.println (" *C");
client.println ("<br> ");
client.println ("<hr>");
client.println ("<br> ");
client.println ("<b>Заданные нормы температур и влажности:</b>");
client.println ("<br> ");
client.println ("Верхняя температурная граница регулирования: ");
client.println (temperature_up);
client.println (" *C");
client.println ("<br> ");
client.println ("Нижняя температурная граница регулирования: ");
client.println (temperature_down);
client.println (" *C");
client.println ("<br> ");
client.println ("Максимум нормальной влажности воздуха: ");
client.println (humdity);
client.println (" %");
client.println ("<br> ");
client.println ("<hr>");
client.println ("<br> ");
client.println ("<b>Уставки сигналов аварии:</b>");
client.println ("<br> ");
client.println ("Верхняя температурная граница сигнала аварии: ");
client.println (signal_T_up);
client.println (" *C");
client.println ("<br> ");
client.println ("Нижняя температурная граница сигнала аварии: ");
client.println (signal_T_down);
client.println (" *C");
client.println ("<br> ");
client.println ("Аварийный максимум влажности воздуха: ");
client.println (signal_H_up);
client.println (" %");
client.println ("<br> ");
client.println ("<hr>");
client.println ("<br> ");
client.println ("<b>Состояние климата</b>");
client.println ("<br>");
if (t0 < signal_T_down || t1 < signal_T_down || t2 < signal_T_down) {
client.println ("АВАРИЯ, температура ниже нормы");
// Serial.println ("The temperature is below normal");
digitalWrite (Sigood, LOW);
digitalWrite (Sibad, HIGH);
} else { if (t0 > signal_T_up || t1 > signal_T_up || t2 > signal_T_up) {
client.println ("АВАРИЯ, температура выше нормы");
//Serial.println ("Temperature above normal");
digitalWrite (Sigood, LOW);
digitalWrite (Sibad, HIGH);
} else {
client.println ("Норма");
// Serial.println ("Norm");
digitalWrite (Sigood, HIGH);
digitalWrite (Sibad, LOW);}
if (h > signal_H_up) {
client.println ("<br>");
client.println ("АВАРИЯ, влажность выше нормы");
// Serial.println ("Humidity higher than normal");
digitalWrite (Sigood, LOW);
digitalWrite (Sibad, HIGH);
}
}
client.println ("<br> ");
client.println ("<hr>");
client.stop();
//Печать в сериал
// Serial.print ("DHT22 T= ");
// Serial.println (t0);
// Serial.print ("DHT22 H= ");
// Serial.println (h);
// Serial.print ("DS18B20 T1= ");
// Serial.println(t1);
// Serial.print ("DS18B20 T2= ");
//Serial.println(t2);
}
Проблема в следующем.
Буквально через несколько секунд после запуска переписываются значения температур и начинаются глюки в WEBе. Не могу понять что происходит, неделю все работало без сбоев и перезагрузок....
В HTML начинает сыпаться вот это:
Проблему решил. Виноват блок питания на 12v. Грелся МК. Хотя неделю проработал без сбоев.