Ethernet, URM37 и прерывания
- Войдите на сайт для отправки комментариев
Ср, 30/05/2012 - 09:10
Есть бак с водой. В крыше стоит ультразвуковой дальномер URM37, который следит за уровнем. Есть насос, который подкачивает воду в бак. Задача стоит в том, чтобы периодически отсылать текущий уровень по ethernet и получать команды на включение/выключение насоса.
В loop запускаю ethernet server, он принимает команды. Опрос датчика и отсылку делаю через таймер.
Если не подключать URMSerial и SoftwareSerial и просто отправлять по таймеру какие-то данные, то всё нормально, но с ними всё виснет, даже перестает получать данные сервер в loop
#include <SPI.h>
#include <Ethernet.h>
//#include <MsTimer2.h>
#include <TimerOne.h>
#include <SoftwareSerial.h>
#include <URMSerial.h>
#define DISTANCE 1
#define TEMPERATURE 2
#define ERROR 3
#define NOTREADY 4
#define TIMEOUT 5
URMSerial urm;
byte mac[] = {
0x90, 0xA2, 0xDA, 0x0D, 0x0C, 0xDD };
IPAddress ip(188,204,102, 177);
IPAddress gateway(188,204,102, 254);
IPAddress subnet(255, 255, 0, 0);
IPAddress glav(188,204,102,60);
EthernetServer server = EthernetServer(5000);
EthernetClient sender;
int value;
int getMeasurement()
{
// Request a distance reading from the URM37
switch(urm.requestMeasurementOrTimeout(DISTANCE, value)) // Find out the type of request
{
case DISTANCE: // Double check the reading we recieve is of DISTANCE type
// Serial.println(value); // Fetch the distance in centimeters from the URM37
return value;
break;
case TEMPERATURE:
return value;
break;
case ERROR:
Serial.println("Error");
break;
case NOTREADY:
Serial.println("Not Ready");
break;
case TIMEOUT:
Serial.println("Timeout");
break;
}
return -1;
}
void setup() {
// initialize the ethernet device
Ethernet.begin(mac, ip, gateway, subnet);
// start listening for clients
server.begin();
// Open serial communications and wait for port to open:
Serial.begin(9600);
Serial.print("Chat server address:");
Serial.println(Ethernet.localIP());
urm.begin(6,7,9600);
// MsTimer2::set(10000, send);
// MsTimer2::start();
Timer1.initialize(8000000); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-and-off, per second)
Timer1.attachInterrupt(send); // attach the service routine here
}
void send()
{
if (sender.connect(glav, 5001))
{
Serial.print("Connected");
if (sender.connected())
{
Serial.println("Sending");
sender.print(getMeasurement());
Serial.println("Disconnecting");
sender.stop();
}
}
}
void loop() {
// // wait for a new client:
char inString[128];
EthernetClient client = server.available();
int i=0;
// when the client sends the first byte, say hello:
if (client)
{
i=0;
while (client.available()>0)
{
// read the bytes incoming from the client:
inString[i] = client.read();
i++;
}
Serial.write(inString);
client.stop();
}
}
Подскажите, что здесь не так.
а не пробовали поднять вэб сервер отдельно на машине, ардуину назначить клиентом, уровень воды и команды на включение насоса организовывать посредством get - запросов ?