Помогите разобраться с кодом управления реле.
- Войдите на сайт для отправки комментариев
Ср, 08/05/2013 - 16:32
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;
}
Вставка программного кода в тему/комментарий
В сетапе вырубили реле послав ей единицу
// 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.
Спасибо огромное, всё заработало как надо!
Спасибо огромное, всё заработало как надо!