Помогите разобраться.

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

Здравствуйте! В общем пытаюсь вывести данные из Arduino в сеть. Использую библиотеку EtherCard, все вроде бы получилось, но есть одна проблемка. Есть на сервере скрипт, он принимает GET данные и записывает их в базу данных. У меня есть переменная Temperature, но я не знаю как ее воткнуть в этот код, после value=

ether.browseUrl(PSTR("/arduino.php?value="), "bar", website, my_callback);

Можете подсказать, как её выводить?

Сам скетч:

#include <EtherCard.h>
#include <math.h>
float Thermometer(float RawADC) {
  float Temperature;
  Temperature = 1.25*(480 - RawADC);
  return Temperature;
}
// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
static uint32_t timer;

const char website[] PROGMEM = "example.com";

// 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();
  Serial.println("----------------------");
}

void setup () {
  Serial.begin(9600);
  Serial.println("[Arduino Client]");

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller.");
  if (!ether.dhcpSetup())
    Serial.println("Failed DHCP.");

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GATEWAY:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  

  if (!ether.dnsLookup(website))
    Serial.println("Failed DNS.");
    
  ether.printIp("SERVER: ", ether.hisip);
}

void loop () {
  float Temperature;
  Temperature = Thermometer(analogRead(5));
  ether.packetLoop(ether.packetReceive());
  if (millis() > timer) {
    timer = millis() + 5000;
    ether.browseUrl(PSTR("/arduino.php?value="), "bar", website, my_callback);
  }
}

 

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

И еще вопрос, что это за строка: "bar" ?

ether.browseUrl(PSTR("/arduino.php?value="), "bar", website, my_callback);

За что она отвечает? (:

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

VaDoSiQ пишет:

как ее воткнуть в этот код, после value=

ether.browseUrl(PSTR("/arduino.php?value="), "bar", website, my_callback);

Именно в этот - никак.

VaDoSiQ пишет:

Можете подсказать, как её выводить?

Заведите буфер, скопируйте туда "/arduino.php?value=" (или изначально её там держите), а потом прикопируйте в хвост свою температуру. Например, если температура - целое, то можно сделать примерно так:

// Это делается один раз в начале. Знаков вопроса столько, чтобы любая температура поместилась
char url[] = "/arduino.php?value=??????";
char * temperatureHolder = strchr(url, '=') + 1;

// Всякий раз, когда нужно сделать запрос, можно делать так
int temperature = 36;
itoa(temperature, temperatureHolder , 10));
// после этого можно пользоваться url для отправки запроса

VaDoSiQ пишет:

И еще вопрос, что это за строка: "bar" ?

Откройте файл библиотеки и посмотрите какие параметры у функции browseUrl. Там всё написано.

 

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

ЕвгенийП пишет:

// Всякий раз, когда нужно сделать запрос, можно делать так
int temperature = 36;
itoa(temperature, temperatureHolder , 10));
// после этого можно пользоваться url для отправки запроса

Вы не поняли, мне не нужно указывать температуру в ручную. Мне нужно что бы она сама записывалась.

Допустим переменная :

float Temperature;

Должна передавать значение, которое содержится в функции:

float Thermometer(float RawADC) {
  float Temperature; 
  Temperature = 1.25*(480 - RawADC);
  return Temperature;
}

И уже тогда записывать на сервер. Если можете, приведите пример в моём коде. Заранее благодарю.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

VaDoSiQ пишет:

ЕвгенийП пишет:

// Всякий раз, когда нужно сделать запрос, можно делать так
int temperature = 36;
itoa(temperature, temperatureHolder , 10));
// после этого можно пользоваться url для отправки запроса

Вы не поняли, мне не нужно указывать температуру в ручную. Мне нужно что бы она сама записывалась.

Это Вы не поняли. В примера всехда пишется присваивание, т.к. откуда мне знать где, как с каого датчика Вы берёте температуру?

Строку 2 моего примера следует читать как "откудато, с супер-датчика, взята температура и присвоена переменной temperature. Дальше я показываю Вам как её в буфер запихать. Вам ведь это надо, чтобы она в буфере оказалась, так?

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

ЕвгенийП пишет:

Строку 2 моего примера следует читать как "откудато, с супер-датчика, взята температура и присвоена переменной temperature. Дальше я показываю Вам как её в буфер запихать. Вам ведь это надо, чтобы она в буфере оказалась, так?

Ну это пока не датчик, а обычная термопара, с которой мы сделали градусник, подобрав правильную формулу и коэффициент.

А данные я получаю с 5 аналогового выхода)

Temperature = Thermometer(analogRead(5));

 

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

Не получается реализовать. Не пойму ничего(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, на здоровье. Вы ведь в первом посте спросили как запихать Вашу температуру в строку, чтобы сформировать запрос. Я и показываю Вам как её запихать в строку. А откуда Вы её взяли - как разница?

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

ЕвгенийП пишет:

Да, на здоровье. Вы ведь в первом посте спросили как запихать Вашу температуру в строку, чтобы сформировать запрос. Я и показываю Вам как её запихать в строку. А откуда Вы её взяли - как разница?

Извините, у Вас есть профили в социальных сетях, хотелось бы с Вами пообщаться на прямую как говорится (:

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нету

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

Вот Вы выше приводили решение. Не могли бы Вы показать, как реализовать его именно в этом коде? :)

#include <EtherCard.h>
#include <math.h>
float Thermometer(float RawADC) {
  float Temperature;
  Temperature = 1.25*(480 - RawADC);
  return Temperature;
}
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
static uint32_t timer;

const char website[] PROGMEM = "example.com";

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();
  Serial.println("----------------------");
}

void setup () {
  Serial.begin(9600);
  Serial.println("[Arduino Client]");

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller.");
  if (!ether.dhcpSetup())
    Serial.println("Failed DHCP.");

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GATEWAY:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  

  if (!ether.dnsLookup(website))
    Serial.println("Failed DNS.");
    
  ether.printIp("SERVER: ", ether.hisip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  if (millis() > timer) {
    timer = millis() + 50000;
    ether.browseUrl(PSTR("/arduino.php?value="), "bar", website, my_callback);
  }
}

Ну вообще что то не пойму (:

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Правильно ли я понял, что Вам надо не помочь разобраться, а помочь исправить чужой код, которого Вы не понимаете?

В общем так, я не буду разбираться во всём коде, помогу лишь вствить формирование строки - запроса о чём Вы и просили изначально. Если с этим всё в порядке, то дальше сами.

Перед строкой 46 Вам надо запросить температуру. Так и делаете.

float temperature = Thermometer();
Serial.print("Temperature: ");
Serial.println(temperature);

Печать нужна для проверки, чтобы убедиться. что температура пришла адекватная.

Дальше Вам надо запихать её в буфер. Пихаете примерно так, как я показывал, только раз уж это float, то вместо itoa испольуете dtostrf.

char url[] = "/arduino.php?value=???????";
char * temperatureHolder = strchr(url, '=') + 1;
dtostrf(temperature, -6, 2, temperatureHolder);
Serial.print("URL=");
Serial.println(url);  // для контроля, что получилось

ну, и, наконец, саму строку 46 заменяеете на такую же, но с использование буфера url

ether.browseUrl(url, "bar", website, my_callback);

если в печатях, что я вставлял всё печатается нормально, значит помещение температуры в буфер работает правильно. Если при этом не работает скетч, ищите проблему в других местах.

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

Вот что получается

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это что?

Вы покажите монитор порта, куда выводятся печати, которые я вставлял в код. Только лучше копипастой, а не картинкой

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017
#include <EtherCard.h>
#include <math.h>
float Thermometer(float RawADC) {
  float Temperature;
  Temperature = 1.25*(480 - RawADC);
  return Temperature;
}
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
static uint32_t timer;

const char website[] PROGMEM = "example.com";
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();
  Serial.println("----------------------");
}

void setup () {
  Serial.begin(9600);
  Serial.println("[Arduino Client]");

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller.");
  if (!ether.dhcpSetup())
    Serial.println("Failed DHCP.");

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GATEWAY:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  

  if (!ether.dnsLookup(website))
    Serial.println("Failed DNS.");
  ether.printIp("SERVER: ", ether.hisip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  if (millis() > timer) {
    timer = millis() + 5000;
    float Temperature = Thermometer(analogRead(5));
    Serial.print("Temperature: ");
    Serial.println(Temperature);
      char url[] = "/arduino.php?value=???????";
  char * TemperatureHolder = strchr(url, '=') + 1;
  dtostrf(Temperature, -6, 2, TemperatureHolder);
  Serial.print("URL=");
  Serial.println(url);  // для контроля, что получилось
    ether.browseUrl(url, "bar", website, my_callback);

  }
}

Правильно я сделал?

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

ЕвгенийП пишет:

Это что?

Вы покажите монитор порта, куда выводятся печати, которые я вставлял в код. Только лучше копипастой, а не картинкой

[Arduino Client]
IP:  192.168.1.5
GATEWAY:  192.168.1.1
DNS: 192.168.1.1
SERVER: 185.50.25.25
Temperature: 181.25
URL=/arduino.php?value=181.25
----------------------
HTTP/1.1 400 Bad Request
Server: nginx-reuseport/1.11.4
Date: Mon, 06 Feb 2017 11:47:58 GMT
Content-Type: text/html
Content-Length: 183
Connection: Close
 
 
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

URL=/arduino.php?value=181.25 - Это у Вас полный URL?

Это где потеряли - http://185.50.25.25/arduino.php?value=181.25

Вот к примеру этот пост доступен и так http://78.46.72.113/forum/programmirovanie/pomogite-razobratsya-5#commen...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, вот, видите. Вы о чём спрашивали в первом посте?

VaDoSiQ пишет:

У меня есть переменная Temperature, но я не знаю как ее воткнуть в этот код, после value=

ether.browseUrl(PSTR("/arduino.php?value="), "bar", website, my_callback);

Можете подсказать, как её выводить?

Теперь смотрим на Ваш монитор:

VaDoSiQ пишет:

Temperature: 181.25
URL=/arduino.php?value=181.25

Ваша переменная temperature вставилась в url, как Вы просили? Вставилась! Причём правильно вставилась.

Стало быть вопрос из Вашего первого поста решён. Так? Поздравляю.

Других вопросов от Вас не поступало.

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

У меня идет запрос на доменное имя, а не на IP,  так как он не прилинкован.

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

Спасибо Вам большое, со всем разобрался. Всё работает. Без Вас бы ничего не получилось. (:

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Евгений Петрович, это Вам или мне?  (насчёт спасибо)

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

ua6em пишет:

Евгений Петрович, это Вам или мне?  (насчёт спасибо)

Евгению (:

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Вот так всегда - "кто бы что бы не освоил, а Никита всё присвоил" )))