Перейти к содержанию

Проблема С Ethernet Модулем На Базе Enc28J60


Рекомендуемые сообщения

В общем купил вот такой Ethernet-модуль на базе чипа ENC28J60:

post-1-0-77387000-1307856140_thumb.jpg

Подключил к Arduino UNO, все работает (пробовал как WebServer)

На макетной плате собрал небольшую схемку с использованием датчика DS18B20 и ENC28J60. Идея такая: получать сигналы с датчика и выводить в HTML в браузер.

Тут появились первые подводные камни, т.к. используется PROGMEM, то переменные явно вывести не удасться (к примеур таким образом):

plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<p align=center>Temp: "));
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR(varTemp));

Эту проблему вроде как решил. Итоговый скетч выглядит следующим образом:

// EtherShield webserver demo
#include "EtherShield.h"
#include "OneWire.h"
OneWire ds(8); // линия 1-Wire DS18B20 будет на pin 8

// please modify the following two lines. mac and ip have to be unique
// in your local area network. You can not have the same numbers in
// two devices:
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x25};
static uint8_t myip[4] = {192,168,1,10};

#define MYWWWPORT 80
#define BUFFER_SIZE 550
static uint8_t buf[bUFFER_SIZE+1];

// The ethernet shield
EtherShield es=EtherShield();

uint16_t http200ok(void)
{
return(es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n")));
}

// prepare the webpage by writing the data to the tcp send buffer
uint16_t print_webpage(uint8_t *buf)
{
char temp_string[1];
int i=0;
getCurrentTemp(temp_string);
Serial.print(" T2 = "); Serial.print(temp_string[0]); Serial.print(temp_string[1]);
Serial.println();

uint16_t plen;
plen=http200ok();
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<html><head><title>Arduino ENC28J60 Ethernet Shield V1.0</title></head><body>"));
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("<p align=center>Temp: "));
buf[TCP_CHECKSUM_L_P+3+plen]=temp_string[0];
plen++;
buf[TCP_CHECKSUM_L_P+3+plen]=temp_string[1];
plen++;
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</p>") );
plen=es.ES_fill_tcp_data_p(buf,plen,PSTR("</body></html>"));

return(plen);
}


void setup(){
Serial.begin(9600);
// Initialise SPI interface
es.ES_enc28j60SpiInit();

// initialize enc28j60
es.ES_enc28j60Init(mymac);

// init the ethernet/ip layer:
es.ES_init_ip_arp_udp_tcp(mymac,myip, MYWWWPORT);
}

void loop(){

uint16_t plen, dat_p;

while(1) {
// read packet, handle ping and wait for a tcp packet:
dat_p=es.ES_packetloop_icmp_tcp(buf,es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf));

/* dat_p will be unequal to zero if there is a valid
* http get */
if(dat_p==0){
// no http request
continue;
}
// tcp port 80 begin
if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){
// head, post and other methods:
dat_p=http200ok();
dat_p=es.ES_fill_tcp_data_p(buf,dat_p,PSTR("<h1>200 OK</h1>"));
goto SENDTCP;
}
// just one web page in the "root directory" of the web server
if (strncmp("/ ",(char *)&(buf[dat_p+4]),2)==0){
dat_p=print_webpage(buf);
goto SENDTCP;
}
else{
dat_p=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n<h1>401 Unauthorized</h1>"));
goto SENDTCP;
}
SENDTCP:
es.ES_www_server_reply(buf,dat_p); // send web page data
// tcp port 80 end

}
}
void getCurrentTemp(char *temp)
{
int HighByte, LowByte, TReading, Tc_100, sign, whole, fract;

byte i;
byte present = 0;
byte data[12];
byte addr[8];

if ( !ds.search(addr)) {
ds.reset_search();
return;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1);

present = ds.reset();
ds.select(addr);
ds.write(0xBE); // считываем ОЗУ датчика

for ( i = 0; i < 9; i++) { // обрабатываем 9 байт
data[i] = ds.read();
}

LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
Tc_100 = (TReading/2)*100;

whole = Tc_100 / 100; // separate off the whole and fractional portions

temp[0] = (whole-(whole/100)*100)/10 +'0' ;
temp[1] = whole-(whole/10)*10 +'0';
Serial.print(" T1 = "); Serial.print(temp[0]); Serial.print(temp[1]);
Serial.println();
}	

Но скетч работает странно, в браузере правильная температура выводится через раз. Т.е. нажимаю F5 в браузере - показывает 28 градусов, в следующий раз вместо 28 показывает какие-то иероглифы, слдующий F5 опять 28 и так циклически.

В скетче добавил вывод даныз в Serial Monitor для отладки. Так вот интересно, что в функции getCurrentTemp() данные нормальные, а вот уже в print_webpage() один раз нормальное значение переменной, а второй раз фигня какая-то. Такое ощущение, что надо копать в сторону буфера ENC28J60, может его надо как-то обнулять?

Прилагаю скриншот, на котром видно Serial Monitor и тот момент, когда в браузере кракозябры, а не температура.

post-1-0-51840200-1307856646_thumb.gif

На всякий случай к посту прикрепляю мой скетч (формат PDE) и библиотеки Ethernet и OneWire.

Arduino.rar

Датчик я подключал к 8-пину, а Ethernet к 10,11,12,13

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • 4 недели спустя...

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

  • 6 месяцев спустя...

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Выплёвывать буфер надо максимально быстро. Я сделал опрос датчиков отдельной процедурой с сохранением в переменки, а рендеринг страницы ничего долгого не вызывает.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Я только начал разбираться с ардуино, но набор у меня тот-же: Уно и Модуль ethernet.

Документации к сетевому модулю нигде не нашел.

Можно прислать разводку подключения этих 2х модулей между собой?

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...
  • 8 месяцев спустя...
  • 1 месяц спустя...

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...