19-02-2016, 11:42
Witam
Ponieważ jestem początkującym w programowaniu Arduino mam problem ze zmianą pewnego parametru w kodzie, którego zadaniem jest sterowanie czterema wyjściami za pośrednictwem formularza wyświetlanego przez przeglądarkę internetową. Dodatkowo 2 z tych wyjść są załączane oraz wyłączane o określonej godzinie. Wszystko działa prawidłowo tylko chciałbym aby po włączeniu Arduino wszystkie cztery wyjścia ustawiały się w stan wysoki. Mam płytkę przekaźników sterowaną sygnałem niskim i nie chcę aby po włączeniu Arduino załączały mi się przekaźniki. Zmiana wartości w tablicy pinState[] nie przynosi oczekiwanego rezultatu więc jeśli ktoś z was będzie wiedział który parametr zmienić to będę wdzięczy za pomoc.
Ponieważ jestem początkującym w programowaniu Arduino mam problem ze zmianą pewnego parametru w kodzie, którego zadaniem jest sterowanie czterema wyjściami za pośrednictwem formularza wyświetlanego przez przeglądarkę internetową. Dodatkowo 2 z tych wyjść są załączane oraz wyłączane o określonej godzinie. Wszystko działa prawidłowo tylko chciałbym aby po włączeniu Arduino wszystkie cztery wyjścia ustawiały się w stan wysoki. Mam płytkę przekaźników sterowaną sygnałem niskim i nie chcę aby po włączeniu Arduino załączały mi się przekaźniki. Zmiana wartości w tablicy pinState[] nie przynosi oczekiwanego rezultatu więc jeśli ktoś z was będzie wiedział który parametr zmienić to będę wdzięczy za pomoc.
Kod:
// szkic 10.02. Obsługa złącz za pośrednictwem sieci
#include <SPI.h>
#include <Ethernet.h>
#include <DS1302.h>
#include <Time.h>
// Adres MAC musi być unikalny. Poniższy adres nie powinien powodować konfliktów.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// Adres IP jest zależny od Twojej lokalnej sieci
byte ip[] = { 192, 168, 2, 2 };
DS1302 rtc(8, 7, 6);
EthernetServer server(80);
String godzstr;
int numPins = 4;
int pins[] = {2, 3, 5, 9};
int pinState[] = {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()
{
kamery_on_off();
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();
// wysyła właściwą treść formularza
client.println("<html><body>");
client.println("<h1>Piny wyjścia</h1>");
client.println("<form method='GET'>");
setValuesFromParams();
setPinStates();
for (int i = 0; i < numPins; i++)
{
writeHTMLforPin(client, i);
}
client.println("<input type='submit' value='Uaktualnij'/>");
client.println("</form>");
client.println("</body></html>");
client.stop();
}
}
}
void kamery_on_off()
{
godzstr = rtc.getTimeStr();
int uur = godzstr.substring(0, 2).toInt();
int mmr = godzstr.substring(3, 5).toInt();
if (uur == 20 && mmr == 18)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
}
else {
}
if (uur == 20 && mmr == 20)
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
}
else {
}
}
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(">Nieaktywny</option>");
client.print("<option value='1'");
if (pinState[i] == 1)
{
client.print(" selected");
}
client.println(">Aktywny</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)
{
// wczytuje pierwszą linię nagłówka
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)
{
// nazwa strony zaczyna się od znaku znajdującego się na pozycji o numerze 4
// kończy się spacją
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;
}