Прошу помощи!

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
smoker_vvo
Сообщения: 113
Зарегистрирован: Пт дек 14, 2012 3:46 am
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Прошу помощи!

Сообщение smoker_vvo » Ср янв 15, 2014 3:36 pm

Соратники, помогите. Есть код, по всем понятиям - рабочий, но я столкнулся со следующей проблемкой, работает только с двумя адресами DS18B20 (всего их 7 шт.). В чем может быть проблема????
Но правда после выдачи в отладчик "GET /objects/?object=sensorKitchen&op=m&m=tempChanged&t=%0d.%d", (int)current_temp0, abs(temp1)); получаю FAILED, на MDM считывает эти показания, вот что видим в отладчике:
Start
1-wire: found 7 devices. Parasite power is: OFF
Found device 0 with address: 2888ADD70200004200000000Resolution actually set to: 12
27.12C
Found device 1 with address: 2814A5D7020000B000000000Resolution actually set to: 12
24.37C
Found device 2 with address: 2872267B0400002E00000000Resolution actually set to: 12
-3.31C
Found device 3 with address: 28E6D5D7020000C100000000Resolution actually set to: 12
-13.69C
Found device 4 with address: 2816B47A0400008A00000000Resolution actually set to: 12
0.37C
Found device 5 with address: 282B86D7020000CF00000000Resolution actually set to: 12
31.37C
Found device 6 with address: 28AB9DD70200002900000000Resolution actually set to: 12
-0.06C
T0: 27.06
T1: 24.25
T2: -3.44
GET /objects/?object=sensorGarage&op=m&m=tempChanged&t=-3.43
FAILED
T3: -13.75
GET /objects/?object=sensorUlitsa&op=m&m=tempChanged&t=-13.75
FAILED
T4: 0.25
T5: 31.37
T6: -0.19
G
E
M1
GET /objects/?object=sensorMovement1&op=m&m=statusChanged&status=1
FAILED


Сам Код:

Код: Выделить всё

/**
* Контроллер-сборщик данных (к проекту http://smartliving.ru/)
* Platform: Arduino UNO R3 + EthernetShield W5100
* IDE: Arduino 1.0.1
* Подключение датчиков температуры DS18x20 по схеме с нормальным питанием (пример http://sourceforge.net/apps/trac/arduios/wiki/owmon)
* данные (зеленый провод со схемы по ссылке указанной выше) подключаем на D2
* ВНИМАНИЕ! Для того чтобы у Вас заработало получение данных с детчиков температуры, нужно прописать адреса ваших датчиков (ниже по коду)
*
* Остальные датчики:
* Digital 4 - Датчик гаражной двери
* Digital 5 - Датчик въездных воротна
* Digital 15 - Датчик движения 1
* Digital 7 - Датчик движения 2
* Digital 8 - Датчик света
*
*
*
**/
#include <Ethernet.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <math.h>

// MAC-адрес нашего устройства
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 89 };
byte subnet[] = { 255, 255, 255, 0 };
byte gateway[] = { 192, 168, 0, 1 };
byte dns_server[] = { 192, 168, 0, 1 };
// ip-адрес удалённого сервера
byte server[] = { 192, 168, 0, 3 };

EthernetClient rclient;

// Pin controller for connection data pin DS18S20
#define ONE_WIRE_BUS 9 // Digital 2 pin Arduino (куда подключен выход с шины датчиков DS18X20
#define TEMPERATURE_PRECISION 9

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// Настройка датчиков температуры (адреса удобно определять программой из примера DallasTemperature/Mulriple)
//Device 0 Address: 1060CF59010800E3
//Device 1 Address: 109ABE59010800FE
// Датчик температуры на (T0 кухня)
DeviceAddress Termometer0 = { 0x28, 0x88, 0xAD, 0xD7, 0x2, 0x0, 0x0, 0x42 };
// Датчик температуры на (T1 спальня)
DeviceAddress Termometer1 = { 0x28, 0x14, 0xA5, 0xD7, 0x2, 0x0, 0x0, 0xB0 };
// Датчик температуры на (T2 гараж)
DeviceAddress Termometer2 = { 0x28, 0x72, 0x26, 0x7B, 0x4, 0x0, 0x0, 0x2E };с этим датчиком - работает
// Датчик температуры на (T3 улица)
DeviceAddress Termometer3 = { 0x28, 0xE6, 0xD5, 0xD7, 0x2, 0x0, 0x0, 0xC1 };с этим датчиком - работает
// Датчик температуры на (T4 спальня 2 эт.)
DeviceAddress Termometer4 = { 0x28, 0x16, 0xB4, 0x7A, 0x4, 0x0, 0x0, 0x8A };
// Датчик температуры на (T5 зал)
DeviceAddress Termometer5 = { 0x28, 0x2B, 0x86, 0xD7, 0x2, 0x0, 0x0, 0xCF };
// Датчик температуры на (T6 мансарда)
DeviceAddress Termometer6 = { 0x28, 0xAB, 0x9D, 0xD7, 0x2, 0x0, 0x0, 0x29 };


// Для поиска
DeviceAddress Termometers;

// Инициализация начальных значений
float tempC;
int old_temperature0=0;
int old_temperature1=0;
int old_temperature2=0;
int old_temperature3=0;
int old_temperature4=0;
int old_temperature5=0;
int old_temperature6=0;
int old_garage=0;
int old_entry=0;
int old_movement_1=0;
int old_movement_2=0;
int old_light=0;
char buf[80];
char ipbuff[16];

// ------------------------------------------------------------------------------------------------

// Функция отправки HTTP-запроса на сервер
void sendHTTPRequest() {
  Serial.println(buf);
  if (rclient.connect(server, 80)) {
   Serial.println("OK");
   rclient.print(buf);
   rclient.println(" HTTP/1.0");
   rclient.print("Host: ");
   sprintf(ipbuff, "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]);
   rclient.println(ipbuff); // ip адрес нашего контроллера в текстовом виде
   rclient.print("Content-Type: text/html\n");
   rclient.println("Connection: close\n");
   delay(2000);
   rclient.stop();
  } else {
   Serial.println("FAILED");
  }
}

/**************************************************************************************************
*/
void searchDevices() {
   int numberOfDevices = sensors.getDeviceCount();
   sensors.begin();
   
   for(int i=0;i<numberOfDevices; i++) {
      if(sensors.getAddress(Termometers, i))
      {
          Serial.print("Found device ");
         Serial.print(i, DEC);
          Serial.print(" with address: ");
          for (uint8_t i = 0; i < 12; i++) {
            if (Termometers[i] < 16) Serial.print("0");
              Serial.print(Termometers[i], HEX);
          }

          Serial.print("Resolution actually set to: ");
                Serial.print(sensors.getResolution(Termometers), DEC);
          Serial.println();
          float tempC = sensors.getTempC(Termometers);
          Serial.print(tempC);
          Serial.println("C");
      
      } else {
            // not found
      }
    }
}




/**************************************************************************************************
*/

// ------------------------------------------------------------------------------------------------
void setup()
{
  // Для дебага будем выводить отладочные сообщения в консоль
  Serial.begin(9600);
  Serial.println("Start");

// Настройки 1-wire
  sensors.begin(); // Инициализация шины 1-wire (для датчиков температуры)

// Определим сколько датчиков на шине
  Serial.print("1-wire: found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.print(" devices.");
  Serial.print(" Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");

  searchDevices();


/*
if (sensors.validAddress(Termometer1) == true) {
Serial.println("Address is VALID");
if (sensors.isConnected(Termometer1) == true) {
Serial.println("Termometer1 isConnected");
sensors.setResolution(Termometer1, TEMPERATURE_PRECISION);
sensors.setResolution(Termometer2, TEMPERATURE_PRECISION);
} else {
Serial.println("Termometer1 isConnected=false");
}
}
*/

 Ethernet.begin(mac, ip, dns_server, gateway, subnet); // Инициализируем Ethernet Shield

 pinMode(4, INPUT); // Датчик гаражной двери
 old_garage=digitalRead(4);

 pinMode(5, INPUT); // Датчик въездных ворот
 old_entry=digitalRead(5);

 pinMode(15, INPUT); // Датчик движения 1
 old_movement_1=digitalRead(15);

 pinMode(7, INPUT); // Датчик движения 2
 old_movement_2=digitalRead(7);

 pinMode(8, INPUT); // Датчик света
 old_light=digitalRead(8);

}

// ------------------------------------------------------------------------------------------------
void loop()
{

  // Перед каждым получением температуры надо ее запросить
  sensors.requestTemperatures();
  
  int valid_sensor=0;

  delay(5000); // задержка в 5 сек.


  // TEMP SENSOR 0 --------------------------------------
  float current_temp0=0;
  tempC = sensors.getTempC(Termometer0); // Получим температуру от датчика (или ошибку)
  if (tempC == DEVICE_DISCONNECTED) {
    // Устройство отсоеденнено
    Serial.println("Termometer0 is DEVICE_DISCONNECTED");
    // TODO Послать бы на сервер сигнал о том, что датчит не отвечает
    
  } else {
    // Устройство отдало реальное значение температуры (или осталось старое)
    Serial.print("T0: ");
    current_temp0 = tempC; // получаем температуру
    Serial.println(current_temp0);
    if ((old_temperature0!=(int)current_temp0) && (current_temp0<79) && (current_temp0<0)) {
      int temp1 = (current_temp0 - (int)current_temp0) * 100; // выделяем дробную часть
      sprintf(buf, "GET /objects/?object=sensorKitchen&op=m&m=tempChanged&t=%0d.%d", (int)current_temp0, abs(temp1));
      sendHTTPRequest();
    }
  old_temperature0=(int)current_temp0;
  }


  // TEMP SENSOR 1 --------------------------------------
  float current_temp1=0;
  tempC = sensors.getTempC(Termometer1); // Получим температуру от датчика (или ошибку)
  if (tempC == DEVICE_DISCONNECTED) {
    // Устройство отсоеденнено
    Serial.println("Termometer1 is DEVICE_DISCONNECTED");
    // TODO Послать бы на сервер сигнал о том, что датчит не отвечает
    
  } else {
    // Устройство отдало реальное значение температуры (или осталось старое)
    Serial.print("T1: ");
    current_temp1 = tempC; // получаем температуру
    Serial.println(current_temp1);
    if ((old_temperature1!=(int)current_temp1) && (current_temp1<50) && (current_temp1<0)) {
      int temp1 = (current_temp1 - (int)current_temp1) * 100; // выделяем дробную часть
      sprintf(buf, "GET /objects/?object=sensorSpalnya&op=m&m=tempChanged&t=%0d.%d", (int)current_temp1, abs(temp1));
      sendHTTPRequest();
    }
  old_temperature1=(int)current_temp1;
  }
  
  // TEMP SENSOR 2 --------------------------------------
  float current_temp2=0;
  tempC = sensors.getTempC(Termometer2); // Получим температуру от датчика (или ошибку)
  if (tempC == DEVICE_DISCONNECTED) {
    // Устройство отсоеденнено
    Serial.println("Termometer2 is DEVICE_DISCONNECTED");
    // TODO Послать бы на сервер сигнал о том, что датчит не отвечает
    
  } else {
    // Устройство отдало реальное значение температуры (или осталось старое)
    Serial.print("T2: ");
    current_temp2 = tempC; // получаем температуру
    Serial.println(current_temp2);
    if ((old_temperature2!=(int)current_temp2) && (current_temp2<50) && (current_temp2<0)) {
      int temp1 = (current_temp2 - (int)current_temp2) * 100; // выделяем дробную часть
      sprintf(buf, "GET /objects/?object=sensorGarage&op=m&m=tempChanged&t=%0d.%d", (int)current_temp2, abs(temp1));
      sendHTTPRequest();
    }
  old_temperature2=(int)current_temp2;
  }
  
  // TEMP SENSOR 3 --------------------------------------
  float current_temp3=0;
  tempC = sensors.getTempC(Termometer3); // Получим температуру от датчика (или ошибку)
  if (tempC == DEVICE_DISCONNECTED) {
    // Устройство отсоеденнено
    Serial.println("Termometer3 is DEVICE_DISCONNECTED");
    // TODO Послать бы на сервер сигнал о том, что датчит не отвечает
    
  } else {
    // Устройство отдало реальное значение температуры (или осталось старое)
    Serial.print("T3: ");
    current_temp3 = tempC; // получаем температуру
    Serial.println(current_temp3);
    if ((old_temperature3!=(int)current_temp3) && (current_temp3<50) && (current_temp3<0)) {
      int temp1 = (current_temp3 - (int)current_temp3) * 100; // выделяем дробную часть
      sprintf(buf, "GET /objects/?object=sensorUlitsa&op=m&m=tempChanged&t=%0d.%d", (int)current_temp3, abs(temp1));
      sendHTTPRequest();
    }
  old_temperature3=(int)current_temp3;
  }
  
  // TEMP SENSOR 4 --------------------------------------
  float current_temp4=0;
  tempC = sensors.getTempC(Termometer4); // Получим температуру от датчика (или ошибку)
  if (tempC == DEVICE_DISCONNECTED) {
    // Устройство отсоеденнено
    Serial.println("Termometer4 is DEVICE_DISCONNECTED");
    // TODO Послать бы на сервер сигнал о том, что датчит не отвечает
    
  } else {
    // Устройство отдало реальное значение температуры (или осталось старое)
    Serial.print("T4: ");
    current_temp4 = tempC; // получаем температуру
    Serial.println(current_temp4);
    if ((old_temperature4!=(int)current_temp4) && (current_temp4<50) && (current_temp4<0)) {
      int temp1 = (current_temp4 - (int)current_temp4) * 100; // выделяем дробную часть
      sprintf(buf, "GET /objects/?object=sensorSpalnya2&op=m&m=tempChanged&t=%0d.%d", (int)current_temp4, abs(temp1));
      sendHTTPRequest();
    }
  old_temperature4=(int)current_temp4;
  }
  
  // TEMP SENSOR 5 --------------------------------------
  float current_temp5=0;
  tempC = sensors.getTempC(Termometer5); // Получим температуру от датчика (или ошибку)
  if (tempC == DEVICE_DISCONNECTED) {
    // Устройство отсоеденнено
    Serial.println("Termometer5 is DEVICE_DISCONNECTED");
    // TODO Послать бы на сервер сигнал о том, что датчит не отвечает
    
  } else {
    // Устройство отдало реальное значение температуры (или осталось старое)
    Serial.print("T5: ");
    current_temp5 = tempC; // получаем температуру
    Serial.println(current_temp5);
    if ((old_temperature5!=(int)current_temp5) && (current_temp5<50) && (current_temp5<0)) {
      int temp1 = (current_temp5 - (int)current_temp5) * 100; // выделяем дробную часть
      sprintf(buf, "GET /objects/?object=sensorZal&op=m&m=tempChanged&t=%0d.%d", (int)current_temp5, abs(temp1));
      sendHTTPRequest();
    }
  old_temperature5=(int)current_temp5;
  }
  
  // TEMP SENSOR 6 --------------------------------------
  float current_temp6=0;
  tempC = sensors.getTempC(Termometer6); // Получим температуру от датчика (или ошибку)
  if (tempC == DEVICE_DISCONNECTED) {
    // Устройство отсоеденнено
    Serial.println("Termometer6 is DEVICE_DISCONNECTED");
    // TODO Послать бы на сервер сигнал о том, что датчит не отвечает
    
  } else {
    // Устройство отдало реальное значение температуры (или осталось старое)
    Serial.print("T6: ");
    current_temp6 = tempC; // получаем температуру
    Serial.println(current_temp6);
    if ((old_temperature6!=(int)current_temp6) && (current_temp6<50) && (current_temp6<0)) {
      int temp1 = (current_temp6 - (int)current_temp6) * 100; // выделяем дробную часть
      sprintf(buf, "GET /objects/?object=sensorTop&op=m&m=tempChanged&t=%0d.%d", (int)current_temp6, abs(temp1));
      sendHTTPRequest();
    }
  old_temperature6=(int)current_temp6;
  }
 

  //GARAGE GATES SENSOR
  Serial.println("G");
  int current_garage=digitalRead(4);
  //Serial.println(current_garage);
  if (current_garage!=(int)old_garage) {
    old_garage=(int)current_garage;
    sprintf(buf, "GET /objects/?object=sensorGarage&op=m&m=statusChanged&status=%i", (int)current_garage);
    sendHTTPRequest();
  }

 //ENTRY GATES SENSOR

  Serial.println("E");
  int current_entry=digitalRead(5);
  //Serial.println(current_entry);
  if (current_entry!=(int)old_entry) {
    old_entry=(int)current_entry;
    sprintf(buf, "GET /objects/?object=sensorEntry&op=m&m=statusChanged&status=%i", (int)current_entry);
    sendHTTPRequest();
  }

 //MOVEMENT 1 SENSOR
  Serial.println("M1");
  int current_movement_1=digitalRead(6);
  //Serial.println(current_movement_1);
  if (current_movement_1!=(int)old_movement_1) {
    old_movement_1=(int)current_movement_1;
    sprintf(buf, "GET /objects/?object=sensorMovement1&op=m&m=statusChanged&status=%i", (int)current_movement_1);
    sendHTTPRequest();
  }

 //MOVEMENT 2 SENSOR
  Serial.println("M2");
  int current_movement_2=digitalRead(7);
  //Serial.println(current_movement_2);
  if (current_movement_2!=(int)old_movement_2) {
    old_movement_2=(int)current_movement_2;
    sprintf(buf, "GET /objects/?object=sensorMovement2&op=m&m=statusChanged&status=%i", (int)current_movement_2);
    sendHTTPRequest();
  }


 //LIGHT SENSOR

  Serial.println("L");
  int current_light=digitalRead(8);
  //Serial.println(current_light);
  if (current_light!=(int)old_light) {
    old_light=(int)current_light;
    sprintf(buf, "GET /objects/?object=sensorLight&op=m&m=statusChanged&status=%i", (int)current_light);
    sendHTTPRequest();
  }


}
Ответить