Прошу помощи

ШTopor
Offline
Зарегистрирован: 22.12.2017

Доброго всем здравия, уважаема публика.

Прошу помочь. Есть ардуинка уно и горе модуль ENC28J60

Используется для удаленного мониторинга темпеатуры.

Суть проблем:

1. Ююки вместо русских букв. Сначало когда первый раз рагружаю скетч все норм, но потом появляются ююки

2. Не стабильная работа веб-сервера. Захожу на ап в браузере, показывает температуры, но с течением времени ап перестает отвечать

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

скетч ниже:

// Мониторинг температуры
#include <OneWire.h>
#include "etherShield.h"
#include "ETHER_28J60.h"
 
static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   // this just needs to be unique for your network, 
                                                                // so unless you have more than one of these boards
                                                                // connected, you should be fine with this value.
                                                           
static uint8_t ip[4] = {192, 168, 140, 100};                       // the IP address for your board. Check your home hub
                                                                // to find an IP address not in use and pick that
                                                                // this or 10.0.0.15 are likely formats for an address
                                                                // that will work.
 
static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP
 
ETHER_28J60 ethernet;
OneWire  ds( 7 );
 
 
byte addr[8]; 
 
float getTemp(){  
  byte data[12];
 
 
  ds.search(addr);   
  ds.reset_search(); 
  
  ds.reset();            
  ds.select(addr);        
  ds.write(0x44);      
  delay(100);   
  
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);          
 
  for (int i = 0; i < 9; i++) data[i] = ds.read(); 
  int raw = (data[1] << 8) | data[0];
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];  
  
  return raw / 16.0;
}
 
void setup()
  ethernet.setup(mac, ip, port);
  long t = millis() / 100;
}
 
void loop()
{
  if (ethernet.serviceRequest())
  {
    ethernet.print("<html><head><title>Карла маркса</title> </head>");
    ethernet.print("<body><CENTER><H2>Температура корпус №5</H2></BR><H1>");
    ethernet.print(getTemp());
    ethernet.print("C</H1></CENTER></body></html>");
    ethernet.respond();
  }
  delay(100);
}
 
помогите люди добрые 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ШTopor пишет:
Есть ардуинка уно и горе модуль ENC28J60
А также горе-разработчик, который писать на форумах научился, а читать - нет.

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

ШTopor
Offline
Зарегистрирован: 22.12.2017

ПРошу прошения. 

вот код

// Мониторинг температуры
#include <OneWire.h>
#include "etherShield.h"
#include "ETHER_28J60.h"
 
static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   // this just needs to be unique for your network, 
                                                                // so unless you have more than one of these boards
                                                                // connected, you should be fine with this value.
                                                           
static uint8_t ip[4] = {192, 168, 140, 100};                       // the IP address for your board. Check your home hub
                                                                // to find an IP address not in use and pick that
                                                                // this or 10.0.0.15 are likely formats for an address
                                                                // that will work.
 
static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP
 
ETHER_28J60 ethernet;
OneWire  ds( 7 );
 
 
byte addr[8]; 
 
float getTemp(){  
  byte data[12];
 
 
  ds.search(addr);   
  ds.reset_search(); 
  
  ds.reset();            
  ds.select(addr);        
  ds.write(0x44);      
  delay(100);   
  
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);          
 
  for (int i = 0; i < 9; i++) data[i] = ds.read(); 
  int raw = (data[1] << 8) | data[0];
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];  
  
  return raw / 16.0;
}
 
void setup()
{ 
  ethernet.setup(mac, ip, port);
  long t = millis() / 100;
}
 
void loop()
{
  if (ethernet.serviceRequest())
  {
    ethernet.print("<html><head><title>Карла маркса</title> </head>");
    ethernet.print("<body><CENTER><H2>Температура корпус №5</H2></BR><H1>");
    ethernet.print(getTemp());
    ethernet.print("C</H1></CENTER></body></html>");
    ethernet.respond();
  }
  delay(100);
}

 

ШTopor
Offline
Зарегистрирован: 22.12.2017

Чувствую, что причина в переполнениии буфера

Как применительно к данному коду выполнить контроль переполнения буфера?

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

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

ШTopor
Offline
Зарегистрирован: 22.12.2017

Все равно виснет

Питание на сетевой модуль от платыу 3.3 приходит

Загружаю скетч, подсоединяюсь через пачкорд - все работает.

Как только вставляют сетевой провод -все. Раза 2 задешь, а третий раз веб сервер не отвечаеет.

Лампочки все моргают как надо 

 

Можете объяснить, как бороться с переполнением на будущее так сказать

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

Модули на ENC28J60, что с Aliexpress и иже с ним - штука, требующая аккуратности и вдумчивого втыкания в проблему.

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

ШTopor
Offline
Зарегистрирован: 22.12.2017

МОдуль ENC28J60, на сетевом разъеме написано HanRub HR911105A

Плата ардуино УНО

GND – 5V,

 

SCK – 13,

 

SO – 12,

 

VCC – 3.3V,

 

CS – 10,

 

SI – 11.

Блок питания ардуины 6В 0.6А

Можно ли подключить клему RESET модуля ENC28J60 к Reset ардуины и время от времени посылать сигнал сброса, чтобы если возникнет "зависание" ENC28J60 перезагрузить его?

 

 

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

ШTopor пишет:

Можно ли подключить клему RESET модуля ENC28J60 к Reset ардуины и время от времени посылать сигнал сброса, чтобы если возникнет "зависание" ENC28J60 перезагрузить его?

Зачем подключать ресет модуля к ресету ардуины? - это вы что-то путаете

Вам нужно подключить ресет модуля к любому цифровому выходу ардуины. чтобы вы могли управлять ресетом. Вотподробнее, первая же ссылка в Гугле:

==== цитата ====

There is a Reset pin in the ENC28j60 board, this pin has a pullup of 10k in most boards. One way to do it is to pull this pun low, then release it (or pull it high) This will get the ENC28j60 to reset, and wait for configuration from the arduino.

Then all you need to do is re-implement the ethernet.start sequence. Something like:

PinMode(ETH_RS_PIN, OUTPUT); // this lets you pull the pin low.
DigitalWrite(ETH_RS_PIN, LOW); // this resets the ENC28J60 hardware
Delay(100); // this makes sure the ENC28j60 resets OK.
DigitalWrite(ETH_RS_PIN, HIGH); // this makes for a fast rise pulse;
PinMode(ETH_RS_PIN, INPUT) // this releases the pin,(puts it in high impedance); lets the pullup in the board do its job.

Ethernet.begin(mac_address_byte_array, Ip_address_byte_array);

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

3.3 V c ардуино? Они же там вроде совсем хилые. Может от отдельного источника запитать?

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

Ну, я ни разу ENC за RST не дергал, работает вполне себе успешно месяцами. Конечно тонкости есть.

Первое - это хорошее питание, не с ардуины. 0.2A в пике она жрет, по-моему.

Второе - надежное соединение по SPI. Моей первой ошибкой было вывести SPI наружу (решил перешивать программатором), где он ловил любую статику и вешал ENC в произвольное время. Как только перестал такими оригинальными конструкторскими решениями заниматься - сразу всё нормализовалось. А у вас, думаю, всё на Dupoint-ах висит. 

Гарантированно отловить зависание программно вы не сможете, так что ресетить придется по расписанию, если уж решите идти таким путем.

ШTopor
Offline
Зарегистрирован: 22.12.2017

спасибо за советы.

Очевидно это проблемы с питанием  и некачественное соединение сетевого модуля с платой.

Попробую спаять шлейф и поставить блок питнаия на 12 вольт

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

Вам не поможет БП на 12V. С высокой степенью вероятности на вашей Uno нет стабилизатора 3.3V, достаточного для ENC. Так что хоть 220 туда подайте - лучше не станет. Нужен отдельный стабилизатор или сетевой модуль, на котором он уже распаян.

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

ШTopor пишет:

Попробую .... поставить блок питнаия на 12 вольт

Что за бред? Нафига 12в? Вы считаете, чем больше вольт, тем лучше????

ЭзернетМодулю нужно 3.3В - именно столько и нужно подавать!

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Duemilanove, если кто помнит.....
9 Вольт  1 Ампер.
Если больше- перегревается  стабилизатор и перезагружается.
И именно с ЕНЦ шилдом, уже забыл когда ставил,
несколько лет работают без присмотра и зависаний.
 

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

У меня ENC шилды с набортным стабилизатором. А есть ардуины с честными 3.3V. Но нет никакой гарантии, что у ТС именно такая.

ШTopor
Offline
Зарегистрирован: 22.12.2017

Что за бред? Нафига 12в?

Питание самой платы ардуино.

Там же до 12 вольт можно вроде как

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

ШTopor пишет:

Что за бред? Нафига 12в?

Питание самой платы ардуино.

Там же до 12 вольт можно вроде как

Вам уже выше сказали - хоть 220в на ардуину подайте, модулю по шине 3.3 больше не перепадет.

Вам нужен отдельный источник питания 3.3в для Эзернет-модуля.

ШTopor
Offline
Зарегистрирован: 22.12.2017

Организовал отдельно стабильное питание сетевого модуля. Через стабилизатор на сетевой модуль приходит стабильные 3.3В

Веб-сервер поработал 2 денька и опять ушел в небытие (непингуется не отвечает).

Что делать то?

Может все таки попытатся память очищать после 1 дня работы, а не ждать 7 дней для  автоматического очищения

ПОмогите, люди добрые. 

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

 

 

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

Знакомая ситуация. Я так пару месяцев промаялся, пока нашел в чем дело. Но у меня висло раз в неделю-две, что крайне затрудняло поиск.

Может вам W5100 взять - забудете о проблемах, как о страшном сне.

ШTopor
Offline
Зарегистрирован: 22.12.2017

Да я бы рад, но "денег нет, держитесь".

Пожалуйста, поделитесь своим опытом, в чем у Вас была проблема.

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

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

 

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

Я сижу на UIPEthernet, поэтому, возможно, что мое решение вам не поможет.

У ENC есть одна сволочная особенность: если в нее данные летят быстрее, чем МК их забирает, то у нее быстро забивается буфер и она выставляет в своем регистре бит ошибки, переставая что-либо делать до момента сброса этого бита (или ресета модуля). В UIPEthernet эта ситуация не обрабатывалась, потому что решение предполагалось иным и, бывало так, что дома конструкция работала неделями, а на работе, в большой сети - вешалась через неделю-две-полторы-...  Автор драйвера ожидал, что в лупе будет вызываться maintain(), который, в свою очередь дергает внутренний tick(), выгребающий из буфера ENC данные,с периодичностью не меньшей, чем 250мс. Однако, если луп длинный или траффик большой (или всё вместе), то карачун всё равно наступает.

Пришлось пересмотреть архитектуру скетча, слегонца подправить драйвер, периодически контролировать бит ошибки буфера приёма и софтресетить модуль по обнаружению проблемы.

 

 

ratman
Offline
Зарегистрирован: 11.10.2015

sadman41 пишет:

Может вам W5100 взять - забудете о проблемах, как о страшном сне.

Угу, "вам совсем другие кошмары сниться будут". Начнём с того, что если шилд, то питается от ардуины и жрёт неслабо (модуль можно кормить отдельно). Сверху ещё один шилд налепить -- лотерея. Второе -- согласование Ethernet, которое китайцы просрали. Либо перепайка чип-резистора, либо перебор коммутаторов. Ну, и наконец, нахрена на нём SD развели... На UNO просто не выходит работать полноценно с Ethernet и SD-Card. А на Mega... Тогда уже имеет смысл малину брать.

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

W5100 mini Red. Беру и не парюсь. Форм-фактор как у ENC, стабилизатор на борту. Но на Uno подключать неудобно что ENC, что Mini Red.

ratman
Offline
Зарегистрирован: 11.10.2015

sadman41 пишет:

W5100 mini Red. Беру и не парюсь. Форм-фактор как у ENC, стабилизатор на борту. Но на Uno подключать неудобно что ENC, что Mini Red.

С модулями этого головняка быть не может. Они по честному разведены.

ШTopor
Offline
Зарегистрирован: 22.12.2017

Решил попробовать Reset модуля ENC, но терплю неудачу.

Веб сервер вообще перестал отвечать,

ПОхоже что ENC не проходит инициализацию после сброса.

В чем может быть ошибка?

Вывод Reset модуля ENC подключил к выходу №7,

использую прграмку типа мигание светодиода.

Вот собственно сам код


#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   
static uint8_t ip[4] = {192, 168, 140, 100};                       
static uint16_t port = 80;                                     
int ETH_RS_PIN =7;
ETHER_28J60 ethernet;

void setup()
{ 
  ethernet.setup(mac, ip, port);
  pinMode(ETH_RS_PIN, OUTPUT);
}

void loop()
{
  if (ethernet.serviceRequest())
  {
    ethernet.print("<H1>Hello World Друг</H1>");
    ethernet.respond();
  }
  delay(10000);
  digitalWrite(ETH_RS_PIN, LOW); // this resets the ENC28J60 hardware
  delay(100); // this makes sure the ENC28j60 resets OK.
  digitalWrite(ETH_RS_PIN, HIGH); // this makes for a fast rise pulse;
  pinMode(ETH_RS_PIN, INPUT);
  delay(10000);
}

 

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

Дак сами подумайте: Hard reset - это короткий Power off/on. Что с модулем при Power on делать нужно?

ШTopor
Offline
Зарегистрирован: 22.12.2017

Я бы и рад подумать, но получается плохо, я только только учусь.

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

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

ШTopor пишет:

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

блииин... ну нельзя же так тупить!

Посмотри на свой собственный код. Что ты делаешь при первом старте модуля? - вот тоже самое делай и при ресете.

ШTopor
Offline
Зарегистрирован: 22.12.2017

Прошу отнестись с пониманием я ж совсем новичок

вот что сделал и все равно пишет соединение прервано


#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   
static uint8_t ip[4] = {192, 168, 140, 100};                      

static uint16_t port = 80;                                     
int ETH_RS_PIN =7;
ETHER_28J60 ethernet;

void setup()
{ 
  ethernet.setup(mac, ip, port);
  pinMode(ETH_RS_PIN, OUTPUT);
}

void loop()
{
  if (ethernet.serviceRequest())
  {
    ethernet.print("<H1>Hello World Друг</H1>");
    ethernet.respond();
  }
  delay(10000);
  digitalWrite(ETH_RS_PIN, LOW); // this resets the ENC28J60 hardware
  delay(100); // this makes sure the ENC28j60 resets OK.
  digitalWrite(ETH_RS_PIN, HIGH); // this makes for a fast rise pulse;
  pinMode(ETH_RS_PIN, INPUT);
  delay(100);
  if (ethernet.serviceRequest())
  {
    ethernet.print("<H1>Hello World Друг</H1>");
    ethernet.respond();
  }
delay(10000);
}

 

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

мошт, сначала светодиодиком помигать?

ШTopor
Offline
Зарегистрирован: 22.12.2017

я ж просил, отнестись с пониманием. Светодиодиком мигал уже -получилось

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

Лично я вам и дал совет, понимая, что вы новичок.

Есть три варианта развития решения вашей проблемы:

1) Вы начинаете жестко учить C++, внутреннее устройство ENC и разбирать драйвера, пытаясь их пофиксить, вычисляя систему в рандомные сбоях;

2) За вас эту задачу делает кто-то другой;

3) Вы покупаете W5100 Mini Red за 400р ( https://www.aliexpress.com/item/TOP-Mini-W5100-LAN-Ethernet-Shield-Netwo... ) и пользуетесь стандартной Ethernet.h

 

ШTopor
Offline
Зарегистрирован: 22.12.2017

Вам отдельное большое спасибо за разъяснения, 

но мне хотелось бы узнать, что я делаю не так с ресетом ENC, в чем моя ошибка

Как инициализировать ENC после ресета?

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

Так же, как вы это делаете в setup() { ... }

ШTopor
Offline
Зарегистрирован: 22.12.2017

Вы уж извените меня за новясчивость.

Вот поместил 

void setup()
{ 
  ethernet.setup(mac, ip, port);
  pinMode(ETH_RS_PIN, OUTPUT);
}

void loop()
{
  if (ethernet.serviceRequest())
  {
    ethernet.print("<H1>Hello World Друг</H1>");
    ethernet.respond();
  }
  delay(30000);
  digitalWrite(ETH_RS_PIN, LOW); // this resets the ENC28J60 hardware
  delay(100); // this makes sure the ENC28j60 resets OK.
  digitalWrite(ETH_RS_PIN, HIGH); // this makes for a fast rise pulse;
  pinMode(ETH_RS_PIN, INPUT);
  delay(100);
  ethernet.setup(mac, ip, port);
  delay(100);
}

и все равно не работает((( пишет соединение прервано

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

Ну так никто и не обещал лёгкого решения.

Чип может и более 100мс заводится после ресета. Тут уж начинается эксперимент чистейшей воды - подбор задержек. А то и гляди - в конструкторе объекта ETHER_28J60 какая-нибудь преинициализация проводится и без прочесывания кода драйверов не обойтись.

 

Попробуйте взять UIPEthernet (https://github.com/UIPEthernet/UIPEthernet) - хуже уж точно не будет. 

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

Давай сетаки светодиодом мигать. 

ШTopor
Offline
Зарегистрирован: 22.12.2017

Диодиком мигал уже, если Вы такой умный, может поможите?

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

Со светодиодиком - памагу, такибыть.

ШTopor
Offline
Зарегистрирован: 22.12.2017

Спасибо, с диодиком помощь не требуется

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

Ха. Черточка. Ха. Черточка. Ха. 

Удачи.