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 - запросов ?