Ethernet, URM37 и прерывания

okulov
Offline
Зарегистрирован: 30.05.2012

 Есть бак с водой. В крыше стоит ультразвуковой дальномер 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();
  }
}

 Подскажите, что здесь не так.

Fess
Fess аватар
Offline
Зарегистрирован: 26.10.2011

а не пробовали поднять вэб сервер отдельно на машине, ардуину назначить клиентом, уровень воды и команды на включение насоса организовывать посредством get - запросов ?