| Ваш IP: 3.239.7.207 | Online(23) - гости: 8, боты: 14 | Загрузка сервера: 1.44 ::::::::::::

STM32 + ENC28J60 (Arduino)

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 &#176;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>&#176;C"
 "</td><tr><td align='center'>Установка температуры регулирования (0...125&#176;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 &#176;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);}
}}

 

Добавить комментарий

Войти с помощью: 

Случайные статьи

  • Бестрансформаторный источник питания 12 В / 15 мА

    Бестрансформаторный источник питания 12 В / 15 мА

    Некоторые схемы которые имеют небольшой ток потребления, поэтому для их работы можно использовать простые бестрансформаторные источники питания. В подобных источниках питания целесообразно использовать диодный мост, для увеличения величины выходного тока и меньшей пульсации выходного напряжения, что позволяет использовать конденсаторный фильтр меньшей емкости. Поэтому в предложенной схеме VD3 VD4 используются как …Подробнее...
  • Секундомер на ATtiny2313 (Arduino IDE)

    Секундомер на ATtiny2313 (Arduino IDE)

    На базе ATtiny2313 можно собрать простой секундомер. Информация выводится на дисплей LCD1602. Для управления секундомером используются три кнопки — СТАРТ, СТОП, СБРОС. Минимальный шаг секундомера 0,1 секунда, максимальное время измерения 24 часа. Кнопки СТОП и СТАРТ работают через прерывания IN0 и INT1 (пример — https://rcl-radio.ru/?p=94273), время тактируется при помощи таймера …Подробнее...
  • Часы-будильник на PIC16F877A

    Часы-будильник на PIC16F877A

    На рисунке показана схема часов с будильником. Часы отображают часы, минуты и секунды, будильник только часы и минуты. Дополнительной опцией часов является термометр, датчик температуры LM35 подключен к выводу 9 (AN6) микроконтроллера. После подачи питания на микроконтроллер необходимо установить правильное время, сделать это можно при помощи кнопки «Установка времени», при …Подробнее...
  • Автоматическая регулировка усиления

    Автоматическая регулировка усиления

    Автоматическая регулировка усиления  (АРУ) регулирует выходной сигнал в определенных пределах, при разном уровне входного сигнала.В результате устраняются различия громкости, которые могут раздражать, при смене каналов радиоприемника, телевизора… Полевой транзистор VT1 используется как переменное сопротивление. Это значение может  от бесконечности до 150Ω, тем самым регулируя усиление ОУ на TL072.Подробнее...
  • Регулируемый блок питания с цифровым управлением

    Схема регулируемого блока питания м цифровым управлением состоит из регулятора положительного напряжен7ия на KM317, КПОМ декадного счетчика CD4017, таймера NE555 и регулятора отрицательного напряжения на LM7912. Напряжение сети понижается трансформатором до напряжения +/-12В при токе 1А во вторичной обмотке, далее оно выпрямляется. С1-С5 емкостной фильтр постоянного напряжения. Светодиод LED1 сигнализирует …Подробнее...