Помогите разобраться с кодом управления реле.

veer1234
Offline
Зарегистрирован: 07.05.2013

Arduino+ethernet+relay - всё работает включается выключается из експлоера. Единственно, что при закрытии и затем открытии страницы все релешки сбрасываются на включено. Как сделать чтобы до нажатия кнопки refresh ничего не обновлялось?Как изменить чтобы при открытии всё было в позиции OFF, то есть на выходе ардуино логическая единица должна быть. Реле работает так - ноль включено, единица выключено. 

 

// sketch 10-02 Internet Pins
 
#include <SPI.h>
#include <Ethernet.h>
 
// MAC address just has to be unique. This should work
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// The IP address will be dependent on your local network:
byte ip[] = { 192, 168, 1, 35 };
EthernetServer server(80);
 
int numPins = 8;
int pins[] = {2, 3, 4, 5, 6, 7, 8, 9};
int pinState[] = {0, 0, 0, 0, 0};
char line1[100];
 
void setup()
{
  for (int i = 0; i < numPins; i++)
  {
     pinMode(pins[i], OUTPUT);
  }
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
 
  server.begin();
}
 
void loop()
{
  EthernetClient client = server.available();
  if (client) 
  {
    while (client.connected()) 
    {
      readHeader(client);
      if (! pageNameIs("/"))
      {
        client.stop();  
        return;
      }
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println();
 
      // send the body
      client.println("<html><body>");
      client.println("<h1>Umnii Dom Agrarnik-23</h1>");
      client.println("<form method='GET'>");  
      setValuesFromParams();
      setPinStates();
      for (int i = 0; i < numPins; i++)
      {
         writeHTMLforPin(client, i);
      }
      client.println("<input type='submit' value='Refresh'/>");
      client.println("</form>");
      client.println("</body></html>");
 
      client.stop();            
    }
  }
}
 
void writeHTMLforPin(EthernetClient client, int i)
{
  client.print("<p>Pin ");
  client.print(pins[i]);  
  client.print("<select name='");
  client.print(i);
  client.println("'>");
  client.print("<option value='0'");
  if (pinState[i] == 0)
  {
    client.print(" selected");
  }
  client.println(">ON</option>");
  client.print("<option value='1'");
  if (pinState[i] == 1)
  {
    client.print(" selected");
  }
  client.println(">OFF</option>");
  client.println("</select></p>");  
}
 
void setPinStates()
{
  for (int i = 0; i < numPins; i++)
  {
     digitalWrite(pins[i], pinState[i]);
  }
}
 
void setValuesFromParams()
{
  for (int i = 0; i < numPins; i++)
  {
    pinState[i] = valueOfParam(i + '0');
  }
}
 
void readHeader(EthernetClient client)
{
  // read first line of header
  char ch;
  int i = 0;
  while (ch != '\n')
  {
    if (client.available())
    {
      ch = client.read();
      line1[i] = ch;
      i ++;
    }
  }
  line1[i] = '\0'; 
  Serial.println(line1);
}
 
boolean pageNameIs(char* name)
{
   // page name starts at char pos 4
   // ends with space
   int i = 4;
   char ch = line1[i];
   while (ch != ' ' && ch != '\n' && ch != '?')
   {
     if (name[i-4] != line1[i])
     {
       return false;
     }
     i++;
     ch = line1[i];
   }
   return true;
}
 
int valueOfParam(char param)
{
  for (int i = 0; i < strlen(line1); i++)
  {
    if (line1[i] == param && line1[i+1] == '=')
    {
      return (line1[i+2] - '0');
    }
  }
  return 0;
}
maksim
Offline
Зарегистрирован: 12.02.2012
Geronimo
Offline
Зарегистрирован: 06.05.2013

В сетапе вырубили реле послав ей единицу

maksim
Offline
Зарегистрирован: 12.02.2012
// sketch 10-02 Internet Pins

#include <SPI.h>
#include <Ethernet.h>

// MAC address just has to be unique. This should work
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// The IP address will be dependent on your local network:
byte ip[] = { 
  192, 168, 137, 35 };
EthernetServer server(80);

int numPins = 8;
int pins[] = {2, 3, 4, 5, 6, 7, 8, 9};
int pinState[] = {0, 0, 0, 0, 0};
char line1[100];

void setup()
{
  for (int i = 0; i < numPins; i++) 
  {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], 1);
  }
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  EthernetClient client = server.available();
  if (client) 
  {
    while (client.connected()) 
    {
      readHeader(client);
      if (!pageNameIs("/"))
      {
        client.stop();  
        return;
      }
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println();

      // send the body
      client.println("<html><body>");
      client.println("<h1>Umnii Dom Agrarnik-23</h1>");
      client.println("<form method='GET'>");    
      setValuesFromParams();
      setPinStates(); 
      for (int i = 0; i < numPins; i++) writeHTMLforPin(client, i);          
      client.println("<input type='submit' value='Refresh'/>");
      client.println("</form>");
      client.println("</body></html>");
      client.stop();        
    }
  }
}

void writeHTMLforPin(EthernetClient client, int i)
{
  client.print("<p>Pin ");
  client.print(pins[i]);  
  client.print("<select name='");
  client.print(i);
  client.println("'>");
  client.print("<option value='0'");
  if (pinState[i] == 0) client.print(" selected");
  client.println(">OFF</option>");
  client.print("<option value='1'");
  if (pinState[i] == 1) client.print(" selected");
  client.println(">ON</option>");

  client.println("</select></p>");  
}

void setPinStates()
{
  for (int i = 0; i < numPins; i++)
    digitalWrite(pins[i], !pinState[i]);
}

void setValuesFromParams()
{
  for (int i = 0; i < numPins; i++)
  {
    int b = valueOfParam(i+'0');
    if(b != 2) pinState[i] = b;
  }
}

void readHeader(EthernetClient client)
{
  // read first line of header
  char ch;
  int i = 0;
  while (ch != '\n')
  {
    if (client.available())
    {
      ch = client.read();
      line1[i] = ch;
      i++;
    }
  }
  line1[i] = '\0'; 
  Serial.println(line1);
}

boolean pageNameIs(char* name)
{
  // page name starts at char pos 4
  // ends with space
  int i = 4;
  char ch = line1[i];
  while (ch != ' ' && ch != '\n' && ch != '?')
  {
    if (name[i-4] != line1[i])
      return false;
    i++;
    ch = line1[i];
  }
  return true;
}

int valueOfParam(char param)
{
  for (int i = 0; i < strlen(line1); i++)
    if (line1[i] == param && line1[i+1] == '=') 
      return (line1[i+2] - '0');
  return 2;
}

Проблема была в том что функция, которая парсит состояние переключателей возвращала 0 и при состоянии выключателя ON и при отсутствии данных, поэтому при подключении клиента при отсутствии данных все реле втавали в состояние ON.

veer1234
Offline
Зарегистрирован: 07.05.2013

Спасибо огромное, всё заработало как надо! 

veer1234
Offline
Зарегистрирован: 07.05.2013

Спасибо огромное, всё заработало как надо!