глючит связь с сервером

Andrey_tolstopuz
Offline
Зарегистрирован: 26.07.2016

Ардуино МЕГА+ Ethernet Shield + DHT11. Отправляет температуру гетом на сервер. Глючит - перестает записывать данные в БД.  Нажимаешь RESET все снова работает, то час, то день.. Что может быть причиной? Куда смотреть? Что искать?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Cкорее всего виснет ваша мега. Добавте в код Serial.print в разные места и подключите к ПК. А потом смотрите после чего зависла.

Andrey_tolstopuz
Offline
Зарегистрирован: 26.07.2016

не похоже. Светодиоды на плате шилда исправно мигают.

Andrey_tolstopuz
Offline
Зарегистрирован: 26.07.2016

asam пишет:

Cкорее всего виснет ваша мега. Добавте в код Serial.print в разные места и подключите к ПК. А потом смотрите после чего зависла.

Да и потом, остановка записи показаний порой происходит после нескольких дней)))

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

Вроде ж такая тема уже была. И тоже без кода. Ну, а без кода: виснет и виснет, ХЗ почему.

Нормальный совет из #1 - взять и посмотреть где виснет Вы игнорируете, разбирайтесь сами.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Andrey_tolstopuz пишет:

не похоже. Светодиоды на плате шилда исправно мигают.

Вы пришли сюда за советом или поспорить?

Andrey_tolstopuz
Offline
Зарегистрирован: 26.07.2016

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

Вроде ж такая тема уже была. И тоже без кода. Ну, а без кода: виснет и виснет, ХЗ почему.

Нормальный совет из #1 - взять и посмотреть где виснет Вы игнорируете, разбирайтесь сами.

 

Поскольку пришел за советом, а не поспорить, то код конечно не проблема, все собрано из библиотечных функций, не думаю просто, что от кода зависит. Вис бы как-то регулярно, или по времени работы, то да, может быть, а тут то неделю работает, то пару часов((( но если без него никак - с радостью выложу.
Совет №1 не очень, т.к. ардуино в теплице, питается от своего БП через USB порт. Если подключать ноут, то питание будет уже от него. Да и нет возможности оставить рабочий ноут на неделю в теплице)))
Думал контакты- так если ресет нажимаешь, то связь восстанавливается, Если бы были плохие контакты, то так не должно быть, надо механически кабель передернуть, или я не прав?

b707
Offline
Зарегистрирован: 26.05.2017

Ну если вы думаете, что это не код и не желаете сами заниматься отладкой - то непонятно, на что вы рассчитывали, обращаясь на форум?
Думали, что кто сразу даст вам точный ответ - "выключи вот этот контакт " и все заработает?

Andrey_tolstopuz
Offline
Зарегистрирован: 26.07.2016

b707 пишет:
Ну если вы думаете, что это не код и не желаете сами заниматься отладкой - то непонятно, на что вы рассчитывали, обращаясь на форум? Думали, что кто сразу даст вам точный ответ - "выключи вот этот контакт " и все заработает?

Конечно! Так и думал)))

#include <SPI.h>
#include <OneWire.h>
#include <Ethernet.h>
#include <dht11.h>
#include "setup.h"

char requestString[256];
unsigned long sendingMillis;
byte dsAddresses[DS_SENSORS_QUANTITY][5];
float dsTemperature[DS_SENSORS_QUANTITY];
int output_value;

OneWire ds(ONEWIRE_BUS_PIN);
EthernetClient client;
dht11 DHT11_1;
dht11 DHT11_2;

void setup() {
  Serial.begin(9600);
  delay(1000);

  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    while (true);
  }
  delay(100);

  dsGetAddresses(DS_SENSORS_QUANTITY);
  sendingMillis = 0;
}//setup()

//////
void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - sendingMillis > SERVER_CONNECT_PERIOD) {
    sendingMillis = currentMillis;
    pollSensors();
    prepareRequest();
    Serial.print("requestString - ");
    Serial.println(requestString);
    Serial.print("requesting...");
    if (connectToServer() == true) {
      Serial.println("done");
    } else {
      Serial.println("connection failed");
    }
  }
}//loop()
void prepareRequest(){
int dsSensor1 = (dsTemperature[0]+100) * 100;
int dsSensor2 = (dsTemperature[1]+100) * 100;
int dsSensor3 = (dsTemperature[2]+100) * 100;
int dsSensor4 = (dsTemperature[3]+100) * 100;
int dsSensor5 = (dsTemperature[2]+100) * 100;
int dh11temp1 = DHT11_1.temperature * 100;
int dh11humidity1 = DHT11_1.humidity;
int dh11temp2 = DHT11_2.temperature * 100;
int dh11humidity2 = DHT11_2.humidity;
int sh1 = output_value;
int sh2 = output_value;
int sh3 = output_value;

sprintf(requestString, "GET %s?dst1=%i&dst2=%i&dst3=%i&dst4=%i&dst5=%i&dht1=%i&dhh1=%i&dht2=%i&dhh2=%i&sh1=%i&sh2=%i&sh3=%i HTTP/1.1", 
  url, dsSensor1, dsSensor2, dsSensor3, dsSensor4, dsSensor5, dh11temp1, dh11humidity1, dh11temp2, dh11humidity2, sh1, sh2, sh3 );
}//prepareRequest()

//////
bool connectToServer(){
  if (client.connect(host, 80)) {
    client.println(requestString);
    client.print("Host: ");
    client.println(host);
    client.println("Connection: close");
    client.println();
//    client.stop();
    return(true);
  }
return(false);
}//connectToServer()
void pollSensors() {
  //ds18b20
  for (int i = 0; i < DS_SENSORS_QUANTITY; i++) {
    dsTemperature[i] = dsGetTemperature(dsAddresses[i]);
  }//dht11
  int chk1 = DHT11_1.read(DHT11_1PIN);
  int chk2 = DHT11_2.read(DHT11_2PIN);
  output_value= analogRead(SENSOR_PIN);
//  output_value = map(output_value,1023,300,0,100);
}//poolSensors()
//////
void dsGetAddresses(int numberOfSensors) {
  for (int i = 0; i < numberOfSensors; i++) {
    ds.search(dsAddresses[i]);
  }
}//dsGetAddresses()
//////
float dsGetTemperature(byte address[8]) {
  byte data[12];
  float raw;
  ds.reset();
  ds.select(address);
  ds.write(0x44, 1);
  delay(1000);
  ds.reset();
  ds.select(address);
  ds.write(0xBE);
  for (int i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  raw =  ((data[1] << 8) | data[0])/16.0;
  return (raw);
}//dsGetTemperature()

 

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

1) sprintf() -> snprintf() 
2) Сокет кто закрывать будет?
3) byte dsAddresses[DS_SENSORS_QUANTITY][5] => float dsGetTemperature(byte address[8]) ???

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

А ничего, что OneWire::search ожидает восемь байтов, а Вы в строке №14 (второй части кода) подсовываете её только пять? У неё там прямо такая строчка есть:

for (int i = 0; i < 8; i++) newAddr[i] = ROM_NO[i];

Она радостно распахивает память, а результатом распашки памяти как раз и являются необъяснимые зависания.

Andrey_tolstopuz
Offline
Зарегистрирован: 26.07.2016

Добрый день. Большое спасибо sadman41 #9 и ЕвгенийП #10 за помощь. Даже и не знаю как вместо 8 вставил 5! Другие тоже поправил, залил. Пока работает)))

inspiritus
Offline
Зарегистрирован: 17.12.2012

С тех пок, как появились денежные знаки, слово СПАСИБО утратило своё первоначальное значение.

опубликовал код, задал вопрос Форуму, тебе помогли?

коль скоро платить не можешь, или не желаешь...
опубликуй тот код , который работает, благодаря помощи форума!

 

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

Andrey_tolstopuz пишет:

Даже и не знаю как вместо 8 вставил 5! 

Впредь публикуйте код, а не отбрыкивайтесь как в этой теме.

Andrey_tolstopuz
Offline
Зарегистрирован: 26.07.2016

inspiritus пишет:

С тех пок, как появились денежные знаки, слово СПАСИБО утратило своё первоначальное значение.

опубликовал код, задал вопрос Форуму, тебе помогли?

коль скоро платить не можешь, или не желаешь...
опубликуй тот код , который работает, благодаря помощи форума!

 

Да, я благодарен форумчанам, которые помогли мне разобраться в этом деле. Код на сегодняшний день такой:

#include <SPI.h>
#include <OneWire.h>
#include <Ethernet.h>
#include <dht11.h>
#include "setup.h"

char requestString[256];
unsigned long sendingMillis;
byte dsAddresses[DS_SENSORS_QUANTITY][8];
float dsTemperature[DS_SENSORS_QUANTITY];
int output_value;

OneWire ds(ONEWIRE_BUS_PIN);
EthernetClient client;
dht11 DHT11_1;
dht11 DHT11_2;

void setup() {
  Serial.begin(9600);
  delay(1000);

  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    while (true);
  }
  delay(100);

  dsGetAddresses(DS_SENSORS_QUANTITY);
  sendingMillis = 0;
}//setup()

//////
void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - sendingMillis > SERVER_CONNECT_PERIOD) {
    sendingMillis = currentMillis;
    pollSensors();
    prepareRequest();
    Serial.print("requestString - ");
    Serial.println(requestString);
    Serial.print("requesting...");
    if (connectToServer() == true) {
      Serial.println("done");
    } else {
      Serial.println("connection failed");
    }
  }
}//loop()
void prepareRequest(){
int dsSensor1 = (dsTemperature[0]+100) * 100;
int dsSensor2 = (dsTemperature[1]+100) * 100;
int dsSensor3 = (dsTemperature[2]+100) * 100;
int dsSensor4 = (dsTemperature[3]+100) * 100;
int dsSensor5 = (dsTemperature[2]+100) * 100;
int dh11temp1 = DHT11_1.temperature * 100;
int dh11humidity1 = DHT11_1.humidity;
int dh11temp2 = DHT11_2.temperature * 100;
int dh11humidity2 = DHT11_2.humidity;
int sh1 = output_value;
int sh2 = output_value;
int sh3 = output_value;

snprintf(requestString, "GET %s?dst1=%i&dst2=%i&dst3=%i&dst4=%i&dst5=%i&dht1=%i&dhh1=%i&dht2=%i&dhh2=%i&sh1=%i&sh2=%i&sh3=%i HTTP/1.1", 
  url, dsSensor1, dsSensor2, dsSensor3, dsSensor4, dsSensor5, dh11temp1, dh11humidity1, dh11temp2, dh11humidity2, sh1, sh2, sh3 );
}//prepareRequest()

//////
bool connectToServer(){
  if (client.connect(host, 80)) {
    client.println(requestString);
    client.print("Host: ");
    client.println(host);
    client.println("Connection: close");
    client.println();
    client.stop();
    return(true);
  }
return(false);
}//connectToServer()
void pollSensors() {
  //ds18b20
  for (int i = 0; i < DS_SENSORS_QUANTITY; i++) {
    dsTemperature[i] = dsGetTemperature(dsAddresses[i]);
  }//dht11
  int chk1 = DHT11_1.read(DHT11_1PIN);
  int chk2 = DHT11_2.read(DHT11_2PIN);
  output_value= analogRead(SENSOR_PIN);
//  output_value = map(output_value,1023,300,0,100);
}//poolSensors()
//////
void dsGetAddresses(int numberOfSensors) {
  for (int i = 0; i < numberOfSensors; i++) {
    ds.search(dsAddresses[i]);
  }
}//dsGetAddresses()
//////
float dsGetTemperature(byte address[8]) {
  byte data[12];
  float raw;
  ds.reset();
  ds.select(address);
  ds.write(0x44, 1);
  delay(1000);
  ds.reset();
  ds.select(address);
  ds.write(0xBE);
  for (int i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  raw =  ((data[1] << 8) | data[0])/16.0;
  return (raw);
}//dsGetTemperature()
#define SERVER_CONNECT_PERIOD 180000
#define ONEWIRE_BUS_PIN 8
#define DS_SENSORS_QUANTITY 5
#define DHT11_1PIN 2
#define DHT11_2PIN 3
#define SENSOR_PIN A0

 

Andrey_tolstopuz
Offline
Зарегистрирован: 26.07.2016
В продолжение и точнее закрытие темы.
После исправлений программы, хоть я и написал, что она заработала, но проблема оставалась. Общение с сервером прерывалось спустя какой-то случайный промежуток времени. Я на время оставил попытки наладить процесс, ввел, как говорится, ручное управление))) И однажды, разыскивая что-то в подвале, я услышал нехарактерное жужжание и потрескивание из угла, где стоит роутер. Я потрогал его блок питания. И был неприятно удивлен, почувствовав, что он очень горячий! Разобрав БП, я нашел лопнувший конденсатор, и вообще все внутренности смотрелись сильно пригоревшими.
Заменив роутер я полностью избавился от проблемы. Работает и стара прошивка и новая. Дело было не в бабине, как говорят шофера)))
 
 
Andrey_tolstopuz
Offline
Зарегистрирован: 26.07.2016

b707
Offline
Зарегистрирован: 26.05.2017

Andrey_tolstopuz пишет:

Заменив роутер я полностью избавился от проблемы. Работает и стара прошивка и новая. Дело было не в бабине, как говорят шофера)))
 
не совсем по теме, но... если проблема была в блоке питания - зачем весь роутер-то было менять?
БП у них горят каждые 3-5 лет, чтож, каждый раз новый роутер покупать? - мой роутер уже 4-й по счету БП донашивает
Andrey_tolstopuz
Offline
Зарегистрирован: 26.07.2016

Дык цена))) Я купил за 100 рублей подержанный. И потом я не знаю, что прошлый БП в роутере изжарил. Роутер то остался, будет время посмотрю, может и рабочий.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

мой роутер уже 4-й по счету БП донашивает

Аналагичненька.  Тока у меня третий. :) 

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

Andrey_tolstopuz пишет:

Работает и стара прошивка и новая. Дело было не в бабине, как говорят шофера)))

Т.е. Вы считаете, что роутер был виноват в том, что Вы пять байтов вместо восьми пихали? А теперь и с пятью работает? Супер! :-)

Andrey_tolstopuz
Offline
Зарегистрирован: 26.07.2016

Да, я считаю, что роутер был виноват в том, что связь с сервером  эпизодически пропадала. Вот про 5 и 8 не скажу. И та и другая прошивки после замены роутера аккуратно заносили температуру в БД. Сейчас работает на новой. Старую просто для интереса грузил. Статистику наработки на отказ не набирал.

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

b707 пишет:

Andrey_tolstopuz пишет:

Заменив роутер я полностью избавился от проблемы. Работает и стара прошивка и новая. Дело было не в бабине, как говорят шофера)))
 
не совсем по теме, но... если проблема была в блоке питания - зачем весь роутер-то было менять?
БП у них горят каждые 3-5 лет, чтож, каждый раз новый роутер покупать? - мой роутер уже 4-й по счету БП донашивает

правильнее будет - БП у них запланировано (схемотехнически) горят  после 3-х лет эксплуатации...

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

правильнее будет - БП у них запланировано (схемотехнически) горят  после 3-х лет эксплуатации...

ну не всегда.

У меня роутер Линксис (Циско для бедных :), его родный БП держался долго, лет шесть. Когда сдох, я нем поменял два выходных кондера, что продлило ему жизнь еще на 1.5 года. потом в нем что-то сгорело окончательно, с дымом. Купленный на рынке простенький китайский БП за 150 рублей продержался всего 2 года, теперь стоит самоделка - "голый" (безкорпусной) блок с Алиэкспресса на ток в 2 раза больше номинала в самодельной коробке с вилкой. Последний, в отличии от всех предыдущих, хотя бы не греется... а то даже родной БП от циско грелся как чайник.

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

b707 пишет:

ua6em пишет:

правильнее будет - БП у них запланировано (схемотехнически) горят  после 3-х лет эксплуатации...

ну не всегда.

У меня роутер Линксис (Циско для бедных :), его родный БП держался долго, лет шесть. Когда сдох, я нем поменял два выходных кондера, что продлило ему жизнь еще на 1.5 года. потом в нем что-то сгорело окончательно, с дымом. Купленный на рынке простенький китайский БП за 150 рублей продержался всего 2 года, теперь стоит самоделка - "голый" (безкорпусной) блок с Алиэкспресса на ток в 2 раза больше номинала в самодельной коробке с вилкой. Последний, в отличии от всех предыдущих, хотя бы не греется... а то даже родной БП от циско грелся как чайник.

я в курсе, что такое линксис, сын за последний месяц починил более полсотни БП, все, за исключением DELL с правильными китайскими косяками, начиная от резисторов  в цепи (+) и затвора )))

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

сын за последний месяц починил более полсотни БП, все, за исключением DELL с правильными китайскими косяками, начиная от резисторов  в цепи (+) и затвора )))

о, я бы не против у кого-то поучится фиксить хотя бы банальные случае отказа БП. а то у меня уже с пол-дюжины скопилось, не знаю с чего начать.

Я обычно тупо меняю все вспухшие электролиты. а сверх этого ничего делать не умею...

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

b707 пишет:

Я обычно тупо меняю все вспухшие электролиты. а сверх этого ничего делать не умею...

Я тоже, но я ширше на это смотрю. Посмотрю глазами, потычу мультиметром, потычу осциллографом и ... успокаиваюсь, вспоминая старую максиму настоящих программистов: «Если вы не можете выполнить эти работы на Фортране, выполните их на ассемблере. Если же их нельзя выполнить на ассемблере, их не стоит делать вообще» :-)

Хотите эпичную (ну, совершенно эпичную, в стиле рассказа Марка Твена "Похищение белого слона") историю о том, как я позавчера монитор ремонтировал?

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

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

Хотите эпичную (ну, совершенно эпичную, в стиле рассказа Марка Твена "Похищение белого слона") историю о том, как я позавчера монитор ремонтировал?

так кто же не хочет, все во внимании

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

Ну, типа, есть у меня монитор. Достался мне когда дочь купила себе что-то покруче, а этот скинула мне, типа хочешь пользуй, хочешь на запчасти разбирай. У него болталась кнопка включения - так шевелилась туда сюда, пластмассовая нажималка надломилась, но как-то нажималась, хотя и болталась. А тут вдруг перестал включаться - на кнопку не реагирует никак. Ну, думаю, нажималка отошла, наверное, окончательно, щас посмотрю.

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

Итак, питание от сетевого шнура поступает нормально, смотрю куда дальше идут провода и ... обнаруживаю на боку монитора выключатель (!!!) само собою выключенный! Тваюшдивизию (!!!) ... включил, всё нормально, кнопка работает, монитор включается. В общем, потребовалось разобрать монитор, притащить мультиметр и осциллограф чтобы ... найти выключатель.

Самое непонятное - я вообще не знал о существовании этого выключателя, был уверен, что его нет, и точно не мог его выключить. Жена туда уж пару дней как не походила. Внуки в этот день не приходили ... остаётся только Матвеич - больше некому. Но, блин, там маленький такой довольно тугой выключатель "педалька" как у блоков atx сзади стоят с ноликом и единичкой. Неужели кот мог его выключить? Ахренеть!

Собрал монитор, тащу на место. Жена спрашивает: "удалось починить?" - "А то! За кого ты меня держишь?!" :-)

----

У Марка Твена было похоже. Там слона спёрли и вся полиция его две недели искала, кучу людей привлекли, кучу денег потратили, потом вдруг заметили странный запах в отделении полиции ... выяснилось, что бедный слон ещё в самом начале зашёл в полицейский участок и помер там, под лестницей.

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

правильно сделанный монитор по пожарной безопасности )))

b707
Offline
Зарегистрирован: 26.05.2017

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

Я тоже, но я ширше на это смотрю. Посмотрю глазами, потычу мультиметром, потычу осциллографом и ... успокаиваюсь,

расскажите мне, куда потыкать осциллографом в типичном китайском БП? И что там должно быть видно?

nik182
Offline
Зарегистрирован: 04.05.2015

Некуда тыкать , если нет напряжения на выходе. А если есть, то только на выход под нагрузкой. Тут два варианта. Или есть большая переменная составляющая на выходе 50 Гц , то садится высоковольтный конденсатор после сетевого моста диодов. Или большая переменная на высокой частоте то садится выходной конденсатор или второй выходной, после катушки, если блок питания покруче. Остальное смотрится тестером. Или обрыв ВВ обмотки трансформатора или пробой транзистора в м.с. управления. Во втором случае могут сгорееть диоды моста, дорожки и малоомный резистор на входе.

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

b707 пишет:
И что там должно быть видно?
Да, кабы я знал. Я ж говорю, "с умным видом потычу куда попало и расслабляюсь с чувством исполненного долга". Ну, если выключатель не найду, конечно.