Тема: STM32 + ENC28J60
Много страничная реализация веб-сервера
// 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,html;
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();
if(html==0){
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><big><b><a href='/?html=0'>Терморегулятор</a> | "
"<a href='/?html=1'>Реле</a></b></big><tr>"
"<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);
}
if(html==1){
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><big><b><a href='/?html=0'>Терморегулятор</a> | "
"<a href='/?html=1'>Реле</a></b></big><tr>"
"<td><center><big><b>Реле времени</b></big></td><tr><td><center>"
// код реле времени
"<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,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(50);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;}
a = line.indexOf("?html=");if(a>0){html = line.substring(a+6, a+7).toInt();w=1;}
ether.httpServerReply(HTML());
if(w==1){w=0;EEPROM.update(10,reg);EEPROM.update(11,timer);}
}}