Arduino web server + Virtual wire
Добавлено: Ср авг 07, 2013 12:49 pm
Привет,
может кто сталкивался с такой проблемой -- есть Arduino с ethernet-shield-ом и модулем передатчика на 433Mhz. Хочу сделать так, чтобы при отправке определённого HTTP-запроса на контроллер, он посылал соответствующий пакет в эфир. Столкнулся с такой проблемой -- если в скетче используется одновременно web-сервер и virtualwire, то первый просто не отвечает, хотя контроллер работает и к нему можно подсоединиться по ком-порту, принять/отправить в него данные и т.п.
Ниже привожу полный скетч, но самая проблемная строчка это вот эта:
т.е. как только "завожу" VirtualWire, так веб-сервер не работает. убираю эту строчку и веб-сервер работает как положено, но, соответственно, не работает VirtualWire.
пробовал использовать другие PIN-ы для VirtualWire -- не помогает.
думаю может какой конфликт использования прерываний контроллера... если делать обратную связку, в которой контроллер выступает в роли веб-клиента, а VirtualWire используется как приёмник, то всё хорошо -- данные принимаются из эфира и передаются в ethernet-сеть. затык именно с веб-сервером.
может у знатоков какие идеи?
полный код скетча:
может кто сталкивался с такой проблемой -- есть Arduino с ethernet-shield-ом и модулем передатчика на 433Mhz. Хочу сделать так, чтобы при отправке определённого HTTP-запроса на контроллер, он посылал соответствующий пакет в эфир. Столкнулся с такой проблемой -- если в скетче используется одновременно web-сервер и virtualwire, то первый просто не отвечает, хотя контроллер работает и к нему можно подсоединиться по ком-порту, принять/отправить в него данные и т.п.
Ниже привожу полный скетч, но самая проблемная строчка это вот эта:
Код: Выделить всё
vw_setup(2000);
пробовал использовать другие PIN-ы для VirtualWire -- не помогает.
думаю может какой конфликт использования прерываний контроллера... если делать обратную связку, в которой контроллер выступает в роли веб-клиента, а VirtualWire используется как приёмник, то всё хорошо -- данные принимаются из эфира и передаются в ethernet-сеть. затык именно с веб-сервером.
может у знатоков какие идеи?
полный код скетча:
Код: Выделить всё
#include <Ethernet.h>
#include <SPI.h>
#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
byte mac[] = { 0xDA, 0x7D, 0x5E, 0xDF, 0xCE, 0xED };
IPAddress ip(192,168,0,75);
String url = String(25);
int maxLength=25;
EthernetServer server(80);
#define PIN_LED 13
#define PIN_RF A0
//create object
EasyTransferVirtualWire ET;
struct SEND_DATA_STRUCTURE{
//put your variable definitions here for the data you want to send
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
//Struct can'e be bigger then 26 bytes for VirtualWire version
unsigned int device_id;
unsigned int destination_id;
unsigned int packet_id;
byte command;
int data;
};
//give a name to the group of data
SEND_DATA_STRUCTURE mydata;
void setup() {
pinMode(PIN_LED, OUTPUT); // sets the pin as output
Serial.begin(9600);
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
ET.begin(details(mydata));
vw_set_tx_pin(PIN_RF);
vw_setup(2000); // !!!!!!!!
}
void loop() {
char rcvChar;
int bCommandReady = false;
// web server
// listen for incoming clients
EthernetClient client = server.available();
//webClient = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (url.length() < maxLength) {
url+=(c);
}
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
Serial.println("Web request:");
Serial.println(url);
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html><head><title>Arduino</title></head><body>OK");
bCommandReady = false;
client.println("</body><html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
url = "";
client.stop();
Serial.println("client disonnected");
}
}