Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

Дядя Женя
2022-06-04 14:17:46

Добрый день. Совсем новичок в работе с Ардуино. Но встала задача разобраться с его работой. В первую очередь интересует, есть ли на плате W5100 те же проблемы с железом, что и на enc28j60? Тоесть работает ли стабильно? Кроме того, так и не понял, получает ли плата адрес по dhcp? И нужно ли плату запитывать отдельно?

gorotoro
2021-06-30 03:10:13

Воно в принципі повинно працювати глючно.
По-перше, фільтр дебаунс треба чіпляти на переривання від таймеру
По-друге - повикидати delay(), бо система високочастотна і 1-5 мілісекунд - дуже багато. У вас під час затримок щось приходить, воно не аналізується - і маєте глюки

Владислав2000
2019-03-02 14:38:47

приветствую
Так а скетчи - можно удаленно заливать на ардуино ( и запускать ) через Ethernet ?

Какие решения чтобы напряжение POE снимать ? Какие решения по радиатору на shield ?

komsadiman
2016-11-08 10:55:41

Добрый день, помогите люди добрые я уже неделю парюсь не как не пойму в чом дело, я взял Ваш код за основу и пытаюсь его переделать под 4 реле но всё встало на двух так как в момент переключение одной реле дергается вторая (когда включаешь второе реле моргает первая), никак не пойму в чом дело помогите пожалуйста.

#include <Ethernet.h>


// задаем константы
const int Relay1 = 8;       
const int Relay2 = 13;       
 
// переменные
boolean Relay1On = true;        // Текущее состояние реле
boolean Relay2On = true;        // Текущее состояние реле

String readString = String(30);


// объявляем переменную MY_IP со значением 10.36.1.52
#define MY_IP "192.168.3.222"
// указываем настройки сетевого интерфейса и порт веб-сервера
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 3, 222);
EthernetServer server(80);


void setup() {
  delay(500);
  
/*
 * без строки "digitalWrite(Relay1, HIGH);" перед "pinMode" при включении
 * ардуины будет происходить кратковременное переключение реле,
 * а значит кратковременно подастся питание, что нам категорически
 * не надо!
 */
  digitalWrite(Relay1, HIGH);
 // digitalWrite(Relay2, HIGH);
  
  // инициализируем пин, подключенный к реле, как выход
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);


// стартуем сетевой интерфейс
Ethernet.begin(mac, ip);
server.begin();


Serial.begin(9600);
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}

/*
 * функция сглаживания дребезга
 * принимает в качестве аргумента предыдущее состояние кнопки
 * и выдаёт фактическое.
 */



void loop() {
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);

if (readString.length() < 30) {
readString.concat( c); }
Serial.print( c);
        
if (c == '\n' && currentLineIsBlank) {
if (c == '\n') {
//Проверяем включили ли реле и светодиод?
//Level=1 - включен
//Level=0 - выключен
if(readString.indexOf("Level=1") >=0) {
//Включаем реле
digitalWrite(Relay1, LOW);
Relay1On = false;

}else if(readString.indexOf("Level=0") >=0){
//Выключаем реле
digitalWrite(Relay1, HIGH);
Relay1On = true;
}
if(readString.indexOf("Level2=1") >=0) {
//Включаем реле
digitalWrite(Relay2, LOW);
Relay2On = false;

}else if(readString.indexOf("Level2=0") >=0){
//Выключаем реле
digitalWrite(Relay2, HIGH);
Relay2On = true;
}
 

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");  // the connection will be closed after completion of the response
//client.println("Refresh: 5");  // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> ");
//client.println("<head><meta http-equiv=\"refresh\" content=\"5;URL=http://"MY_IP"/\"></head>");
client.println(F("<body>"));
client.println(F("<center><head><title>Гараж</title></head>"));

if (Relay1On){
client.println("<form method=get name=LED><input type=radio name=Level value=1 CHECKED>Включить");
client.println("<input type=radio name=Level value=0>Выключить");
client.println("<input type=submit value=Применить></form>");
client.println("<font size=’5′>Состояние реле: ");
client.println("<font size=’5′>Выкл. 1");
client.println("<br></br>");
}else{
client.println("<form method=get name=LED><input type=radio name=Level value=1>Включить");
client.println("<input type=radio name=Level value=0 CHECKED>Выключить");
client.println("<input type=submit value=Применить></form>");
client.println("<font size=’5′>Состояние реле: ");
client.println("<font size=’5′>Вкл 1");
client.println("<br></br>");
}

if (Relay2On){
client.println("<font color=\"red\"><a href=\"/?Level2=1\"\">ВКЛ</a>");
client.println("<font size=’5′>Состояние реле: ");
client.println("<font size=’5′>Выкл. 2");
client.println("<br></br>");
}else{
client.println("<font color=\"green\"><a href=\"/?Level2=0\"\">ВЫКЛ</a>");
client.println("<font size=’5′>Состояние реле: ");
client.println("<font size=’5′>Вкл 2");
client.println("<br></br>");
}

readString="";
//останавливаем web-client
client.stop();
          }
        }
      }
    }

// часть кода для кнопки, реле и светодиода

{
  Relay1On = !Relay1On;
}
{
   Relay2On = !Relay2On;
}
digitalWrite(Relay1, Relay1On);                         // Изменить статус состояния реле
digitalWrite(Relay2, Relay2On); 

}
}
z0ri
2016-03-15 17:09:11
Selest пише:

Я так понимаю что записи состояния в память нет ( на случай пропадания питания ) ?

Нет, состояние в память не записывается, данный функционал для реализации моей идеи не нужен, а скорее даже вреден.

Selest
2016-03-08 12:01:02

Я так понимаю что записи состояния в память нет ( на случай пропадания питания ) ?

z0ri
2016-02-16 17:17:21

Итого получился такой код, думаю на нём и остановлюсь (по крайней мере это работает, выкладываю, на случай, если кому понадобится):

#include <Ethernet.h>


// задаем константы
const int ledPin =  6;     // номер выхода светодиода
const int buttonPin = 2;    // номер входа, подключенный к кнопке
const int Relay1 = 5;       // к 5-ому пину подключено IN1 реле
 
// переменные
boolean lastButton = LOW;      // Переменная для сохранения предыдущего состояния кнопки
boolean currentButton = LOW;   // Переменная для сохранения текущего состояния кнопки
boolean ledOn = false;         // Текущее состояние светодиода (включен/выключен)
boolean Relay1On = true;        // Текущее состояние реле

String readString = String(30);


// объявляем переменную MY_IP со значением 10.36.1.52
#define MY_IP "10.36.1.52"
// указываем настройки сетевого интерфейса и порт веб-сервера
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 36, 1, 52);
EthernetServer server(80);


void setup() {
  delay(500);
  
/*
 * без строки "digitalWrite(Relay1, HIGH);" перед "pinMode" при включении
 * ардуины будет происходить кратковременное переключение реле,
 * а значит кратковременно подастся питание, что нам категорически
 * не надо!
 */
  digitalWrite(Relay1, HIGH);
  
  // инициализируем пин, подключенный к светодиоду, как выход
  pinMode(ledPin, OUTPUT);
  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT);
  // инициализируем пин, подключенный к реле, как выход
  pinMode(Relay1, OUTPUT);


// стартуем сетевой интерфейс
Ethernet.begin(mac, ip);
server.begin();


Serial.begin(9600);
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}

/*
 * функция сглаживания дребезга
 * принимает в качестве аргумента предыдущее состояние кнопки
 * и выдаёт фактическое.
 */
boolean debounce(boolean last){
  boolean current = digitalRead(buttonPin);    // Считать состояние кнопки
  if (last != current)                         // Если изменилось ...
  {
  delay(5);                                    // ждём 5 мс
  current = digitalRead(buttonPin);            // Считываем состояние кнопки
  return current;                              // Возвращаем состояние кнопки
  }
}

void loop() {
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
//    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
//        Serial.write(c);

if (readString.length() < 30) {
readString.concat( c); }
Serial.print( c);
        
//if (c == '\n' && currentLineIsBlank) {
if (c == '\n') {
//Проверяем включили ли реле и светодиод?
//Level=1 - включен
//Level=0 - выключен
if(readString.indexOf("Level=1") >=0) {
//Включаем реле
digitalWrite(Relay1, LOW);
Relay1On = false;
//Включаем светодиод
digitalWrite(ledPin, HIGH);
ledOn = true;

}else if(readString.indexOf("Level=0") >=0){
//Выключаем реле
digitalWrite(Relay1, HIGH);
Relay1On = true;
//Выключаем светодиод
digitalWrite(ledPin, LOW);
ledOn = false;
}
 

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");  // the connection will be closed after completion of the response
//client.println("Refresh: 5");  // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> ");
client.println("<head><meta http-equiv=\"refresh\" content=\"5;URL=http://"MY_IP"/\"></head>");
client.println(F("<body>"));
client.println(F("<center><head><title>Relay Control</title></head>"));

if (Relay1On){
client.println("<form method=get name=LED><input type=radio name=Level value=1 CHECKED>Включить");
client.println("<input type=radio name=Level value=0>Выключить");
client.println("<input type=submit value=Применить></form>");
client.println("<font size=’5′>Состояние реле: ");
client.println("<font size=’5′>Выкл.");
client.println("<br></br>");
}else{
client.println("<form method=get name=LED><input type=radio name=Level value=1>Включить");
client.println("<input type=radio name=Level value=0 CHECKED>Выключить");
client.println("<input type=submit value=Применить></form>");
client.println("<font size=’5′>Состояние реле: ");
client.println("<font size=’5′>Вкл");
client.println("<br></br>");
}

//client.print(F("<input type=button value='Main Light ON' onmousedown=location.href='/?LED_on'>"));
//client.println(F("<input type=button value='Main Light OFF' onmousedown=location.href='/?LED_off'><br/><br/>"));
client.println("<a href=\"/?Level=1\"\">Turn On Light</a><br />");
client.println("<a href=\"/?Level=0\"\">Turn Off Light</a><br />");
client.println(F("</center></body>"));
client.println("</html>");
readString="";
//останавливаем web-client
client.stop();
          }
        }
      }
    }

// часть кода для кнопки, реле и светодиода
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)   // Если нажатие (условия для светодиода на пине 6)
{
  ledOn = !ledOn;
}
if (lastButton == LOW && currentButton == HIGH)   // Если нажатие (условие для реле)
{
  Relay1On = !Relay1On;
}
lastButton = currentButton;
digitalWrite(ledPin, ledOn);                         // Изменить статус состояния светодиода
digitalWrite(Relay1, Relay1On);                         // Изменить статус состояния реле

}

Переключать реле можно как тактовой кнопкой, так и через веб-интерфейс. Светодиод на пине 6 - индикация состояния реле.
Спасибо всем отозвавшимся и неравнодушным.
P.S.: Эксперименты продолжаются ...

z0ri
2016-02-14 18:41:05

Дописался до следующего кода:

#include <Ethernet.h>

// задаем константы
const int ledPin =  6;     // номер выхода светодиода
const int buttonPin = 2;    // номер входа, подключенный к кнопке
const int Relay1 = 5;       // к 5-ому пину подключено IN1 реле
 
// переменные
boolean lastButton = LOW;      // Переменная для сохранения предыдущего состояния кнопки
boolean currentButton = LOW;   // Переменная для сохранения текущего состояния кнопки
boolean ledOn = false;         // Текущее состояние светодиода (включен/выключен)
boolean Relay1On = true;        // Текущее состояние реле

String readString = String(30);


// объявляем переменную MY_IP со значением 10.36.1.52
#define MY_IP "10.36.1.52"
// указываем настройки сетевого интерфейса и порт веб-сервера
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 36, 1, 52);
EthernetServer server(80);


void setup() {
  delay(500);
  
/*
 * без строки "digitalWrite(Relay1, HIGH);" перед "pinMode" при включении
 * ардуины будет происходить кратковременное переключение реле,
 * а значит кратковременно подастся питание, что нам категорически
 * не надо!
 */
  digitalWrite(Relay1, HIGH);
  
  // инициализируем пин, подключенный к светодиоду, как выход
  pinMode(ledPin, OUTPUT);
  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT);
  // инициализируем пин, подключенный к реле, как выход
  pinMode(Relay1, OUTPUT);


// стартуем сетевой интерфейс
Ethernet.begin(mac, ip);
server.begin();


Serial.begin(9600);
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}

/*
 * функция сглаживания дребезга
 * принимает в качестве аргумента предыдущее состояние кнопки
 * и выдаёт фактическое.
 */
boolean debounce(boolean last){
  boolean current = digitalRead(buttonPin);    // Считать состояние кнопки
  if (last != current)                         // Если изменилось ...
  {
  delay(5);                                    // ждём 5 мс
  current = digitalRead(buttonPin);            // Считываем состояние кнопки
  return current;                              // Возвращаем состояние кнопки
  }
}




void loop() {
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
//    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
//        Serial.write(c);

if (readString.length() < 30) {
readString.concat( c); }
Serial.print( c);
        
//        if (c == '\n' && currentLineIsBlank) {
if (c == '\n') {

        //Level=1 - включить реле
        //Level=0 - выключить реле
if(readString.indexOf("Level=1") >=0) {
//Включаем светодиод
digitalWrite(Relay1, LOW);
Relay1On = false;

ledOn = !ledOn;

}else if(readString.indexOf("Level=0") >=0){
//Выключаем светодиод
digitalWrite(Relay1, HIGH);
Relay1On = true;

ledOn = !ledOn;
}

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> ");
client.println("<head><meta http-equiv=\"refresh\" content=\"5;URL=http://"MY_IP"/\"></head>");
client.println(F("<body>"));
client.println(F("<center><head><title>Relay Control</title></head>"));

if (Relay1On){

digitalWrite(ledPin, ledOn);

client.println("<form method=get name=LED><input type=radio name=Level value=1 CHECKED>Включить");
client.println("<input type=radio name=Level value=0>Выключить");
client.println("<input type=submit value=Применить></form>");
client.println("<font size=’5′>Состояние реле: ");
client.println("<font size=’5′>Выкл.");
client.println("<br></br>");
}else{

client.println("<form method=get name=LED><input type=radio name=Level value=1>Включить");
client.println("<input type=radio name=Level value=0 CHECKED>Выключить");
client.println("<input type=submit value=Применить></form>");
client.println("<font size=’5′>Состояние реле: ");
client.println("<font size=’5′>Вкл");
client.println("<br></br>");
}

client.println("<a href=\"/?Level=1\"\">Turn On Light</a><br />");
client.println("<a href=\"/?Level=0\"\">Turn Off Light</a><br />");
client.println(F("</center></body>"));
client.println("</html>");
readString="";
//останавливаем web-client
client.stop();
          }
        }
      }
    }


// часть кода для кнопки, реле и светодиода
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)   // Если нажатие (условия для светодиода на пине 6)
{
  ledOn = !ledOn;
}
if (lastButton == LOW && currentButton == HIGH)   // Если нажатие (условие для реле)
{
  Relay1On = !Relay1On;
}
lastButton = currentButton;
digitalWrite(ledPin, ledOn);                         // Изменить статус состояния светодиода
digitalWrite(Relay1, Relay1On);                         // Изменить статус состояния реле

}

Он даже работает (удивительно "не причёсанный" код).
Однако есть одна неприятность.
Нажимая в браузере включить, реле переключается и светодиод на пин№ 6 включается Нажимаем в браузере выключить - реле разъединяет контакты и светодиод гаснет. Всё хорошо казалось бы. Нажимаем включить, опять переключается реле, включается светодиод, НО нажав включить повторно, реле остаётся в том же состоянии (что логично и так и должно быть) , а светодиод гаснет. То есть точность индикации состояния реле теряется. А это печально.

z0ri
2016-02-13 01:19:47
Йожэг пише:

В предыдущем скетче для другого сетевого модуля определение того, какая ссылка была нажата, сделано так:

    if (strstr((char *)Ethernet::buffer + pos, "GET /?ON") != 0) {
      setRelayState(true);
    } else if(strstr((char *)Ethernet::buffer + pos, "GET /?OFF") != 0) {

Т.е. просто ищем в буфере приёма запрос с "/?ON" или "/?OFF". А в этом новом скетче где определение ссылки адреса с командой внутри?

Вот это одни из тех строчек, что ввели в ступор. То есть ссылки вывести удалось,

client.println("<a href=\"/?LED_on\"\">Relay On</a><br />");
client.println("<a href=\"/?LED_off\"\">Relay Off</a><br />");

но этого мало. Строки про которую Вы говорите, в текущем скетче, я так понял, нету.
На просторах интернета я находил такой вариант, вроде бы даже рабочий. До секции setup:

String readString;

В секцию loop:

if (readString.length() < 100)
{
readString = readString + c;
}

и

if(readString.indexOf("/?LED_on") > 0) digitalWrite(Relay1, LOW);
if(readString.indexOf("/?LED_off") > 0) digitalWrite(Relay1, HIGH);
readString = "";

Но пока собрать матрёшку не получается.

Йожэг
2016-02-13 00:48:59

В предыдущем скетче для другого сетевого модуля определение того, какая ссылка была нажата, сделано так:

    if (strstr((char *)Ethernet::buffer + pos, "GET /?ON") != 0) {
      setRelayState(true);
    } else if(strstr((char *)Ethernet::buffer + pos, "GET /?OFF") != 0) {

Т.е. просто ищем в буфере приёма запрос с "/?ON" или "/?OFF". А в этом новом скетче где определение ссылки адреса с командой внутри?

z0ri
2016-02-12 23:43:01

Продолжается бой... Буду дописывать прогресс сюда, а вось кому пригодится.
Дописался до следующего кода:

#include <Ethernet.h>


// задаем константы
const int ledPin =  6;     // номер выхода светодиода
const int buttonPin = 2;    // номер входа, подключенный к кнопке
const int Relay1 = 5;       // к 5-ому пину подключено реле
 
// переменные
boolean lastButton = LOW;      // Переменная для сохранения предыдущего состояния кнопки
boolean currentButton = LOW;   // Переменная для сохранения текущего состояния кнопки
boolean ledOn = false;
boolean Relay1On = true;


// объявляем переменную MY_IP со значением 10.36.1.52
#define MY_IP "10.36.1.52"
// указываем настройки сетевого интерфейса и порт веб-сервера
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 36, 1, 52);
EthernetServer server(80);


void setup() {
  delay(500);
  
/*
 * без строки "digitalWrite(Relay1, HIGH);" перед "pinMode" при включении
 * ардуины будет происходить кратковременное переключение реле,
 * а значит кратковременно подастся питание, что нам категорически
 * не надо!
 */
  digitalWrite(Relay1, HIGH);
  
  // инициализируем пин, подключенный к светодиоду, как выход
  pinMode(ledPin, OUTPUT);
  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT);
  // инициализируем пин, подключенный к реле, как выход
  pinMode(Relay1, OUTPUT);


// стартуем сетевой интерфейс
Ethernet.begin(mac, ip);
server.begin();

}

/*
 * функция сглаживания дребезга
 * принимает в качестве аргумента предыдущее состояние кнопки
 * и выдаёт фактическое.
 */
boolean debounce(boolean last){
  boolean current = digitalRead(buttonPin);    // Считать состояние кнопки
  if (last != current)                         // Если изменилось ...
  {
  delay(5);                                    // ждём 5 мс
  current = digitalRead(buttonPin);            // Считываем состояние кнопки
  return current;                              // Возвращаем состояние кнопки
  }
}


void loop() {
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {


client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");  // the connection will be closed after completion of the response
client.println("Refresh: 5");  // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println(F("<body>"));
client.println(F("<center><head><title>Relay Control</title></head>"));
//client.print(F("<input type=button value='Relay ON' onmousedown=location.href='/?LED_on'>"));
//client.println(F("<input type=button value='Relay OFF' onmousedown=location.href='/?LED_off'><br/><br/>"));
client.println("<a href=\"/?LED_on\"\">Relay On</a><br />");
client.println("<a href=\"/?LED_off\"\">Relay Off</a><br />");
client.println(F("</center></body>"));
client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Ethernet.maintain();
  }


// часть кода для кнопки, реле и светодиода
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)   // Если нажатие (условия для светодиода на пине 6)
{
  ledOn = !ledOn;
}
if (lastButton == LOW && currentButton == HIGH)   // Если нажатие (условие для реле)
{
  Relay1On = !Relay1On;
}
lastButton = currentButton;
digitalWrite(ledPin, ledOn);                         // Изменить статус состояния светодиода
digitalWrite(Relay1, Relay1On);                         // Изменить статус состояния реле
}

Из уже рабочего функционала:
Работает тактовая кнопка на контакте №2, то есть кнопка может переключать реле(контакт №5) и попутно включает/выключает светодиод на контакте №2
На веб интерфейс выведено 2-е ссылки для управления реле, но они не работают. Статус (состояние реле) тоже не известно, а очень хочется.

В одном из своих топиков я писал о нестабильной работе сетевого модуля mini enc28j60. Могу с уверенностью сказать, что у меня модуль на w5100 работает очень хорошо, разрывов нет вообще, пинг хороший.

По поводу того, что кнопка работала не стабильно из поста выше. Заметил странную закономерность. Если сетевой шилд одеть сверху - то кнопка не стабильна, из 10 раз может 3-4 раза не сработать. Если шилд соединяю проводами и задействую только те контакты, которые нужны для сетевого интерфейса, а кнопку подключаю непосредственно к ардуино, то кнопка работает прекрасно. Кнопка подключена через резистор.

Помогите с кодом, а то как доходит до определения статуса и управления через веб, так всё....приплыли.
Заранее благодарен

z0ri
2016-02-09 23:51:48

Подобную тему уже поднимал на этом форуме и хорошие люди подсказали решение. Но так как модуль локальной сети уже другой, то решил открыть новую тему. Модуль другой, библиотека другая, тех характеристики и возможности другие, по логике и тема другая.
Схема абсолютно идентична описанной в теме выше, только реле решил повесить на пин 5, так как пишут, что 4-ый пин Arduino UNO нужен для работы флэш накопителя. Реле тоже сменил на твердотельное OMRON G3MB-202P, но на код это повлиять не должно.
Попытался адаптировать код из поста под Ethernet Shield W5100, попытался объединить это со стандартным примером WebServer, но у меня как всегда...каша.
Получилось вот что:

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

// для кнопки и светодиода и реле
#define BUTTON_PIN 2
#define LED_PIN 6
#define RELAY_PIN 5
#define MY_IP "10.36.1.52"
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
byte gateway[] = {10, 36, 1, 7};
byte subnet[] = {255,255,255,0};
IPAddress ip(10, 36, 1, 52);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

// статус(состояние) для реле:
boolean relayStatus;
char* relayLabel;

// для кнопки надо:
boolean lastButton = LOW;      // Переменная для сохранения предыдущего состояния кнопки
boolean currentButton = LOW;   // Переменная для сохранения текущего состояния кнопки

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  // инициируем подключение к локальной сети
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());


  // настройка входов/выходов для реле, светодиода и кнопки
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);

  // включение реле
  setRelayState(true);


}

/*
 * функция сглаживания дребезга
 * принимает в качестве аргумента предыдущее состояние кнопки
 * и выдаёт фактическое.
 */
boolean debounce(boolean last) {
  boolean current = digitalRead(BUTTON_PIN);   // Считать состояние кнопки
  if (last != current) {                       // Если изменилось ...
    delay(50);                                  // ждём 5 мс
    current = digitalRead(BUTTON_PIN);         // Считываем состояние кнопки
    return current;                            // Возвращаем состояние кнопки
  }
}

void setRelayState(boolean relayOn) {
  digitalWrite(RELAY_PIN, relayOn);
  digitalWrite(LED_PIN, !relayOn);
  relayStatus = relayOn;
  if (relayOn) {
    relayLabel = "ON";
  } else {
    relayLabel = "OFF";
  }
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {

          
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html\r\nPragma: no-cache\r\n\r\n");
//          client.println("Content-Type: text/html; charset=UTF-8");
//          client.println("Connection: close");  // the connection will be closed after completion of the response
//          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
client.println("<head><meta http-equiv=\"refresh\" content=\"5;URL=http://"MY_IP"/\"></head>\n");
client.println("<body>\n<center>Relay is $S</center>\n");
client.println("<a href=\"http://"MY_IP"/?ON\" rel=\"nofollow\">Turn On</a><br></br>\n");
client.println("<a href=\"http://"MY_IP"/?OFF\" rel=\"nofollow\">Turn Off</a><br></br>\n");
client.println("<a href=\"http://"MY_IP"/\" rel=\"nofollow\">Check Status</a><br></br>\n");
client.println("</body>\n</html>\n"),relayLabel;


          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
    Ethernet.maintain();
  }

  // реакция на нажатие кнопки для реле
  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH) { // если нажатие
    setRelayState(!relayStatus);
  }
  lastButton = currentButton;
}

Кнопка работает, светодиод включается с кнопки, реле тоже переключается, но вот с веб-интерфейсом беда. Получилось только вывести ссылки на странице, но они не работают. То есть, переход по ссылке происходит, но реле не переключается и светодиод не включается. Да и уверен, что начудил я с кОдом.
А задача всё та же:
Надо, чтобы управлять реле можно было с кнопки или с веб интерфейса, при этом надо знать о текущем его состоянии, не зависимо от того переключил я реле с физической кнопки или через веб-интерфейс Надо чтобы информацию о состоянии реле я знал через веб интерфейс Ethernet Shield W5100 на arduino.

И ещё заметил следующую странность. Кнопка вроде бы работает, но не всегда. Иногда, раз этак 1 из 10 не срабатывает, причём повторно нажав её, она нормально отрабатывается. Подключена она одним концом в 5V W5100, а вторым через резистор в gnd и в пин 2. При этом до установки шилда на Ардуину я таких проблем не испытывал.

Буду благодарен за помощь.

Підвал форуму