Web - server на Arduino mega, nano для управления через Интернет с использованием GET запроса
Практика для студентов. Мясищев А.А.
1.Arduino mega (1280)
Здесь используется среда программирования Arduino IDE 1.0.3, 1.0.5-r2
С поздними версиями могут не работать библиотеки etherShield, ETHER_28J60
Фото сервера на Arduino mega
Интерфейс управления сервером на Arduino mega
Программа web-сервера на Arduino mega с контроллеров ethernet enc28j60
#include "etherShield.h"
#include "ETHER_28J60.h"
#include <OneWire.h>
#include <stdio.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
static uint8_t mac[6] = {0x54, 0x51, 0x58, 0x10, 0x00, 0x24};
static uint8_t ip[4] = {192, 168, 1, 18};
static uint16_t port = 81;
ETHER_28J60 e;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
char buf[30];
void setup()
{
sensors.begin();
e.setup(mac, ip, port);
pinMode(13, OUTPUT);
pinMode(5, OUTPUT);
pinMode(7, OUTPUT);
}
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
void loop()
{
char* buffer;
if (buffer = e.serviceRequest())
{
e.print("<FONT size=5 color=green>Web - сервер на базе <font color=red>Arduino mega</FONT><br> и контроллера ethernet<font color=blue> ENC28J60</font></FONT><BR>");
e.print("<hr>");
char r=buffer[3];
char g=buffer[7];
char b=buffer[11];
if( r==0x31) digitalWrite(13,HIGH);
if( r==0x30) digitalWrite(13,LOW);
if( g==0x31) digitalWrite(5,HIGH);
if( g==0x30) digitalWrite(5,LOW);
if( b==0x31) digitalWrite(7,HIGH);
if( b==0x30) digitalWrite(7,LOW);
e.print("<FORM action=''>");
e.print("<FONT size=4 color=red>Красный светодиод:</FONT><BR>");
e.print("<INPUT type='radio' name='r' value='1'>ON<br>");
e.print("<INPUT type='radio' name='r' value='0'CHECKED>OFF<br><br>");
e.print("<FONT size=4 color=green>Зеленый светодиод:</FONT><BR>");
e.print("<INPUT type='radio' name='g' value='1'>ON<br>");
e.print("<INPUT type='radio' name='g' value='0'CHECKED>OFF<br><br>");
e.print("<FONT size=4 color=blue>Синий светодиод:</FONT><BR>");
e.print("<INPUT type='radio' name='b' value='1'>ON<br>");
e.print("<INPUT type='radio' name='b' value='0'CHECKED>OFF<br>");
e.print("<INPUT type='submit' value='Ввести'></FORM>");
sensors.requestTemperatures();
dtostrf(sensors.getTempCByIndex(0),7,2,buf);
e.print("<FONT size=4 color=broun>Температура </FONT>");
e.print("<FONT size=4 color=broun>"); e.print(buf); e.print(" градусов C</font><br><br>");
if (digitalRead(13)){ e.print("<font size=4 color=red>Красный светодиод ВКЛЮЧЕН</font><br>"); }
else{ e.print("<font size=4 color=red>Красный светодиод ВЫКЛЮЧЕН</font><br>"); }
if (digitalRead(5)){ e.print("<font size=4 color=green>Зеленый светодиод ВКЛЮЧЕН</font><br>");}
else{ e.print("<font size=4 color=green>Зеленый светодиод ВЫКЛЮЧЕН</font><br>"); }
if (digitalRead(7)){e.print("<font size=4 color=blue>Синий светодиод ВКЛЮЧЕН</font><br>"); }
else{ e.print("<font size=4 color=blue>Синий светодиод ВЫКЛЮЧЕН</font><br>"); }
e.print("<hr>"); e.print("Free SRAM:");
e.print(freeRam());
e.respond();
}
delay(1);
}
Изменения в файлах библиотек:
1. библиотека etherShield
файл enc28j60.c
#define ENC28J60_CONTROL_CS 53 //10 Меняем пины шины SPI Arduino UNO на Arduino mega
#define SPI_MOSI 51 //11
#define SPI_MISO 50 //12
#define SPI_SCK 52 //13
2. библиотека ETHER_28J60
файл ETHER_28J60.cpp
#define BUFFER_SIZE 1500 // Увеличиваем размер пакета
plen=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n<h1>200 OK</h1>")); // Разрешаем кириллицу
plen=es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n"));
// Разрешаем кириллицу
2.Arduino nano (328p)
Здесь используется среда программирования Arduino IDE 1.0.3, 1.0.5-r2
С поздними версиями могут не работать библиотеки etherShield, ETHER_28J60
Фото сервера на Arduino nano
Интерфейс управления сервером на Arduino nano
Программа web-сервера на Arduino nano с контроллеров ethernet enc28j60
#include "etherShield.h"
#include "ETHER_28J60.h"
#include <OneWire.h>
#include <stdio.h>
#include <Flash.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};
static uint8_t ip[4] = {192, 168, 1, 18};
static uint16_t port = 81;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
ETHER_28J60 e;
OneWire ds(2);
char buf[10];
char buff[130];
FLASH_STRING(st,
"<FONT size=5 color=green>Web-server on <font color=red><br>Arduino Nano</FONT><br> and <font color=blue>ENC28J60</font></font><BR>");
FLASH_STRING(st1,"<FORM action=''>");
FLASH_STRING(st2,"<FONT size=4 color=red>Red LED:</FONT><BR>");
FLASH_STRING(st3,"<INPUT type='radio' name='r' value='1'>ON<br>");
FLASH_STRING(st4,"<INPUT type='radio' name='r' value='0'CHECKED>OFF<br><br>");
FLASH_STRING(st5,"<FONT size=4 color=green>Green LED:</FONT><BR>");
FLASH_STRING(st6,"<INPUT type='radio' name='g' value='1'>ON<br>");
FLASH_STRING(st7,"<INPUT type='radio' name='g' value='0'CHECKED>OFF<br><br>");
FLASH_STRING(st8,"<FONT size=4 color=blue>Blue LED:</FONT><BR>");
FLASH_STRING(st9,"<INPUT type='radio' name='b' value='1'>ON<br>");
FLASH_STRING(st10,"<INPUT type='radio' name='b' value='0'CHECKED>OFF<br>");
FLASH_STRING(st11,"<INPUT type='submit' value='Input'></FORM>");
FLASH_STRING(st17,"<FONT size=4 color=blue>Temperature C:</FONT>");
FLASH_STRING(st18,"<font size=4 color=red>Red LED ON</font><br>");
FLASH_STRING(st19,"<font size=4 color=red>Red LED OFF</font><br>");
FLASH_STRING(st20,"<font size=4 color=green>Green LED ON</font><br>");
FLASH_STRING(st21,"<font size=4 color=green>Green LED OFF</font><br>");
FLASH_STRING(st22,"<font size=4 color=blue>Blue LED ON</font><br>");
FLASH_STRING(st23,"<font size=4 color=blue>Blue LED OFF</font><br>");
void setup()
{
sensors.begin();
e.setup(mac, ip, port);
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(3,LOW);
digitalWrite(5,LOW);
digitalWrite(7,LOW);
}
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
void loop()
{
char* buffer;
if (buffer = e.serviceRequest())
{
st.copy(buff,131);
e.print(buff);
e.print("<br>");
char r=buffer[3];
char g=buffer[7];
char b=buffer[11];
if( r==0x31) digitalWrite(3,HIGH);
if( r==0x30) digitalWrite(3,LOW);
if( g==0x31) digitalWrite(5,HIGH);
if( g==0x30) digitalWrite(5,LOW);
if( b==0x31) digitalWrite(7,HIGH);
if( b==0x30) digitalWrite(7,LOW);
st1.copy(buff,80);
e.print(buff);
st2.copy(buff,80); e.print(buff);
st3.copy(buff,80); e.print(buff);
st4.copy(buff,80); e.print(buff);
st5.copy(buff,80); e.print(buff);
st6.copy(buff,80); e.print(buff);
st7.copy(buff,80); e.print(buff);
st8.copy(buff,80); e.print(buff);
st9.copy(buff,80); e.print(buff);
st10.copy(buff,80); e.print(buff);
st11.copy(buff,80); e.print(buff);
sensors.requestTemperatures();
dtostrf(sensors.getTempCByIndex(0),7,2,buf);
st17.copy(buff,80); e.print(buff);
e.print("<FONT size=4 color=blue>");e.print(buf); e.print("</font>"); e.print("<br><br>");
if (digitalRead(3)){ st18.copy(buff,121); e.print(buff);
}
else{ st19.copy(buff,80); e.print(buff);
}
if (digitalRead(5)){ st20.copy(buff,80); e.print(buff);
}
else{st21.copy(buff,80); e.print(buff);
}
if (digitalRead(7)){st22.copy(buff,80); e.print(buff);
}
else{ st23.copy(buff,80); e.print(buff);
}
e.print("<br>"); e.print("Free SRAM:");
e.print(freeRam());
e.respond();
}
delay(1);
}
Особенность программы в том, что из-за малой памяти SRAM микроконтроллера atmega 328p переменные записываются в память программ. Для этого используется библиотека Flash
Изменения в файлах библиотек:
Библиотека ETHER_28J60
файл ETHER_28J60.cpp
#define BUFFER_SIZE 1000 // Увеличиваем размер пакета