Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение serghei » Пт сен 02, 2016 10:07 am

На работающем АМС вытащил езернет шнурок. Страница не доступа. (естественно) , через минуту воткнул обратно и через 8 секунд все поднялось как и было. Вообще то - да , библиотека переписана заново. Может есть смысл её использовать? пример рассмотрен в ветке " power monitor " ближе к концу. Там нужно заменить обращения к шилду. У того ,кто в этом понимает, заняло ровно 5 минут при мне.
За это сообщение автора serghei поблагодарил:
denis (Пн сен 12, 2016 9:37 pm)
Рейтинг: 1.16%
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
ghost13
Сообщения: 22
Зарегистрирован: Пт сен 02, 2016 8:01 pm
Благодарил (а): 2 раза
Поблагодарили: 2 раза

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение ghost13 » Пт сен 23, 2016 10:56 am

Подскажите как сделать чтобы при вызове команды CLICK посылалась команда в UART для включения MT1132


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

#include <Ethernet.h>
#include <SPI.h>
#include <Arduino.h>
#include "WebServer.h" // Webduino (https://github.com/sirleech/Webduino)
#include <OneWire.h>
#include <DallasTemperature.h>
#include <math.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <ardunoo.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xE4, 0xDE, 0x33 }; // MAC-адрес нашего устройства
byte ip[] = { 192, 168, 100, 222 };
byte subnet[] = { 255, 255, 255, 0 };
byte gateway[] = { 192, 168, 100, 1 };
byte dns_server[] = { 192, 168, 100, 1 };
// ip-адрес удалённого сервера
byte server[] = { 192, 168, 100, 6 }; //Адрес сервера MAJORDOMO
char buf[80];
char ipbuff[16];
#define RXpin 3
#define TXpin 4

ArduNoo noo(RXpin,TXpin);

 

EthernetClient rclient;
// Функция отправки HTTP-запроса на сервер
void sendHTTPRequest() {
  Serial.println(buf); 
  if (rclient.connect(server, 80)) { 
   rclient.print(buf);
   rclient.println(" HTTP/1.0");
   Serial.println("Send http get request");
   Serial.println(buf);
   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(1000);
   rclient.stop();
  } else {
   Serial.println("FAILED");     
  }
}

void sendAPin(int a) {
   int DPin = a-11;
if (digitalRead(a)==LOW){//если кнопка нажата и перемення flag равна 0 , то ... 
    digitalWrite(DPin,!digitalRead(DPin)); //Инвертируем выход
    Serial.print("Button: ");
    Serial.print(a);
    Serial.print(" Pin: ");
    Serial.print(DPin);
    Serial.print(" = ");    
    Serial.println(digitalRead(DPin));
    sprintf(buf, "GET /objects/?object=sensor222%i&op=m&m=st&status=%i", DPin, digitalRead(DPin));//Готовим запрос на сервер
    sendHTTPRequest();

}    
}


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

// Настройки входов
int startAPin=14;
int endAPin=18;


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

#define VERSION_STRING "0.2"
#define COMPILE_DATE_STRING "2015-11-14"

P(Page_info) = "<html><head><title>" COMPILE_DATE_STRING" " VERSION_STRING "</title></head><body>\n";
P(location_info) = "NA";
P(pin_info) = "D2 - 1-wire";
P(version_info) = VERSION_STRING " " COMPILE_DATE_STRING;

String url = String(25);
int maxLength=25; // Максимальная длинна строки запроса

#define delayClick 1000 // задержка при обычном CLICK
#define delayLClick 3000 // задержка при длинном LCLICK
#define MAX_COMMAND_LEN             (10)
#define MAX_PARAMETER_LEN           (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 )
  {NULL,      NULL }
};

/**********************************************************************************************************************
 *
 * 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("Command not found");
  }
}


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

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

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

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

void commandsLClick(WebServer &server) {
  if (gParamValue>=startPin && gParamValue<=endPin) {
     digitalWrite(gParamValue,LOW);
     noo.on();
     delay(delayLClick);
     digitalWrite(gParamValue,HIGH);
  } 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("This Pin is not 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();
   sensors.requestTemperatures();
   for(int i=0;i<numberOfDevices; i++) {
      if(sensors.getAddress(Termometers, i))
      {
          server.print("T");
          server.print(i);
          server.print(":");
          for (uint8_t i = 0; i < 8; i++) {
            if (Termometers[i] < 16) server.print("0");
              server.print(Termometers[i], HEX);
          }
          float tempC = sensors.getTempC(Termometers);
          server.print(":");
          server.print(tempC);
          server.print(";");
      } else {
            // not found
            server.print("NOT FOUND");
      }
    }
}


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>State: ");
  strcpy (gParamBuffer, "ALL");
  commandsStatus(server);
  server.print("<br><a href='/getdev'>getdev</a>");
  server.print("<hr>Commands:<br>");
  commandsHelp(server);
  server.print("<hr>Version: ");
  server.printP(version_info);
  
}


/**********************************************************************************************************************
* Поиск устройств (датчиков температуры на шине 1-wire)
**/
void searchDevices() {
   Serial.println("Search on 1-wire");
   int numberOfDevices = sensors.getDeviceCount();
   sensors.begin();
   
   for(int i=0;i<numberOfDevices; i++) {
      if(sensors.getAddress(Termometers, i))
      {
          Serial.print("Device ");
            Serial.print(i, DEC);
          Serial.print(" 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(" 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 Убрать вывод в консоль "за дабаг" (т.е. вывод только если скимпилированно с поддержкой дебага)
  Serial.begin(9600);
  noo.channel(5);
  Serial.println("Start");
  Ethernet.begin(mac, ip, dns_server, gateway, subnet); // Инициализируем Ethernet Shield
  sprintf(buf, "GET /objects/?script=controller_widget&dev=%u.%u.%u.%u&code=start",ip[0], ip[1], ip[2], ip[3]);//Готовим запрос на сервер
  sendHTTPRequest();  

  webserver.setDefaultCommand(&infoRequest); // дефолтная страница вывода (информация о контроллере)
  webserver.addCommand("command", &parsedRequest); // команды
  webserver.addCommand("state", &stateRequest); // выдать состояния всех устройств
  webserver.addCommand("getdev", &get1wireDevices); // получить список устройств на 1-wire
  webserver.begin();
  
  Serial.print("IP ");
  Serial.println(Ethernet.localIP());
  
    // Настройка портов
  for (int thisAPin = startAPin; thisAPin <=endAPin; thisAPin++)  {
    pinMode(thisAPin, INPUT);      
  }
    // Настройка портов
  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;
int r;
r=Serial.read();
 if(r<='9' && r>='0'){ // change channel
    noo.channel(r-'0');
    return;
    }
   switch(r){
  case 'n': //on
    noo.on();
    break;
  case 'f': //off
    noo.off();
    break;
  case 'x': // toggle
    noo.onoff();
    break;
  case 'c': //print current channel
    Serial.print(noo.channel());
    break;
  case 'b': //bind
    noo.bind();
    break;
  case 'u': //unbind
    noo.unbind();
    break;
  case '+':
    noo.slow_on();
    break;
  case '-':
    noo.slow_off();
    break;
  case '!':
    noo.slow_onoff();
    break;

  case 'r': // record scene!
    noo.record_scene();
    break;
  case 'R': // run scene!
    noo.run_scene();
    break;

  case 's': // toggle 3-rd channel
    noo.onoff(3);
    break;
  }
/**********************************************************************************************************************

/* Работа с выключателями
*/
          for(int i=startAPin;i<=endAPin;i++) {
 
            int st=digitalRead(i);
            char my_st[5];
            itoa(st,my_st,10);
             if (st==1)
             {
                sendAPin(i);
             }
          }

  webserver.processConnection(buff, &len);  // process incoming connections one at a time forever
}
 
cahek2202
Сообщения: 23
Зарегистрирован: Пт окт 07, 2016 7:35 pm
Откуда: Москва
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение cahek2202 » Пн окт 31, 2016 10:09 pm

Добрый день! Надеюсь на помощь знатоков ардуино. Такая проблема - не могу получить значение температуры в МДМ при отправке с ардуино. Получаю значение "?". Проблема в функции Sprintf() возможно.
Функция отправки:

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

void sendReqSensorFloatM(char object[], float value) {
  sprintf(buf, "GET /objects/?object=%s&op=m&m=update&v=%F HTTP/1.0", object, value);
  //sendMajorRequest();
  Serial.println(buf);
  sendHttpRequest(MAJOR_IP, MAJOR_PORT, mclient);
}
Вызов функции:

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

char majorTempObject[] = "Temp";
float nrf1Temp1;
void majordomoMegaLive() {
  if (cycle1m) {
    sendRequestM(majorMegaObject, 1);
    sendReqSensorFloatM(majorTempObject, nrf1Temp1);
    Serial.println(nrf1Temp1);
    checkEvent(&prevEventMegaLive);
  }
}
На мой взгляд все вроде правильно и должно работать, но в монитор порта выводит запрос
"GET /objects/?object=Temp&op=m&m=update&v=? HTTP/1.0"
хотя следующей же строкой идет вывод температуры и выводит значение типа "23.20"
Может кто подскажет в чем может быть проблема?
artemon25
Сообщения: 112
Зарегистрирован: Чт авг 25, 2016 10:33 pm
Благодарил (а): 15 раз
Поблагодарили: 6 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение artemon25 » Ср ноя 23, 2016 11:10 pm

Всем здрасьте начну с того что я не очень силён в написание скетчей но очень много хочу знать . я взял скетч с этого поста и добавил туда DHT22 и фоторезистор MLG5516B получился вот такой скетч

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

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

**/


#include <Ethernet.h>
#include <SPI.h>
#include <Arduino.h>
#include "WebServer.h" // Webduino (https://github.com/sirleech/Webduino)
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DHT.h>


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

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


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

#define VERSION_STRING "0.1"
#define COMPILE_DATE_STRING "2012-09-18"

// Pin controller for data DTH11
#define DHTPIN 3 // Digital 3 pin Arduino (куда подключен выход с шины датчиков DTH11)
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);

const int pinPhoto = A0;
int raw = 0;

P(Page_info) = "<html><head><title>smartliving.ru controller " VERSION_STRING "</title></head><body>\n";
P(location_info) = "underground server room";
P(pin_info) = "D2 - 1-wire (many DS18S20) <br>D3 - DTH11 sensor <br>D4-light undergroung";
P(version_info) = VERSION_STRING ". Compile date: " COMPILE_DATE_STRING;

String url = String(25);
int maxLength=25; // Максимальная длинна строки запроса

#define delayClick 1000 // задержка при обычном CLICK
#define delayLClick 3000 // задержка при длинном LCLICK
#define MAX_COMMAND_LEN             (10)
#define MAX_PARAMETER_LEN           (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 )
  {NULL,      NULL }
};

/**********************************************************************************************************************
 *
 * 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 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("T");
          server.print(i);
          server.print(":");
          for (uint8_t i = 0; i < 8; i++) {
            if (Termometers[i] < 16) server.print("0");
              server.print(Termometers[i], HEX);
          }
          float tempC = sensors.getTempC(Termometers);
          server.print(":");
          server.print(tempC);
          server.print(";");
      } else {
            // not found
            server.print("NOT FOUND");
      }
    }
  // 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();
  float t = dht.readTemperature();

 // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
  server.print("DHT NOT FOUND");
  } else {
    server.print("Humidity: "); 
    server.print(h);
    server.print(" %\t");
    server.print("Temperature: "); 
    server.print(t);
    server.println(" *C");
  }
}


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);
  
}

/**********************************************************************************************************************
* Поиск устройств (датчиков температуры на шине 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
      }
    }
  float h = dht.readHumidity();
  float t = dht.readTemperature();
    if (isnan(t) || isnan(h)) {
  Serial.print("DHT NOT FOUND");
  } else {
    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" *C");
  }
}


/**********************************************************************************************************************/
void setup() {
  // Для дебага будем выводить отладочные сообщения в консоль
  //TODO Убрать вывод в консоль "за дабаг" (т.е. вывод только если скимпилированно с поддержкой дебага)
  Serial.begin(9600);
  pinMode( pinPhoto, INPUT );
  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();
  // Инициализация DTH11
  dht.begin();
  
}

/**********************************************************************************************************************/
void loop() {
  char buff[64];
  int len = 64;
  webserver.processConnection(buff, &len);  // process incoming connections one at a time forever
  raw = analogRead( pinPhoto );
  Serial.println( raw );
  delay(5000);
}
в принципе всё скомпилировалось и залилось на UNO и в мониторе порта есть данные с ds1820, dht22, и через каждые 5 секунд обновляется данные с фоторезистора а теперь вопрос на странице в броузере 192.168.1.120 есть данные с ds1820 и dht22 а с фоторезистора нигде нет может както надо вызвать эти данные.
нужна помощь и подсказки что делать дальше
заранее всем огромное спасибо
homer57
Сообщения: 2
Зарегистрирован: Ср фев 15, 2017 10:14 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение homer57 » Вс фев 26, 2017 8:06 pm

Добрый вечер , беру ваш скетч для примера пробую заливать на arduino и получаю только ошибку
СпойлерПоказать
Arduino: 1.8.2 Hourly Build 2017/01/25 04:33 (Windows 7), Плата:"Arduino/Genuino Uno"

C:\Users\sid\Desktop\arduino-nightly\arduino-builder -dump-prefs -logger=machine -hardware C:\Users\sid\Desktop\arduino-nightly\hardware -tools C:\Users\sid\Desktop\arduino-nightly\tools-builder -tools C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr -built-in-libraries C:\Users\sid\Desktop\arduino-nightly\libraries -libraries C:\Users\sid\Documents\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=0X2341_0X0043 -ide-version=10802 -build-path C:\Users\sid\AppData\Local\Temp\arduino_build_918534 -warnings=all -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr -verbose C:\Users\sid\Documents\Arduino\sketch_feb15c\sketch_feb15c.ino
C:\Users\sid\Desktop\arduino-nightly\arduino-builder -compile -logger=machine -hardware C:\Users\sid\Desktop\arduino-nightly\hardware -tools C:\Users\sid\Desktop\arduino-nightly\tools-builder -tools C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr -built-in-libraries C:\Users\sid\Desktop\arduino-nightly\libraries -libraries C:\Users\sid\Documents\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=0X2341_0X0043 -ide-version=10802 -build-path C:\Users\sid\AppData\Local\Temp\arduino_build_918534 -warnings=all -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr -verbose C:\Users\sid\Documents\Arduino\sketch_feb15c\sketch_feb15c.ino
Using board 'uno' from platform in folder: C:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr
Using core 'arduino' from platform in folder: C:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr
Detecting libraries used...
"C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10802 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\cores\arduino" "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\variants\standard" "C:\Users\sid\AppData\Local\Temp\arduino_build_918534\sketch\sketch_feb15c.ino.cpp" -o "nul"
"C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10802 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\cores\arduino" "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\variants\standard" "-IC:\Users\sid\Documents\Arduino\libraries\Ethernet\src" "C:\Users\sid\AppData\Local\Temp\arduino_build_918534\sketch\sketch_feb15c.ino.cpp" -o "nul"
"C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10802 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\cores\arduino" "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\variants\standard" "-IC:\Users\sid\Documents\Arduino\libraries\Ethernet\src" "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\libraries\SPI\src" "C:\Users\sid\AppData\Local\Temp\arduino_build_918534\sketch\sketch_feb15c.ino.cpp" -o "nul"
"C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10802 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\cores\arduino" "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\variants\standard" "-IC:\Users\sid\Documents\Arduino\libraries\Ethernet\src" "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\libraries\SPI\src" "-IC:\Users\sid\Documents\Arduino\libraries\Webduino-master" "C:\Users\sid\AppData\Local\Temp\arduino_build_918534\sketch\sketch_feb15c.ino.cpp" -o "nul"
"C:\Users\sid\Desktop\arduino-nightly\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10802 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\cores\arduino" "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\variants\standard" "-IC:\Users\sid\Documents\Arduino\libraries\Ethernet\src" "-IC:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\libraries\SPI\src" "-IC:\Users\sid\Documents\Arduino\libraries\Webduino-master" "C:\Users\sid\AppData\Local\Temp\arduino_build_918534\sketch\sketch_feb15c.ino.cpp" -o "C:\Users\sid\AppData\Local\Temp\arduino_build_918534\preproc\ctags_target_for_gcc_minus_e.cpp"
C:\Users\sid\Documents\Arduino\sketch_feb15c\sketch_feb15c.ino:31:21: fatal error: OneWire.h: No such file or directory

#include <OneWire.h>

^

compilation terminated.

Несколько библиотек найдено для "Ethernet.h"
Используется: C:\Users\sid\Documents\Arduino\libraries\Ethernet
Не используется: C:\Users\sid\Desktop\arduino-nightly\libraries\Ethernet
Используем библиотеку Ethernet версии 1.1.1 из папки: C:\Users\sid\Documents\Arduino\libraries\Ethernet
Используем библиотеку SPI версии 1.0 из папки: C:\Users\sid\Desktop\arduino-nightly\hardware\arduino\avr\libraries\SPI
Используем библиотеку Webduino-master в папке: C:\Users\sid\Documents\Arduino\libraries\Webduino-master (legacy)
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
kabir
Сообщения: 3
Зарегистрирован: Ср апр 12, 2017 8:19 am
Благодарил (а): 0
Поблагодарили: 0

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение kabir » Ср апр 12, 2017 12:04 pm

Доброго дня, подскажите как получить температуру в MDM

Orange Pi (DIET Pi MDM)
Arduino UNO (https://github.com/sochkasov/majordomo- ... Server.ino)

Заранее спасибо...
Аватара пользователя
woow
Сообщения: 821
Зарегистрирован: Пн июл 04, 2016 8:46 am
Откуда: Mazeikiai
Благодарил (а): 125 раз
Поблагодарили: 46 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение woow » Ср апр 12, 2017 1:51 pm

homer57 писал(а):Добрый вечер , беру ваш скетч для примера пробую заливать на arduino и получаю только ошибку

compilation terminated.

Несколько библиотек найдено ....
Я далеко не спец, но у вас полный бардак с библиотеками. Наведите порядок с библиотеками, расположите их тем где сам скечь, укажите компилятору где его основная папка и т.д.
Raspberry Pi 3B+
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение Amarok » Ср апр 26, 2017 8:52 am

А можно вместо W5100 использовать ESP8266? Если это кто-то уже сделал, то как? Хочется пример глянуть.
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
Аватара пользователя
woow
Сообщения: 821
Зарегистрирован: Пн июл 04, 2016 8:46 am
Откуда: Mazeikiai
Благодарил (а): 125 раз
Поблагодарили: 46 раз

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение woow » Ср апр 26, 2017 10:20 am

Amarok писал(а):А можно вместо W5100 использовать ESP8266? Если это кто-то уже сделал, то как? Хочется пример глянуть.
смотря что вам нужно. В место Arduino+W5100, ствите ESP8266 и все проблемы решается, тем более, что ESP гораздо мощнее, но это по Wi-Fi, а в этой ветке речь, о проводной системе.
Raspberry Pi 3B+
Neocivic
Сообщения: 72
Зарегистрирован: Вс апр 23, 2017 5:27 pm
Благодарил (а): 25 раз
Поблагодарили: 2 раза

Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем

Сообщение Neocivic » Ср апр 26, 2017 11:07 pm

Здравствуйте, подскажите, что за ошибка?
C:\Users\Алексей\Documents\Arduino\ControlTxt\ControlTxt.ino:8:21: fatal error: BSeries.h: No such file or directory

compilation terminated.

Несколько библиотек найдено для "OneWire.h"
Используется: C:\Users\Алексей\Documents\Arduino\libraries\OneWire
Не используется: C:\Users\Алексей\Documents\Arduino\libraries\OneWire-master
exit status 1
Ошибка компиляции для платы Arduino/Genuino Mega or Mega 2560.
Ответить