DHT11 > Arduino > MD

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

Модератор: immortal

annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

DHT11 > Arduino > MD

Сообщение annakin » Вс июн 28, 2015 2:23 pm

Добрый День, перечитал кучу статей на форуме собрал из нескольких скетчей один в основном по мелочам, всё работает но как всегда есть одно НО!
Хочу Эти данные отправить в МД, скажем температуру и влажность с Датчика (DHT11) но тут и оказалась засада.
У МД после установки по умолчанию есть еже добавленные классы TempSensor01 и humSensor01 так вот к примеру я пытаюсь закинуть для начала только инфу о температуре.
Я захожу в Класс tempSensors потом в методы ну и там tempChanged захожу в этот клас и внизу я вижу линк на метод. у меня он:

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

http://192.168.0.100:80/objects/?object=TempSensor01&op=m&m=tempChanged&    
Ну и ниже привожу скетч Ардуинки при котором у меня это нифига не пашет ((
Тыкните где я ошибся.
Очень прошу, мозг уже закипает.
СпойлерПоказать

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


/**
*<a href="https://github.com/sochkasov/majordomo-arduino/blob/master/ArduinoControllerWebServer/ArduinoControllerWebServer.ino" rel="nofollow">https://github.com/sochkasov/majordomo-arduino/blob/master/ArduinoControllerWebServer/ArduinoControllerWebServer.ino</a>
* Контроллер-исполнительное устройство (к проекту <a href="http://smartliving.ru/" title="http://smartliving.ru/" rel="nofollow">http://smartliving.ru/</a>)
* Platform: Arduino UNO R3 + EthernetShield W5100
* IDE: Arduino 1.0.1
*
* исполнительные устройства (реле) подключены к Digital 3 - 9
*
* обращение по <a href="http://xx.xx.xx.xx/" title="http://xx.xx.xx.xx/" rel="nofollow">http://xx.xx.xx.xx/</a> выдаст справочную информацию по этому устройству (нужно для того, чтобы когда обращаешься
* по IP к устройству понять что это за контроллер и пр.)
*
* /state - состояние всех портов
* /command - выполнение команды
*         команды можно вызывать серией в 1 запросе. Например <a href="http://xx.xx.xx.xx/command?3=CLICK&4=CLICK&5=ON&6=OFF" title="http://xx.xx.xx.xx/command?3=CLICK&4=CLICK&5=ON&6=OFF" rel="nofollow">http://xx.xx.xx.xx/command?3=CLICK&4=CLICK&5=ON&6=OFF</a>
*         только длинна строки запроса не должна привышать maxLength
* /getdev - получить список всех устройст на 1-wire
*         формат вывода: 
*                T<номер устройства на шине>:<HEX адрес устройства>:<текущая температура в градусах цельсия>;[...]
*                (пример T0:1060CF59010800E3:24.06;T1:109ABE59010800FE:24.56;)
*
**/

#include <ethernet_comp.h>
#include <UIPClient.h>
#include <UIPEthernet.h>
#include <UIPServer.h>
#include <UIPUdp.h>
#include <SPI.h>
#include <Arduino.h>
#include "WebServer.h" // Webduino (<a href="https://github.com/sirleech/Webduino" title="https://github.com/sirleech/Webduino" rel="nofollow">https://github.com/sirleech/Webduino</a>)
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DHT.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xE4, 0xDE, 0x35 }; // MAC-адрес нашего устройства
byte ip[] = { 192, 168, 0, 101 };
byte subnet[] = { 255, 255, 255, 0 };
byte gateway[] = { 192, 168, 0, 1 };
byte dns_server[] = { 192, 168, 0, 1 };
// ip-адрес удалённого сервера
byte rserver[] = { 192, 168, 0, 100 };

// Настройки выходов
int startPin=4;
int endPin=9;
int val = 0;

// Настройка Аналоговых входов
int startAn=1;
int endAn=15;




// Pin controller for connection data pin DS18S20
#define ONE_WIRE_BUS 3 // Digital 2 pin Arduino (куда подключен выход с шины датчиков DS18X20
#define TEMPERATURE_PRECISION 9
#define DHTPIN 2 //Denis
#define DHTTYPE DHT11 //Denis 11
DHT Dht(DHTPIN, DHTTYPE);

#define VERSION_STRING "0.3"
#define COMPILE_DATE_STRING "2015-06-24"

P(Page_info) = "<html><head><title>Smart House " VERSION_STRING "</title></head><body>\n";
P(location_info) = "Smart House - Alice";
P(pin_info) = "A4 - Soil moisture sensor<br>D2 - DHT11<br>D3 - 1-wire (many DS18S20)<br>D4-output description<br>D5-output description<br>D6-output description";
P(version_info) = VERSION_STRING ". Compile date: " COMPILE_DATE_STRING;
P(help) = "http://xx.xx.xx.xx/command?PIN=HELP";
String url = String(25);
int maxLength=125; // Максимальная длинна строки запроса

#define delayClick 1000 // задержка при обычном CLICK
#define delayLClick 3000 // задержка при длинном LCLICK
#define MAX_COMMAND_LEN             (80) //10
#define MAX_PARAMETER_LEN           (80) //10
#define COMMAND_TABLE_SIZE          (8)
#define PREFIX ""

WebServer webserver(PREFIX, 80);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

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

#define NAMELEN 32
#define VALUELEN 32

char gCommandBuffer[MAX_COMMAND_LEN + 1];
char gParamBuffer[MAX_PARAMETER_LEN + 1];
long gParamValue;

typedef struct {
  char const    *name;
  void          (*function)(WebServer &server);
} command_t;

command_t const gCommandTable[COMMAND_TABLE_SIZE] = {
//  {"LED",     commandsLed, },
  {"HELP",     commandsHelp, }, // Выводит список комманд (вызов "http://xx.xx.xx.xx/command?8=HELP")
  {"ON",     commandsOn, }, // Устанавливает "1" на заданном цифровом порту (вызов "http://xx.xx.xx.xx/command?8=ON")
  {"OFF",     commandsOff, }, // Устанавливает "0" на заданном цифровом порту (вызов "http://xx.xx.xx.xx/command?8=OFF")
  {"STATUS",     commandsStatus, }, // Получить состояние цифрового порта (1 или 0) (вызов "http://xx.xx.xx.xx/command?8=STATUS"),
                                    // если вместо номера порта передать ALL (вызов "http://xx.xx.xx.xx/command?ALL=STATUS"), то получим состояние всех портов (Пример вывода P3=0;P4=0;P5=0;P6=0;P7=0;P8=1;P9=1;)
  {"CLICK",     commandsClick, }, // Кратковременная "1" на порту 1сек (время настраивается) (вызов "http://xx.xx.xx.xx/command?8=CLICK")
  {"LCLICK",     commandsLClick, }, // Кратковременная "1" на порту 3сек (время настраивается) (вызов "http://xx.xx.xx.xx/command?8=LCLICK")
  {"AN", commandsAn, },         // Запрос данных с An порта 
  {NULL,      NULL }
};

// Функция отправки HTTP-запроса на сервер
void sendHTTPRequest() {
Serial.println(gParamBuffer); 
}

/**********************************************************************************************************************
 *
 * Function:    cliProcessCommand
 *
 * Description: Look up the command in the command table. If the
 *              command is found, call the command's function. If the
 *              command is not found, output an error message.
 *
 * Notes:       
 *
 * Returns:     None.
 *
 **********************************************************************/
void cliProcessCommand(WebServer &server)
{
  int bCommandFound = false;
  int idx;

  gParamValue = strtol(gParamBuffer, NULL, 0);  // Convert the parameter to an integer value. If the parameter is empty, gParamValue becomes 0.
  for (idx = 0; gCommandTable[idx].name != NULL; idx++) {  // Search for the command in the command table until it is found or the end of the table is reached. If the command is found, break out of the loop.
    if (strcmp(gCommandTable[idx].name, gCommandBuffer) == 0) {
      bCommandFound = true;
      break;
    }
  }

  if (bCommandFound == true) {  // Если команда найдена (в массиве команд), то выполняем ее. Если нет - игнорируем
    (*gCommandTable[idx].function)(server);
  }
  else { // Command not found
    server.print("ERROR: Command not found");
  }
}


/**********************************************************************************************************************/
/* Обработчики команд */

void commandsAn(WebServer &server) {
  int anValue;
  if (gParamValue>=startAn && gParamValue<=endAn)
     anValue = analogRead(gParamValue);
     Serial.print("Analog");
     Serial.print(gParamValue);
     Serial.print("=");
     Serial.println(anValue);
} 

void commandsOn(WebServer &server) {
  if (gParamValue>=startPin && gParamValue<=endPin) {
     digitalWrite(gParamValue,HIGH);
  } else ErrorMessage(server);
}

void commandsOff(WebServer &server) {
  if (gParamValue>=startPin && gParamValue<=endPin) {
     digitalWrite(gParamValue,LOW);
  } else ErrorMessage(server);
}

void commandsClick(WebServer &server) {
  if (gParamValue>=startPin && gParamValue<=endPin) {
     digitalWrite(gParamValue,HIGH);     
     delay(delayClick);
     digitalWrite(gParamValue,LOW);
  } else ErrorMessage(server);
}

void commandsLClick(WebServer &server) {
  if (gParamValue>=startPin && gParamValue<=endPin) {
     digitalWrite(gParamValue,HIGH);     
     delay(delayLClick);
     digitalWrite(gParamValue,LOW);
  } else ErrorMessage(server);
}

void commandsStatus(WebServer &server) {
   if  (strcmp(gParamBuffer,  "ALL") == 0) { // выдать состояние всех пинов
          for(int i=startPin;i<=endPin;i++) {
            int st=digitalRead(i);
            char my_st[5];
            itoa(st,my_st,10);
            server.print("P");
            server.print(i);
            server.print("=");
            server.print(my_st);
            server.print(";");
          }
   } else { // выдать состояние только 1 пина
          if (gParamValue>=startPin && gParamValue<=endPin) {
            server.print("P");
            server.print(gParamValue);
            server.print("=");
            server.print(digitalRead(gParamValue));
          } else ErrorMessage(server);
    }
}

void commandsHelp(WebServer &server) {
  int idx;
  for (idx = 0; gCommandTable[idx].name != NULL; idx++) {
    server.print(gCommandTable[idx].name);
    server.print("<br>");
  }
}

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

void ErrorMessage(WebServer &server) {
    server.print("ERROR: This Pin is not configured for I/O");
}

/**********************************************************************************************************************
* Разбор запроса
**/
void parsedRequest(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  URLPARAM_RESULT rc;
  char name[NAMELEN];
  int  name_len;
  char value[VALUELEN];
  int value_len;

  server.httpSuccess();  // this line sends the standard "we're all OK" headers back to the browser

  /* if we're handling a GET or POST, we can output our data here.
     For a HEAD request, we just stop after outputting headers. */
  if (type == WebServer::HEAD)
    return;

  if (strlen(url_tail))
    {
    while (strlen(url_tail)) // Разбор URI на составные части (выборка параметров)
      {
      rc = server.nextURLparam(&url_tail, name, NAMELEN, value, VALUELEN);
      if (rc == URLPARAM_EOS) {
  //      server.printP(Params_end);
      }
       else // Получили параметр (name) и его значение (value)
        {
        // Выполняем команды
        strcpy (gCommandBuffer, value); // параметры (значение)
        strcpy (gParamBuffer, name); // команда
        cliProcessCommand(server);
        }
      }
    }
/*    
  if (type == WebServer::POST)
  {
    server.printP(Post_params_begin);
    while (server.readPOSTparam(name, NAMELEN, value, VALUELEN))
    {
      server.print(name);
      server.printP(Parsed_item_separator);
      server.print(value);
      server.printP(Tail_end);
    }
  }
*/

}

void get1wireDevices(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
   //TODO получить все устройства на шине и выдать на страницу
   int numberOfDevices = sensors.getDeviceCount();
   sensors.begin();
   for(int i=0;i<numberOfDevices; i++) {
      if(sensors.getAddress(Termometers, i))
      {
//          server.print("HTTP/1.1 200 OK");            // Denis wr
//          server.println("Content-Type: text/html");  // Denis wr
//          server.println("<!DOCTYPE HTML>");          // Denis wr
//          server.println("<html>");                   // Denis wr
          
          
          server.print("T");
          server.print(i);
//          server.print(":");                                  //Denis comment
          for (uint8_t i = 0; i < 8; i++) {
            if (Termometers[i] < 16); //server.print("0");      //Denis comment ???
//              server.print(Termometers[i], HEX);              //Denis comment
          }
          float tempC = sensors.getTempC(Termometers);
          server.print("-");
          server.print(tempC);
          server.print(" ");
          
//          server.println("<br />");                   // Denis wr
//          server.println("</html>");                  // Denis wr
//          server.println("HTTP/1.1 200 OK");          // Denis wr
//          client.println("HTTP/1.1 200 OK");          // Denis wr


// denis
// Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
//  float h = Dht.readHumidity();
  // Read temperature as Celsius
//  float t = Dht.readTemperature();
  // Read temperature as Fahrenheit
//server.print(h);
//server.print(t);
          
          
      } else {
            // not found
            server.print("NOT FOUND");
      }
    }
float h = Dht.readHumidity();
// Read temperature as Celsius
float t = Dht.readTemperature();
// Read temperature as Fahrenheit
// Печатаем температуру воздуха DHT11
server.print("ATI");
server.print(": ");
server.print(t);
server.print(" ");
// Печатаем влажность воздуха
server.print("HW");
server.print(": ");
server.print(h);
server.print(" ");

// Отправляем данный на МД
//int h2 = (h - (int)h) * 100; // выделяем дробную часть
//sprintf(gParamBuffer, "GET http://192.168.0.100:80/objects/?object=TempSensor01&op=m&m=tempChanged&h=%0d.%d", (int)h, abs(h2));
//sendHTTPRequest();
int t2 = (t - (int)t) * 100; // выделяем дробную часть
sprintf(gParamBuffer, "GET http://192.168.0.100:80/objects/?object=TempSensor01&op=m&m=tempChanged&t=%0d.%d", (int)t, abs(t2));
sendHTTPRequest();



//server.print(<br>);
/*
val = analogRead(4);
//server.print("Влажность почвы");
server.print("GND HUM");
server.print("-");
server.print(val);
server.print(" ");

// server.print(h);
// server.print(t);
    
*/    
    
    
    
}


void stateRequest(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  strcpy (gParamBuffer, "ALL");
  commandsStatus(server);
}

/**********************************************************************************************************************
* Генерация и вывод информации об устройстве
**/
void infoRequest(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  server.printP(Page_info);
  server.print("IP:");
  server.print(Ethernet.localIP());
  server.print("<br>Location:");
  server.printP(location_info);
  server.print("<hr>Pin info:<br>");
  server.printP(pin_info);
  server.print("<hr>Pin current state: ");
  strcpy (gParamBuffer, "ALL");
  commandsStatus(server);
  server.print("<hr><a href='/getdev'>1-wire devices</a>");
  server.print("<hr>Commands:<br>");
  commandsHelp(server);
  server.print("<hr><br>Version info: ");
  server.printP(version_info);
  server.print("<hr><br>Help info: ");
  server.printP(help);
  
  
}

/**********************************************************************************************************************
* Поиск устройств (датчиков температуры на шине 1-wire)
**/
void searchDevices() {
   Serial.print("Start search on 1-wire");
   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 < 8; 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() {
  // Для дебага будем выводить отладочные сообщения в консоль
  //TODO Убрать вывод в консоль "за дабаг" (т.е. вывод только если скимпилированно с поддержкой дебага)
  Dht.begin();
  Serial.begin(9600);
  Serial.println("Start");
  
  Ethernet.begin(mac, ip, dns_server, gateway, subnet); // Инициализируем Ethernet Shield

  webserver.setDefaultCommand(&infoRequest); // дефолтная страница вывода (информация о контроллере)
  webserver.addCommand("command", &parsedRequest); // команды
  webserver.addCommand("state", &stateRequest); // выдать состояния всех устройств
  webserver.addCommand("getdev", &get1wireDevices); // получить список устройств на 1-wire
  webserver.begin();
  
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  
  // Настройка портов на вывод
  for (int thisPin = startPin; thisPin <=endPin; thisPin++)  {
    pinMode(thisPin, OUTPUT);      
  }
  // Настройки 1-wire 
  sensors.begin(); // Инициализация шины 1-wire (для датчиков температуры)
  sensors.requestTemperatures(); // Перед каждым получением температуры надо ее запросить
  
  searchDevices();
  
}

/**********************************************************************************************************************/
void loop() {
  char buff[64];
  int len = 64;
  webserver.processConnection(buff, &len);  // process incoming connections one at a time forever
  }
Server: Raspberry Pi 3 B+
OS: Rasbian
annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: DHT11 > Arduino > MD

Сообщение annakin » Вс июн 28, 2015 9:29 pm

Неужели нету идей ?
Ребята подскажите что не так ?
Server: Raspberry Pi 3 B+
OS: Rasbian
Vit
Сообщения: 867
Зарегистрирован: Вт янв 17, 2012 12:31 pm
Благодарил (а): 121 раз
Поблагодарили: 78 раз

Re: DHT11 > Arduino > MD

Сообщение Vit » Вс июн 28, 2015 10:35 pm

annakin писал(а):Неужели нету идей ?
Ребята подскажите что не так ?
посмотрите пример скетча на вот этой странице http://majordomo.smartliving.ru/Main/ArduinoCode
annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: DHT11 > Arduino > MD

Сообщение annakin » Вт июн 30, 2015 5:47 pm

От выше описанной идей мне пришлось отказаться так как у меня неисправный интернет шилд.
Переделал Скетч под передачу данных по USB.
Скетч работает, вот что он передаёт мне в Сериал:

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

GET /objects/?object=TempSensor01&op=m&m=tempChanged&temp=26.0
Но Алиса в свойствах не видит данных от ардуины.
Алиса у меня работает на Debian.
Ардуинка подключена к УСБ.

У меня тут возник вопрос: Может надо както Алисе показать на каком USB порту работает Ардуинка ?

Кстате если кому понадобитса я буду современем допиливать Скетч для Ардуинки которая будет работать по УСБ.
За код не ругайте и тока начал работать с Ардуиной, а досих пор я кодил на Delphi с 2000 года.
Код собран с разных источников и пока в нем много лишнего, как разберусь как заставить Алису видеть данные с Ардуины буду дальше разрабатывать скетч.
SmartHouse_0_5_w_o_Eth.7z
(2.13 КБ) 198 скачиваний
Server: Raspberry Pi 3 B+
OS: Rasbian
annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: DHT11 > Arduino > MD

Сообщение annakin » Вт июн 30, 2015 6:23 pm

Почитав манулы везде описано о том как подключить Ардуину если Алиса установлена на Win32 но нету ничего по поводу семейства *nix
Server: Raspberry Pi 3 B+
OS: Rasbian
annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: DHT11 > Arduino > MD

Сообщение annakin » Вт июн 30, 2015 11:37 pm

Может где-то в настройках сервера Алисы надо прописать порт к которому подключён Arduino.
Кто наведёт на путь истинный.
Server: Raspberry Pi 3 B+
OS: Rasbian
annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: DHT11 > Arduino > MD

Сообщение annakin » Ср июл 01, 2015 9:35 am

Однако как я понял Алиса не кроссплатформенная.
Да она запускается под *Nix системы но полный её функционал реализован для Win32.
Server: Raspberry Pi 3 B+
OS: Rasbian
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: DHT11 > Arduino > MD

Сообщение sergejey » Ср июл 01, 2015 12:37 pm

annakin писал(а):Однако как я понял Алиса не кроссплатформенная.
Да она запускается под *Nix системы но полный её функционал реализован для Win32.
Это не так. Функционал системы отличается лишь некоторыми особенностями реализации, но не количеством возможностей.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
annakin
Сообщения: 130
Зарегистрирован: Пн окт 28, 2013 5:06 pm
Откуда: Молдова
Благодарил (а): 11 раз
Поблагодарили: 10 раз

Re: DHT11 > Arduino > MD

Сообщение annakin » Ср июл 01, 2015 12:51 pm

Я вам верю, тогда если это возможно объясните как мне заставить Алису увидить данные отправляемые с Ардуины ?
Server: Raspberry Pi 3 B+
OS: Rasbian
eygen
Сообщения: 393
Зарегистрирован: Чт сен 25, 2014 5:37 pm
Откуда: Екатеринбург
Благодарил (а): 25 раз
Поблагодарили: 52 раза

Re: DHT11 > Arduino > MD

Сообщение eygen » Ср июл 01, 2015 3:46 pm

ну так вначале проверь по логам прилетает ли что в систему, потом думай что там может быть не так.
Ответить