Arbuino Uno и enc28j60 с библиотекой EtherCard

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

Модератор: immortal

Ответить
TatyanaUhabova
Сообщения: 5
Зарегистрирован: Вт фев 03, 2015 2:56 pm
Благодарил (а): 0
Поблагодарили: 0

Arbuino Uno и enc28j60 с библиотекой EtherCard

Сообщение TatyanaUhabova » Вт фев 03, 2015 3:08 pm

Доброго времени суток! Пытаюсь передать данные с датчика температуры с помощью GET запроса на сервер...но не получается..не знаю, в чем ошибка, может кто-нибудь направит на путь истинный? код программы:

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

#include <EtherCard.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <math.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

#define BUFFER_SIZE 400
byte Ethernet::buffer[BUFFER_SIZE];
BufferFiller bfill;
EtherCard eth;
const char website[] PROGMEM = "127.0.0.1";
static const byte hisip[] = { 127,0,0,1 };

#define ONE_WIRE_BUS 7 // Digital 10 pin Arduino (куда подключен выход с шины датчиков DS18X20
#define TEMPERATURE_PRECISION 9

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Датчик температуры на (комнату)
DeviceAddress Termometer1 = { 0x28,0x38,0xB1,0x5A,0x05,0x00,0x00,0x26 };
// Для поиска
DeviceAddress Termometers;

float tempC;
int old_temperature1=0;
char ipbuff[16];

// called when the client request is complete
static void my_callback (byte status, word off, word len) {
  Serial.println(">>>");
  Ethernet::buffer[off+300] = 0;
  Serial.print((const char*) Ethernet::buffer + off);
  Serial.println("...");
}

void setup () {
 
  Serial.begin(9600);
  Serial.println(F("\n[webClient]"));
  
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println("Failed to access Ethernet controller");
  else
   Serial.println("Ethernet controller initialized");
   
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP failed")); 
    
  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip); 
  
  if (!ether.dnsLookup(website))
  Serial.println("DNS failed");
  
  ether.printIp("SRV: ", ether.hisip);

  Serial.println("Start");
  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");
  
  int numberOfDevices = sensors.getDeviceCount();
   sensors.begin();
   sensors.requestTemperatures();
   
   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 {
      }
    }
}

void loop() {
  //ether.packetLoop(ether.packetReceive());
  bfill = ether.tcpOffset();
  sensors.requestTemperatures(); 
  int valid_sensor=0;
  delay(1000); // задержка в 2 сек.  
  float current_temp1=0;
  float tempC = sensors.getTempC(Termometer1); // Получим температуру от датчика (или ошибку)
  if (tempC == DEVICE_DISCONNECTED) { 
    // Устройство отсоединено
    Serial.println("Termometer1 is DEVICE_DISCONNECTED"); } 
    else {
    // Устройство отдало реальное значение температуры (или осталось старое)
    Serial.print("T1: ");
    current_temp1 = tempC; // получаем температуру
    Serial.println(current_temp1);
    //word len = ether.packetReceive();   // check for ethernet packet
    //word pos = ether.packetLoop(len);   // check for tcp packet
    if ((old_temperature1!=(int)current_temp1) && (current_temp1<79) && (current_temp1>5)) {
    int temp1 = (current_temp1 - (int)current_temp1) * 100; // выделяем дробную часть
    sprintf((char *)Ethernet::buffer, "GET ?object=sensorRoom&op=m&m=tempChanged&t=%0d.%d", (int)current_temp1, abs(temp1)); 
    Serial.println((char *)Ethernet::buffer);
    ether.packetLoop(ether.packetReceive()); 
    ether.browseUrl(PSTR("/objects/"), (char *)Ethernet::buffer, NULL, my_callback);

 }
  old_temperature1=(int)current_temp1;
  }
}
Проблема думаю в строчках

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

ether.packetLoop(ether.packetReceive()); 
    ether.browseUrl(PSTR("/objects/"), (char *)Ethernet::buffer, NULL, my_callback);
если прописывать запрос непосредственно в браузере, то все работает...
класс и объекты на сервере созданы..
Jager
Сообщения: 708
Зарегистрирован: Сб авг 18, 2012 10:21 am
Благодарил (а): 26 раз
Поблагодарили: 183 раза

Re: Arbuino Uno и enc28j60 с библиотекой EtherCard

Сообщение Jager » Вт фев 03, 2015 3:47 pm

TatyanaUhabova писал(а):Доброго времени суток! Пытаюсь передать данные с датчика температуры с помощью GET запроса на сервер...но не получается..не знаю, в чем ошибка, может кто-нибудь направит на путь истинный? код программы:

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

sprintf((char *)Ethernet::buffer, "GET ?object=sensorRoom&op=m&m=tempChanged&t=%0d.%d", (int)current_temp1, abs(temp1));
 
Вот здесь http://smartliving.ru/Main/ArduinoCode написано что эта строка должна выглядеть так
sprintf(buf, "GET /objects/?object=sensorZal&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp2, abs(temp1));
Может в этом проблема?
MaksMS82
Сообщения: 422
Зарегистрирован: Ср сен 05, 2012 7:30 am
Откуда: Киров
Благодарил (а): 0
Поблагодарили: 70 раз
Контактная информация:

Re: Arbuino Uno и enc28j60 с библиотекой EtherCard

Сообщение MaksMS82 » Вт фев 03, 2015 4:47 pm

Тоже тут вспоминал как правильно отправлять данные на 8266 )) Нужно в конце строки GET запроса добавить " HTTP/1.1\r\nHost: homeserver\r\nUser-Agent: arduinko\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n"
TatyanaUhabova
Сообщения: 5
Зарегистрирован: Вт фев 03, 2015 2:56 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Arbuino Uno и enc28j60 с библиотекой EtherCard

Сообщение TatyanaUhabova » Вт фев 03, 2015 5:02 pm

MaksMS82 писал(а):Тоже тут вспоминал как правильно отправлять данные на 8266 )) Нужно в конце строки GET запроса добавить " HTTP/1.1\r\nHost: homeserver\r\nUser-Agent: arduinko\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n"
Не помогло...
TatyanaUhabova
Сообщения: 5
Зарегистрирован: Вт фев 03, 2015 2:56 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Arbuino Uno и enc28j60 с библиотекой EtherCard

Сообщение TatyanaUhabova » Вт фев 03, 2015 5:03 pm

Jager писал(а):
TatyanaUhabova писал(а):Доброго времени суток! Пытаюсь передать данные с датчика температуры с помощью GET запроса на сервер...но не получается..не знаю, в чем ошибка, может кто-нибудь направит на путь истинный? код программы:

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

sprintf((char *)Ethernet::buffer, "GET ?object=sensorRoom&op=m&m=tempChanged&t=%0d.%d", (int)current_temp1, abs(temp1));
Вот здесь http://smartliving.ru/Main/ArduinoCode написано что эта строка должна выглядеть так
sprintf(buf, "GET /objects/?object=sensorZal&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp2, abs(temp1));
Может в этом проблема?
Нет, проблема ,к сожалению ,не в этом..
electric
Сообщения: 309
Зарегистрирован: Вт сен 17, 2013 10:11 pm
Благодарил (а): 3 раза
Поблагодарили: 56 раз

Re: Arbuino Uno и enc28j60 с библиотекой EtherCard

Сообщение electric » Вт фев 03, 2015 8:53 pm

Я передаю состояния цифровых входов (датчики движения) функцией:

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

void sendHTTPRequest(String getString) {
  byte sd = stash.create();
  stash.print("GET /?");
  stash.print(getString);
  stash.print(" HTTP/1.1" "\r\n" "Host: 192.168.69.50" "\r\n" "\r\n");
  stash.save();
  Stash::prepare(PSTR("$H"), sd);
  session_id = ether.tcpSend();
  Stash::cleanup();
 }
В функцию передаю строку, где все датчики, сервер её "парсит" и получает значения всех переменных.
В начале скетча объявляю переменные:

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

Stash stash;
byte session_id;
Было: Majordomo v.0.6.0.b на Cubietruck. OS Armbian с переносом на HDD
Стало: ioBroker на Cubietruck OS Armbian + ZigBee Xiaomi + OWFS + BLE.
BeletskyAV
Сообщения: 9
Зарегистрирован: Пт фев 13, 2015 9:16 pm
Откуда: Москва
Благодарил (а): 0
Поблагодарили: 4 раза

Re: Arbuino Uno и enc28j60 с библиотекой EtherCard

Сообщение BeletskyAV » Пт фев 27, 2015 11:58 am

const char website[] PROGMEM = "127.0.0.1";
static const byte hisip[] = { 127,0,0,1 };

Это реальный адрес компа в сети?
Может типа так :

const char website[] PROGMEM = "192,168,1,203";
static byte hisip[] = { 192,168,1,203 };

Естественно 192,168,1,203 - надо поменять на IP своего компа в СЕТИ!
Ответить