вывод информации на веб страницу+ get запрос на сервер

faustorg
Offline
Зарегистрирован: 19.04.2019

sadman41 пишет:

Никто не виноват в том, что Вы пытаетесь сделать посложнее, чем умеете.

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

faustorg
Offline
Зарегистрирован: 19.04.2019

andycat пишет:
faustorg пишет:

client.println(url);

насколько я понимаю у ethercard такая команда не прокатит... все сложнее(

Да, все не просто, читаем литературу и документацию....

читаем, ломаем голову, пробуем, пытаемся разобратся. В одном правы были люди, на эту библиотеку не так уж и много примеров (особенно хорошо закоментенных) чтоб можно было разобратся так сказать на "живом" коде что да как... 

sadman41
Offline
Зарегистрирован: 19.10.2016

faustorg пишет:

к тому же по отзывам именно она наиболее стабильно работающая

По сравнению с чем? И в каких случаях она более стабильна? 

Просто я знаю, что у многих самодельщиков "самая стабильная" - это та, с которой они справились.

faustorg
Offline
Зарегистрирован: 19.04.2019

sadman41 пишет:

По сравнению с чем? И в каких случаях она более стабильна? 

Просто я знаю, что у многих самодельщиков "самая стабильная" - это та, с которой они справились.

не вспомню уже на каком из сайтов, их за последнее время перелопатил гору было сравнение 3х библиотек под этот модуль

на ethernet.h были заявлены зависания модуля через несколько часов использования uipethernet.h - так же периодические несистемные зависания, ethercard.h - заявили как сложную но стабильную библиотеку, вот с нее и начал изучение и попытку сделать прибор....

и без функции вывода Get запроса на сервер действительно прибор работает уже 2 недели без проблем, но хотелось бы вывод на сервер сделать (для сбора статистики)

 

sadman41
Offline
Зарегистрирован: 19.10.2016

У UIPEthernet был некоторый дефект, который починен в одном из бранчей. Вдобавок к тому - сейчас оригинальный UIPEthernet не развивается, но его ответвление вполне себе живёт и получает своевременные правки. 

Однако, я соглашусь, что ENC28J60 - не самый лучший чип для ардуинщика и требует хорошей подготовки для использования. Лично я бы не стал делать с ним что-то на сторону забесплатно. Слишком много геморроя.

Можете сменить модуль на другой, основанный на Wiznet W5100/W5500. А так получается, что взяли капризный чип, сложную библиотеку и пишете на незнакомом Вам языке программирования. Эффект получаете соответствующий.

faustorg
Offline
Зарегистрирован: 19.04.2019

sadman41 пишет:

У UIPEthernet был некоторый дефект, который починен в одном из бранчей. Вдобавок к тому - сейчас оригинальный UIPEthernet не развивается, но его ответвление вполне себе живёт и получает своевременные правки. 

Однако, я соглашусь, что ENC28J60 - не самый лучший чип для ардуинщика и требует хорошей подготовки для использования. Лично я бы не стал делать с ним что-то на сторону забесплатно. Слишком много геморроя.

Можете сменить модуль на другой, основанный на Wiznet W5100/W5500. А так получается, что взяли капризный чип, сложную библиотеку и пишете на незнакомом Вам языке программирования. Эффект получаете соответствующий.

Да, все же буду переписывать код на другой чип и другие датчики (ибо эти тоже оказались не самыми надежными(при статически повышенных давлениях, при отсутствии питания на модуле измерения давления замечается большая просадка показаний), но это уже во второй версии прибора (жду посылки с китая)) а пока пытаюсь таки завести на этом, опыт все таки и обучение заодно незнакомому языку, да и плюс датчик давления, но котором хочу сделать вторую версию не такой чувствительный (он с аналоговым выходом) (если я правильно понял то от максимального до минимального давления у меня всего 1024 регистра)

sadman41
Offline
Зарегистрирован: 19.10.2016

Для бытовых целей BMP280 нормальные, а ваших я не знаю. Если собираетесь переехать на Wiznet, то полюбому лучше с UIPEthernet начинать писать - тогда переход с ENC будет безболезненный.

faustorg
Offline
Зарегистрирован: 19.04.2019

sadman41 пишет:

Для бытовых целей BMP280 нормальные, а ваших я не знаю. Если собираетесь переехать на Wiznet, то полюбому лучше с UIPEthernet начинать писать - тогда переход с ENC будет безболезненный.

 в моем случае - измерение высоты наполнения емкости жидкость, основано на сообщающихся сосудах и разнице давлений по водой и над водой

faustorg
Offline
Зарегистрирован: 19.04.2019

сегодня немного переделал код, вроде все работает, но запрос он все равно не отпраляет, роутер не видит от него даже попыток

#include <Wire.h>
#include <EtherCard.h>
#include <Adafruit_BME280.h>
#include <LiquidCrystal_I2C.h>


// Используемые пины
Adafruit_BME280 bme1;
Adafruit_BME280 bme2; // I2C
//#define SDA           A4
//#define SCL           A5
LiquidCrystal_I2C lcd(0x27, 16, 2);
//Настройки сети
byte Ethernet::buffer[700];                  //Буфер для приема и передачи по сети
static byte mac[] = {0x74,0x69,0x69,0x2D,0x30,0x31}; // mac-адрес
const char website[] PROGMEM = "open-monitoring.online";
const char id[] PROGMEM = "4719";
const char key[] PROGMEM = "DXfg12I&p1";


#define interval_get_data
#define DEBUG  0  // 1 - Отладка по COM-порту
                  // 0 - без отладки
#define XML   0  // 1 - Вывод данных в формате XML через веб
                  // 0 - Вывод в HTML
#define STATIC 1  // 0 - использовать DHCP
                  // 1 - статическая адресация, использовать данные, указаные ниже

#if STATIC
  static byte ip[]   = { 192,168,1,75 };
  static byte gw[]   = { 192,168,1,248 };
  static byte dns[]  = { 8,8,8,8 };
  static byte mask[] = { 255,255,255,0 };

#endif



/////////////////////////////////////
// Установки
void setup() 
{

  Serial.begin(9600);
  Serial.println(F("BMP280 test"));
  
  //Инициализируем барометр

bool status;

status = bme1.begin(0x77);
status = bme2.begin(0x76);

  //Инициализируем экран
  lcd.init();
  lcd.backlight();

  
  //Инициализируем сеть
  // Запускаем сеть и указываем куда подключен CS-пин
  ether.begin(sizeof Ethernet::buffer, mac, 10);   
  #if STATIC
    ether.staticSetup(ip, gw, dns, mask);
  Serial.println();
  ether.printIp("IP Address:\t", ether.myip);
  ether.printIp("Netmask:\t", ether.netmask);
  ether.printIp("Gateway:\t", ether.gwip);
  ether.printIp("Website IP:\t", ether.hisip);
  Serial.println();
  #else
    ether.dhcpSetup();
  #endif

  #if DEBUG
    Serial.begin(9600);
  #endif  

}

/////////////////////////////////////


// Конструкторы объектов
// Adafruit_BME280 bme1;      //Барометр
BufferFiller bfill;       //Буфер для формирования xml-файла
unsigned long millis_int1=0; //Для задержек на экране
unsigned long millis_int2=0; //Для задержек на вывода на сервер
static float correct = 1.05; //Коррекционная переменная
//static byte session;

  // Функция отправки данных на сервер
void sendTemperature(){
   
   ether.packetLoop(ether.packetReceive());
   
   if (millis() - millis_int2 > 30000){ // Задержка передачи данных, Вместо 60000 подставьте нужное вам значение паузы 
   millis_int1 = millis();
   char string_temp[7];
   dtostrf(bme1.readTemperature(), 4, 2, string_temp);
   char string_glub[10];
   int Glub = ((bme2.readPressure()- (bme1.readPressure()- 745))/9777.18*1000)* correct;
   itoa(Glub, string_glub , 10);

    Stash stash;
    byte sd = stash.create();
 
    //stash.print("cid=");
    //stash.print(id);
    //stash.print("&key=");
    //stash.print(key);
    //stash.print("p1=");
    stash.print(string_glub);
    stash.print("&p2=");
    stash.print(string_temp);
    stash.save();
    int stash_size = stash.size();
    
  Stash::prepare(PSTR("GET h ttp://$F/get?cid=4719&key=DX1fg2I&p1= HTTP/1.0" "\r\n"
    "Host: $D" "\r\n"
    "User-Agent: Arduino/1.0" "\r\n"
    "Content-Length: $D" "\r\n"
    "\r\n"
    "$H"),
    website, website, stash_size, sd);
  ether.tcpSend();
  delay (100);
  Serial.print("Temperature ");
  Serial.print(string_temp);
  Serial.print(" sent to website... ");
 

  }
}
// Опрашиваем датчики и формируем XML
static word sensorsToXml()
{
  char tempBmp[6], Glub[7], RaznPres[10], presBmp[7], altBmp[7];   //Барометр
  static char cor[15];                               //Переменные

  // Опрос датчиков и перевод значений в строки
  //dtostrf( float d, int w, int r, char* str) - перевод из числа в сторку
  //  float d  -  число, которое переводим в строку
  //  int   w  -  минимальный размер получаемой строки
  //  int   r  -  количестов знаков после запятой
  //  char* str-  стока, в которую записывается полученое значение
  //bmp.readAltitude = (((bmp.readPressure()/9777.2)*1000)-10297);
  dtostrf(bme1.readTemperature()       , 4, 2, tempBmp );
  dtostrf(((bme2.readPressure()- (bme1.readPressure()- 745))/9777.18*1000)*correct , 6, 2, Glub );
  dtostrf((bme2.readPressure()- (bme1.readPressure()- 745)),6,2, RaznPres);
  dtostrf(bme1.readPressure()*0.007501 , 6, 2, presBmp );
  dtostrf(bme1.readAltitude(1013.25)          , 5, 2, altBmp  );
  dtostrf(correct          , 5, 2, cor );


  

   // Формируем страничку
  bfill = ether.tcpOffset();
  #if XML       // Если надо выдавать в XML
    bfill.emit_p(PSTR
    (
      "<?xml version=\"1.0\"?>\n"
      "<сенсоры>\n"
      "<ТемператураВоздуха>$S*C</ТемператураВоздуха>\n"
      "<Глубина>$Sмм</Глубина>\n"
      "<РазницаДавления>$S</РазницаДавления>\n"
      "<Давление>$S</Давление>\n"
      "<Высота>$Sм</Высота>\n"
      "<Корекция>$S</Коррекция>\n"
      "</сенсоры>"
    ),tempBmp, Glub, RaznPres, presBmp, altBmp, corr);

  #else             // Вывод в HTML
    bfill.emit_p(PSTR(    
    "HTTP/1.0 200 OK\r\n"
    "Content-Type: text/html\r\n"
    "Pragma: no-cache\r\n"
    "\r\n"
    "<meta http-equiv='refresh' content='120' charset='utf-8'/>"
    "<title>Глубиномер</title>"
    "<h1>Температура воздуха $S°C </br></h1>"
    "<h1>Глубина $S mm </br></h1>"
    "<h1>Разница Давления $S Pa</br></h1>"
    "<h1>Давление $S Pa </br></h1>"
    "<h1> Высота $S m</h1>"
    "<h1> Коррекция $S</h1>"
    ),tempBmp, Glub, RaznPres, presBmp, altBmp, cor);

  #endif
  #if DEBUG
    Serial.print("BMP280. T: ");
    Serial.print(tempBmp);
    Serial.print(" P: ");
    Serial.print(presBmp);
    Serial.print(" A:");
    Serial.println(altBmp);


  #endif

  return bfill.position();
}


// Выполнение
void loop() 
{   
  // Получаем данные из буфера
  word pos = ether.packetLoop(ether.packetReceive());
    if (pos)                                 // Если данные получены правильно
    ether.httpServerReply(sensorsToXml()); // тогда отправляем их на выдачу 
                                             // через веб-сервер
    delay(1); 
    
 
    

 
    if (millis() - millis_int1 > 2000) // Задержка экрана, Вместо 10000 подставьте нужное вам значение паузы 
    {
    millis_int1 = millis();                               
    Serial.print("Temperature = ");
    Serial.print(bme2.readTemperature());
    Serial.println(" *C");

    Serial.print("Temperature = ");
    Serial.print(bme1.readTemperature());
    Serial.println(" *C");
    
    Serial.print("Pressure = ");
    Serial.print(bme2.readPressure());
    Serial.println(" Pa");
    Serial.print("Pressure = ");
    Serial.print(bme1.readPressure());
    Serial.println(" Pa");
    int Glub = ((bme2.readPressure()- (bme1.readPressure()- 745))/9777.18*1000)* correct;
    Serial.print("Approx altitude = ");
    Serial.print(bme2.readAltitude(1013.25)); // this should be adjusted to your local forcase
    Serial.println(" m");
    Serial.print("Glubina = ");
    
    Serial.print(Glub);
    Serial.println(" mm");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("H=");
    lcd.print(Glub);
    lcd.print("mm ");
    lcd.print("t=");
    lcd.print(bme1.readTemperature());
    lcd.print("C");
        
    lcd.setCursor(0, 1);
    lcd.print("P=");
    lcd.print(bme1.readPressure());
    lcd.print("Pa ");
    sendTemperature(); 
   
    }
      
  #if  DEBUG
    delay(2000);

  #endif


}