Помогите с релейным модулем

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

Здравствуйте. Имеется модуль ардуино, интернет шилд и релейный модуль.

В общем принцып работы такой: Я перехожу по нужному адресу в ардуино, с помощью Enthernet шилда и зажигается реле, перехожу еще раз, реле выключается. Все работает, все прекрасно.

Но вот в чем дело, может ли ардуино, ответить, включил ли он реле, то есть отправить мне, 1 или 0? И если может, как примерно такое организовать?

Сам скетч:

#include <Ethernet.h>
#include <SPI.h>
#define PIN5 5
#define PIN6 6
#define PIN7 7
#define PIN8 8
#define PIN9 9

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 10, 1, 55);
EthernetServer arduino(81);
String readString; 

void setup() {
  pinMode(PIN5, OUTPUT);
  digitalWrite(PIN5, LOW);
  pinMode(PIN6, OUTPUT);
  digitalWrite(PIN6, LOW);
  pinMode(PIN7, OUTPUT);
  digitalWrite(PIN7, LOW);
  pinMode(PIN8, OUTPUT);
  digitalWrite(PIN8, LOW);
  pinMode(PIN9, OUTPUT);
  digitalWrite(PIN9, LOW);
  
  Ethernet.begin(mac, ip); 
  arduino.begin();
  Serial.begin(9600);
}

void loop() {
  EthernetClient client = arduino.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (readString.length() < 100) {
          readString += c; 
          Serial.print(c);
        } 
        
        if (c == '\n') {
          Serial.println(readString);
          if(readString.indexOf('?') >=0) {
            client.println("HTTP/1.1 204");
            client.println();
            client.println();  
          }
          else {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println();

            client.println("<html>");
            client.println("<head>");
            client.println("<title>Arduino</title>");
            client.println("</head>");
            client.println("<body>");
            client.println("<h1>Hi, I'm an Arduino server.</h1>");
            client.println("<a href=\"/?Relay_1\">Relay #1</a>");
            client.println("<a href=\"/?Relay_2\">Relay #2</a>");
            client.println("<a href=\"/?Relay_3\">Relay #3</a>");
            client.println("<a href=\"/?Relay_4\">Relay #4</a>");
            client.println("<a href=\"/?Relay_5\">Relay #5</a>");
            client.println("</body>");
            client.println("</html>");
          }
          delay(1);
          client.stop();
          
          if(readString.indexOf("Relay_1") >0)
          {
            digitalWrite(PIN5, ! digitalRead(PIN5));
          }
          if(readString.indexOf("Relay_2") >0)
          {
            digitalWrite(PIN6, ! digitalRead(PIN6));
          }
          if(readString.indexOf("Relay_3") >0)
          {
            digitalWrite(PIN7, ! digitalRead(PIN7));
          }
          if(readString.indexOf("Relay_4") >0)
          {
            digitalWrite(PIN8, ! digitalRead(PIN8));
          }
          if(readString.indexOf("Relay_5") >0)
          {
            digitalWrite(PIN9, ! digitalRead(PIN9));
          }
          readString="";
        }
      }
    }
  }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Седня все сговорились. Один резисторы зажигает, другой - реле.

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

DetSimen пишет:

Седня все сговорились. Один резисторы зажигает, другой - реле.

Вы бы знали что в конечном итоге будет запускаться:)

b707
Offline
Зарегистрирован: 26.05.2017

VaDoSiQ пишет:

Здравствуйте. Имеется модуль ардуино, интернет шилд и релейный модуль.

В общем принцып работы такой: Я перехожу по нужному адресу в ардуино, с помощью Enthernet шилда и зажигается реле, перехожу еще раз, реле выключается. Все работает, все прекрасно.

Но вот в чем дело, может ли ардуино, ответить, включил ли он реле, то есть отправить мне, 1 или 0? И если может, как примерно такое организовать?

А как ардуина узнает, включилось ли реле? Ну то есть уровень на реле подан. а вот сработало ли оно? И даже если сработало - то это еще не гарантия, что реле включило то, что нужно. Может контакты замкнулись. а на нагрузке просто тока нет.

Это я к тому. что задачка-то не простая. Надо знать, о чем речь. Контролировать лучше не включение реле, а целевой парметр, например если это освещение - ставить фотодатчик. если реле включает компрессор, то контролировать не напряжение компрессора, а давление в системе...

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

b707 пишет:

VaDoSiQ пишет:

Здравствуйте. Имеется модуль ардуино, интернет шилд и релейный модуль.

В общем принцып работы такой: Я перехожу по нужному адресу в ардуино, с помощью Enthernet шилда и зажигается реле, перехожу еще раз, реле выключается. Все работает, все прекрасно.

Но вот в чем дело, может ли ардуино, ответить, включил ли он реле, то есть отправить мне, 1 или 0? И если может, как примерно такое организовать?

А как ардуина узнает, включилось ли реле? Ну то есть уровень на реле подан. а вот сработало ли оно? И даже если сработало - то это еще не гарантия, что реле включило то, что нужно. Может контакты замкнулись. а на нагрузке просто тока нет.

Это я к тому. что задачка-то не простая. Надо знать, о чем речь. Контролировать лучше не включение реле, а целевой парметр, например если это освещение - ставить фотодатчик. если реле включает компрессор, то контролировать не напряжение компрессора, а давление в системе...

Моё дело включить только реле, чтобы оно сработало и дало ответ. Больше мне не нужно. Всё остальное будет сделано на PHP + MySQLi.

b707
Offline
Зарегистрирован: 26.05.2017

VaDoSiQ пишет:

[

Вы бы знали что в конечном итоге будет запускаться:)

Не надо интриги, меня и так всегда пугает мысль о том. кому мы тут помогаем и для каких целей будет использовано радиуправление или реле, включаемое по мобильнику...

b707
Offline
Зарегистрирован: 26.05.2017

VaDoSiQ пишет:

Моё дело включить только реле, чтобы оно сработало и дало ответ. Больше мне не нужно. Всё остальное будет сделано на PHP + MySQLi.

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

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

b707 пишет:

VaDoSiQ пишет:

[

Вы бы знали что в конечном итоге будет запускаться:)

Не надо интриги, меня и так всегда пугает мысль о том. кому мы тут помогаем и для каких целей будет использовано радиуправление или реле, включаемое по мобильнику...

Включить я могу реле.

Как мне узнать, включилось ли оно? Как организовать обратную связь?

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

b707 пишет:

VaDoSiQ пишет:

Моё дело включить только реле, чтобы оно сработало и дало ответ. Больше мне не нужно. Всё остальное будет сделано на PHP + MySQLi.

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

Наоборот, обратная связь нужна. Нужно после включения реле, сказать мне, 1 или 0. А включилось ли что то там дальше, меня не интересует.

b707
Offline
Зарегистрирован: 26.05.2017

VaDoSiQ пишет:

Наоборот, обратная связь нужна. Нужно после включения реле, сказать мне, 1 или 0. А включилось ли что то там дальше, меня не интересует.

ну блин, у вас же скетч сервера. Там где у вас ссылки на включение реле (строки 60-66) - добавьте отображение ON или OFF в зависмости от текущего состояния

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

b707 пишет:

VaDoSiQ пишет:

Наоборот, обратная связь нужна. Нужно после включения реле, сказать мне, 1 или 0. А включилось ли что то там дальше, меня не интересует.

ну блин, у вас же скетч сервера. Там где у вас ссылки на включение реле (строки 60-66) - добавьте отображение ON или OFF в зависмости от текущего состояния

Это понятно.

Как записать на сервер, текущее состояние реле (1 или 0).

У меня имеется база MySQL, в неё и нужно передать это значение, в зависимости от состояния реле.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

Это я к тому. что задачка-то не простая. Надо знать, о чем речь. Контролировать лучше не включение реле, а целевой парметр, например если это освещение - ставить фотодатчик. если реле включает компрессор, то контролировать не напряжение компрессора, а давление в системе...

Если по-простому - можно поставить сдвоенное и смотреть на дублирующую группу контактов. Или на перекидном - доп.контакт. 

b707
Offline
Зарегистрирован: 26.05.2017

VaDoSiQ пишет:

Это понятно.

Как записать на сервер, текущее состояние реле (1 или 0).

У меня имеется база MySQL, в неё и нужно передать это значение, в зависимости от состояния реле.

ну если понятно, так сделайте. Как вывести в сериал значение переменной - знаете? Ну так точно так же выведите ее в строчку,, например, 62,  которую выдает HTML-сервер.

А чтобы это значение попало в MySQl,  вам надо будет написать простенький клиент на десктопе, который опрашивал бы ваш ардуино-сервер раз в 3-5 минут и парсил из HTML переменные реле.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Если по-простому - можно поставить сдвоенное и смотреть на дублирующую группу контактов. Или на перекидном - доп.контакт. 

да ему это, как оказалось  - нафик не надо, ему надо данные с сервера в MySQl парсить. Непонятно, почему он с этим вопросом в форум Ардуино пришел.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

да ему это, как оказалось  - нафик не надо, ему надо данные с сервера в MySQl парсить. Непонятно, почему он с этим вопросом в форум Ардуино пришел.

Тут люди добрые.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

b707 пишет:

да ему это, как оказалось  - нафик не надо, ему надо данные с сервера в MySQl парсить. Непонятно, почему он с этим вопросом в форум Ардуино пришел.

Тут люди добрые.

ИМХО, тех умных слов, которые ему уже назвали в этой ветке, должно быть достаточно, чтоб теперь идти и разбираться самому :) Пинок в нужном направлении дан :)

Nosferatu
Offline
Зарегистрирован: 04.11.2012

VaDoSiQ пишет:

Это понятно.

Как записать на сервер, текущее состояние реле (1 или 0).

У меня имеется база MySQL, в неё и нужно передать это значение, в зависимости от состояния реле.

Подгружайте скрытый  FRAME и передавайте через GET состояние пинов своему PHP скрипту.

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

sadman41 пишет:

b707 пишет:

да ему это, как оказалось  - нафик не надо, ему надо данные с сервера в MySQl парсить. Непонятно, почему он с этим вопросом в форум Ардуино пришел.

Тут люди добрые.

Люди добрые! Мне нужно организовать алгоритм..

Смотрите, как работает моя система:

Имеется файлик (обработчик) на сервере, раз в несколько минут, его запускает cron.

Что делает мой файлик (обработчик):

1) Проверяет состояние Arduino с помощью CURL, если Arduino доступна, он записывает (1) в таблицу MySQL, если не доступна, записывает 0.

Далее идет проверка, прошло ли 10 минут, с последнего 0, то есть с последнего отключения ардуино, если не прошло, останавливает выполнение и после следующего перезапуска cron, повторяет процесс еще раз.

Если при следующем запуске cron, проверка пройдена, то есть прошло 10 минут с последнего 0, скрипт идет в MySQL, в таблицу с датами и временем запуска, смотрит время запуска и сравнивает с текущим, если оно подходит, он зажигает реле, если нет, повторяет процесс еще раз.

Вот сам обработчик:

<?php

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

include 'system/connection.php';
$globaltime = strtotime("Now");
$globaltimedata = date('Y-m-d H:i:s');


	$ch = curl_init('http://10.10.1.55:81');
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_exec($ch);
	if(curl_errno($ch)) {
		$query = "INSERT INTO `logs` SET `status_arduino` = 0, `time` = '".date('Y-m-d H:i:s',$globaltime)."'";
		$db->query($query);
		exit();
	} else {
		$query = "INSERT INTO `logs` SET `status_arduino` = 1, `time` = '".date('Y-m-d H:i:s',$globaltime)."'";
		$db->query($query);
    }
	
    
	$query_off = "SELECT `time`, `status_arduino` FROM `logs` WHERE `status_arduino` = '0' ORDER BY `id` DESC LIMIT 1";
	
	if ($result = $db->query($query_off)) {
    while ($row = $result->fetch_assoc());

    $result->free();
}

    $SpecifiedTime = strtotime($row['time']);
    echo $Difference = round((($globaltime - $SpecifiedTime) / 60),0);
    
    if($Difference < 10) {
        exit();
    } else {
        $query = "SELECT * FROM `catalog` WHERE ((`task_start` < '$globaltimedata') AND (`task_end` > '$globaltimedata'))";
		if($result = $db->query($query)) {
        while ($row = $result->fetch_assoc()) {
			$ch = curl_init('http://10.10.1.55:81/Relay_1');
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_exec($ch);
			curl_close($ch);
        }
		$result->free();
    }
	$db->close();
	}
?>

Что я хочу?

Мне нужно, узнать текущее состояние реле, то есть 0 или 1, записать временно его в переменную и отдать на сервер GET запросом, все.

Что для этого нужно?

sadman41
Offline
Зарегистрирован: 19.10.2016

Все же сами написали, что нужно: "узнать текущее состояние реле, записать временно его в переменную и отдать на сервер GET запросом".

Вы что, каждый шаг, расписанный в деталях ждете или готовый скетч ? Тогда вам в раздел "Ищу исполнителя". 

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

sadman41 пишет:

Все же сами написали, что нужно: "узнать текущее состояние реле, записать временно его в переменную и отдать на сервер GET запросом".

Вы что, каждый шаг, расписанный в деталях ждете или готовый скетч ? Тогда вам в раздел "Ищу исполнителя". 

Я не знаю как в ардуино передать байт, со стороннего сервера, то есть мой сайт говорит ардуине, установить значение 5 пина на LOW, вот что мне нужно.

Nosferatu
Offline
Зарегистрирован: 04.11.2012

VaDoSiQ пишет:

Я не знаю как в ардуино передать байт, со стороннего сервера, то есть мой сайт говорит ардуине, установить значение 5 пина на LOW, вот что мне нужно.

Это же примитивно, если вы веб программист. Вам нужна помощь в составлении GET запроса?

VaDoSiQ
VaDoSiQ аватар
Offline
Зарегистрирован: 19.01.2017

Nosferatu пишет:

VaDoSiQ пишет:

Я не знаю как в ардуино передать байт, со стороннего сервера, то есть мой сайт говорит ардуине, установить значение 5 пина на LOW, вот что мне нужно.

Это же примитивно, если вы веб программист. Вам нужна помощь в составлении GET запроса?

Я знаю как составить GET запрос в PHP, обьясните, как заставить ардуино его принять и дать ответ обратно?

Nosferatu
Offline
Зарегистрирован: 04.11.2012

VaDoSiQ пишет:

Nosferatu пишет:

VaDoSiQ пишет:

Я не знаю как в ардуино передать байт, со стороннего сервера, то есть мой сайт говорит ардуине, установить значение 5 пина на LOW, вот что мне нужно.

Это же примитивно, если вы веб программист. Вам нужна помощь в составлении GET запроса?

Я знаю как составить GET запрос в PHP, обьясните, как заставить ардуино его принять и дать ответ обратно?

Так ардуина у вас уже обрабатывает GET запросы в 71-90 строчках. И печатает HTML в котором вы можете выводить что надо и который можно парсить PHP скриптом.