Работа с Ethernet

qwr
qwr аватар
Offline
Зарегистрирован: 17.11.2014

Всем привет. :) Я новичек в Ардуино, играю с ней 4-й день. :) Появилась проблема, с которой не могу справиться сам.

У меня Ethernet модуль ENC28J60, для работы с ним я использую библиотеку UIPEthernet. Её работа идентична стандартной библиотеке Ethernet. Все стандартные скетчи для Ehernet работают, если заменить <Ethernet.h> на <UIPEthernet.h>.

Я хочу сделать, что-бы Ардуино отправляла на сервер данные с датчиков, а с сервера забирала настройки. Проблема в том, что по отдельности отправка данных и забор настроек работают (в разных скетчах). А в одном сделать у меня это не получается. Я уже несколько десятков раз перечитал весь код от начала до конца и не вижу где кроется проблема.

Помогите пожалуйста найти где я ошибся. Привожу код моего скетча:

#include <UIPEthernet.h>
#include <DHT.h>

#define DHTPIN 2 
#define DHTTYPE DHT22

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(192,168,1,1);  // Server IP
IPAddress ip(192,168,1,2); // Arduino IP

DHT dht(DHTPIN, DHTTYPE); // Init of DHT22
EthernetClient client;
String data;

void setup() {
  
  Serial.begin(57600);
  Serial.println("[Web Client]");
  
  dht.begin();
  Ethernet.begin(mac, ip);
  
  delay(1000);
}

void loop(){
  get_sensors();
}

int get_sensors() {
  
  delay(2000); // Wait a few seconds between measurements.
  
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    get_sensors();
  }
    
  data = String("temp=") + t + String("&hum=") + h;
  connection();
}

int connection() {
  
  client.stop();

  if (client.connect(server, 80)) {
    
    Serial.println("connected");
    
    post_data();
    get_settings();
    Serial.println();  
    
  } else {
    Serial.println("connection failed");
    connection();
  }

}

int post_data() {
  
  Serial.println("Posting data");
    
  client.println("POST /save_data.php HTTP/1.1");
  client.println("Host: 192.168.1.1");
  client.println("Content-Type: application/x-www-form-urlencoded"); 
  client.print("Content-Length: ");
  client.println(data.length());
  client.println();
  client.println(data);
  client.println("Connection: close");
  client.println();
  
  Serial.println("Data sended.");
}

int get_settings() {
  
  Serial.println("Getting Settings");
  client.println("GET /get_settings.php?device=arduino HTTP/1.1");
  client.println("Host: 192.168.1.1");
  client.println("Connection: close");
  client.println();

  responce();
}

int responce() {
  
  Serial.println("Waiting responce...");
  
  if (client.connected()) {
    if (client.available()) {
      Serial.println(client.available());
      char c = client.read();
      Serial.print(c);
      Serial.println();
      return true;
    }
    responce();
  }
}

Если вы подскажете как я могу оптимизировать мой код, буду крайне признателен! :)

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

На чем у вас сервер развернут?

qwr
qwr аватар
Offline
Зарегистрирован: 17.11.2014

На данный момент для тестирования использую сервер на своем ноуте. ( Windows, OpenServer ).

В рабочей системе планирую использовать хостинг. Для того что бы панель управления была доступна не зависимо от доступности самой Ардуино, так как на даче (где будет размещена система) у меня не самый стабильный интернет.

P.S.: попробовал обернуть каждый из запросов в отдельное подключение, с последующим дисконнектом. Вроде заработало. Но при попытке получить данные с сервера, приходит одна буква "H".

Возможно я что-то не так делаю? В каком формате лучше что-бы серевер отдавал данные Ардуино Json? Xml? А если всего 2 переменных нужно передать?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Мне тяжело советовать для ENC28J60. Я забыл о ней, и вам советую.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

Gippopotam пишет:

Мне тяжело советовать для ENC28J60. Я забыл о ней, и вам советую.

а чтож вместо нее можно использовать на платформе ардуино?

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

у меня этим занимается ESP8266 по wi-fi подключается к инету и отправляет на сервер строку, так же можно ответ очень просто вернуть(мне пока не надо) а на чем ответ будете писать это не важно, я юы сделал на php, мне проще

а самый прикол что я перепрошил ESP и ардуинка отправляет только строку которую надо послать на север. и больше отправкой не занимается

работает без сбоев, переподключается к инету если отвалилась связь

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

можно пример привести, схему-скетч?

можно в другой теме.. спасибо.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

qwr пишет:
Я новичек в Ардуино, играю с ней 4-й день.
Не используй бесконечные рекурсии.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016