ENC28J60 представляет собой модуль который подключается к плате Arduino с помощью SPI интерфейса, тактовая частота ISP интерфейса может достигать 20 МГц. Для подключения к сети TCP/IP используется разъём RJ-45. Модуль гальванически развязан с ним.
Характеристики модуля ENC28J60:
- Совместимость с Ethernet сетями 10/100/1000 Base-T. Скорость передачи данных 10 мбит/сек, реализация TCP/IP стека.
- Интерфейс связи с микроконтроллером – SPI, частота до 20 мГц.
- Напряжение питания 3,1 – 3,6 В. Типовое 3,3 В.
- Ток потребления от источника питания 3,3 В:
- при передачи данных до 180 мА;
- в активном состоянии, без передачи данных 120 мА;
- в режиме ожидания не более 2 мА.
- Модуль обеспечивает гальваническую развязку от линии связи.
- Выводы интерфейса модуля совместимы с 5 вольтовым сигналам.
Отладочная плата STM32 (базе микроконтроллера STM32F103C8T6) позволяет контролировать работу модуля ENC28J60.
Веб-сервер на ENC28J60 при использовании STM32 позволяет создавать страницу HTML на которой будут выводится например информация об подключенных к плате Arduino датчиков. Сам модуль ENC28J60 при помощи сетевого кабеля подключается к маршрутизатору (роутер) или напрямую к сетевой карте ПК.
Подключение:
ENC28J60 | STM32F103 |
VCC | 3.3V |
GND | GND |
SCK | PA5 |
SO | PA6 |
SI | PA7 |
CS | PA8 |
Вывод теста на страницу HTML
Перед заливкой скетча в STM32 Вам необходимо ознакомиться со следующей статьей — STM32 Arduino IDE
Для нормальной загрузки скетча Вам понадобится набор библиотек Arduino_STM32-master.zip
// ENC28J60 - STM32F103 // VCC - 3.3V // GND - GND // SCK - Pin PA5 // SO - Pin PA6 // SI - Pin PA7 // CS - Pin PA8 // Указанные библиотеки входят в состав набора библиотек Arduino_STM32-master.zip #include <EtherCard_STM.h> #include <SPI.h> static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; static byte myip[] = { 10,42,0,100 }; byte Ethernet::buffer[1000]; BufferFiller bfill; static word homePage() { bfill = ether.tcpOffset(); bfill.emit_p(PSTR( "<html><head><meta charset='UTF-8'>" "<h1>Привет МИР!!!</h>" "</html> " )); return bfill.position(); } void setup () { Serial.begin(9600); ether.begin(sizeof Ethernet::buffer, mymac); ether.staticSetup(myip); } void loop () { word pos = ether.packetLoop(ether.packetReceive()); if (pos){ ether.httpServerReply(homePage()); }}
Для просмотра содержимого страницы Вы должны ввести в адресную строку браузера IP адрес сервера на ENC28J60. Он должен заранее прописан в скетче:
static byte myip[] = { 10,42,0,100 };
Если Вы подключили ENC28J60 к роутеру, то Вы должны использовать IP адрес внутренней сети. Например роутер имеет адрес 192.168.0.1 , то Вы можете выбрать любой не занятый IP адрес сети (к примеру 192.168.0.100).
У меня указан немного другой адрес, так как я подключил ENC28J60 напрямую к сетевой карте ПК, то моя сеть состоит всего из двух устройств (ПК и ENC28J60) и выбрал IP соответствующий именно этой сети.
В качестве МАС адреса можете использовать любые цифры (в шестнадцатеричной системе), главное чтобы он не совпадал с MAC адресами уст-в имеющихся в сети.
Термометр на DS18B20
В следующим примере будем использовать цифровой датчик температуры DS18B20. Датчик будет измерять температуру и его показания будут выводится на HTML страницу. Датчик температуры DS18B20 подключается к выходу PA4. HTML страница автоматически обновляется каждые 10 секунд.
// ENC28J60 - STM32F103 // VCC - 3.3V // GND - GND // SCK - Pin PA5 // SO - Pin PA6 // SI - Pin PA7 // CS - Pin PA8 // Указанные библиотеки входят в состав набора библиотек Arduino_STM32-master.zip #include <EtherCard_STM.h> #include <SPI.h> #include <OneWireSTM.h> OneWire ds(4); // PA4 byte i,present = 0,type_s = 0, data[12], addr[8]; float celsius; int temp0,temp1; unsigned long times; static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; static byte myip[] = { 10,42,0,100 }; byte Ethernet::buffer[5000]; BufferFiller bfill; static word homePage() { bfill = ether.tcpOffset(); bfill.emit_p(PSTR( "<html><head><meta charset='UTF-8'>" "<meta http-equiv='refresh' content='10'/>"// обновление страницы каждые 10 секунд "<h1>Температура: $D.$D °C</h1>" "</html> " ),temp0,temp1); return bfill.position(); } void setup () { Serial.begin(9600); ether.begin(sizeof Ethernet::buffer, mymac); ether.staticSetup(myip); } void loop () { if(millis()-times>2000){ ///////// 18b20 ////////////////////// if ( !ds.search(addr)) {ds.reset_search();delay(250);return;} ds.reset();ds.select(addr);ds.write(0x44, 1);delay(250); present = ds.reset();ds.select(addr);ds.write(0xBE); for (i = 0; i < 9; i++) {data[i] = ds.read();} int16_t raw = (data[1] << 8) | data[0];if (type_s) {raw = raw << 3;}celsius = (float)raw / 16.0; //////// end 18b20 //////////////////// } temp0 = int(celsius); temp1 = (celsius-temp0)*100; word pos = ether.packetLoop(ether.packetReceive()); if (pos){ ether.httpServerReply(homePage()); }}
Терморегулятор DS18B20
Следующий пример позволяет реализовать терморегулятор с управлением через HTML страницу. Вы можете задать температуру регулирования, при достижении которой изменяется логическое состояние выхода PB7 STM32. Так же можно задать время обновления страницы. Установленная температура регулирования и время обновления страницы заносится в энергонезависимую память.
// ENC28J60 - STM32F103 // VCC - 3.3V // GND - GND // SCK - Pin PA5 // SO - Pin PA6 // SI - Pin PA7 // CS - Pin PA8 // Указанные библиотеки входят в состав набора библиотек Arduino_STM32-master.zip #include <EtherCard_STM.h> #include <SPI.h> #include <OneWireSTM.h> #include <EEPROM.h> OneWire ds(4); // PA4 byte i,present = 0,type_s = 0, data[12], addr[8]; float celsius; int temp0,temp1,reg,a,w,timer; String line; unsigned long times; const byte gis=1; // Гистерезис 1 градус static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; static byte myip[] = { 10,42,0,100 }; byte Ethernet::buffer[5000]; BufferFiller bfill; static word HTML() { bfill = ether.tcpOffset(); bfill.emit_p(PSTR( "<html><head><meta charset='UTF-8'>" "<meta http-equiv='refresh' content='$D'/></head>" "<style>.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}a{color:#333;</style></head>" "<br><TABLE class='tab1' align='center' width='470' BORDER='1' cellspacing='0' cellpadding='10'>" "<td><center><big><b>Терморегулятор STM32 DS18B20</b></big></td><tr><td><center>" "Температура: <b>$D.$D </b>°C" "</td><tr><td align='center'>Установка температуры регулирования (0...125°C)" "<form action='' method='GET'>" "<br><input type='text' name='reg' autocomplete='off' size='1'></input> " "<button type='submit'>Подтвердить</button></form></td><tr>" "<td><center>Температура регулировки: <b>$D °C</b></td>" "<tr><td><center><small>Время обновления страницы каждые $D сек | <b><a href='/?p=5'>5 сек</a> <a href='/?p=10'>10 сек</a> <a href='/?p=30'>30 сек</a> <a href='/?p=60'>1 мин</a></b>" "</td></table></center></html>" ),timer,temp0,temp1,reg,timer); return bfill.position(); } void setup () { Serial.begin(9600); EEPROM.init(0x801F000,0x801F800,0x400);// 1024 byte ether.begin(sizeof Ethernet::buffer, mymac); ether.staticSetup(myip); pinMode(PB7, OUTPUT); // PB7 управление реле нагревательного элемента reg = EEPROM.read(10);timer = EEPROM.read(11); } void loop () { if(millis()-times>2000){ ///////// 18b20 ////////////////////// if ( !ds.search(addr)) {ds.reset_search();delay(250);return;} ds.reset();ds.select(addr);ds.write(0x44, 1);delay(250); present = ds.reset();ds.select(addr);ds.write(0xBE); for (i = 0; i < 9; i++) {data[i] = ds.read();} int16_t raw = (data[1] << 8) | data[0];if (type_s) {raw = raw << 3;}celsius = (float)raw / 16.0; //////// end 18b20 //////////////////// } temp0 = int(celsius); temp1 = (celsius-temp0)*100; if(reg >= celsius + gis){digitalWrite(PB7,HIGH);} if(reg <= celsius - gis){digitalWrite(PB7,LOW);} word pos = ether.packetLoop(ether.packetReceive()); if (pos){ char *data = (char *) Ethernet::buffer + pos; line = data; a = line.indexOf("?reg=");if(a>0){reg = line.substring(a+5, a+8).toInt();w=1; if(reg<0){reg=0;}if(reg>125){reg=125;}} a = line.indexOf("?p=");if(a>0){timer = line.substring(a+3, a+6).toInt();w=1;} ether.httpServerReply(HTML()); if(w==1){w=0;EEPROM.update(10,reg);EEPROM.update(11,timer);} }}