Ping IP + W5100 + реле

alexpebody
alexpebody аватар
Offline
Зарегистрирован: 15.07.2017

Доброго времени всем участникам!

Пожалуйста, подскажите скетч для вот такого проекта:

Есть IP 192.168.0.80 к примеру, если пинг этого адреса пропал и в течении 10 секунд не возвращается, выключить питание (реле), подождать 10 секунд и включить питание, подождать 1 минуту, запустить мониторинг заново... и так в цикле бесконечно, пока есть питание на модулях.
 
Как это реализовать? Я так понимаю нужна Arduino Nano + Lan module + реле модуль, нагрузка на выключателе около 1А, реле держит до 10А, а как написать скетч такого мониторинга? Заранее буду весьма благодарен, если подскажите?
 
Из железок, предполагаю Arduino Nano + W5100 Lan модуль + Реле модуль + блок питания 5В 2А.
 
В написании скетчей полный 0, есть опыт работы в PHP и иже идущих языках программирования,
поэтому некотрую логику скетча проследить могу. Если кому не сложно, начинаю изучать,
подскжите скетч для моего проекта, камера замучала виснуть, хочу вот такую схемку сделать,
чтобы сама перезапусказась, когда зависает (ремонт камеры - безсмысленно, цена Китай).
 
Желательно работать с статическим IP, без DHCP, т.е. ручками прописать параметры LAN модуля.
 
Заранее всем ОГРОМНОЕ спасибо и извиняюсь, если где то протупил!
 
з.ы. Навскидку нашел вот такой скетч ping, но как вставить в него логику с реле непонятно.
 

#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

byte ip[] = { 192, 168, 0, 80 };

byte server[] = { 194, 87, 0, 50 };

int outputPin = 8; 

Client client(server, 80);

boolean send_request()

{

  if (client.connect()) {

    digitalWrite(outputPin, 1);

    Serial.println("1");

  }else{

    digitalWrite(outputPin, 0); 

    Serial.println("0");

  }

}

void setup()

{

  Ethernet.begin(mac, ip);

  Serial.begin(9600);

  pinMode(outputPin, OUTPUT);

}

void loop()

{

  send_request();

  client.stop();

  delay(1000);

}

 

alexpebody
alexpebody аватар
Offline
Зарегистрирован: 15.07.2017

И еще один скетч ув. pavel.1632

// Arduino demo sketch for testing the DHCP client code
//
// Original author: Andrew Lindsay
// Major rewrite and API overhaul by jcw, 2011-06-07
//
// Copyright: GPL V2
// See http://www.gnu.org/licenses/gpl.html

#include <SimpleTimer.h>
#include <EtherCard.h>
#include <avr/wdt.h>

char payload[] = "My UDP message";
byte ipUDPSyslogAddress[4];

String textToSend;

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
unsigned int counterPingFailed = 0;
unsigned int totalRelaySwith = 0;
byte Ethernet::buffer[700];
SimpleTimer timer1;

//static byte srv1[4];

void senduptime() {

    //char textToSend[] = "Uptime: " + (millis() / 1000) + "s";
    textToSend = "Uptime: " + String(millis() / 1000) + "s";
    SendToSerialAndUdp(textToSend);

}

void SendToSerialAndUdp(String input1) {
     Serial.println(input1);
// с несколькими адресами так и не удалось заставить работать
// ether.parseIp(ether.hisip, srv03);
// ether.printIp("UDP: ", srv1);
// Serial.println("SEND UDP");
// ether.sendUdp(payload, sizeof(payload), 1234, srv1, 514);
}

void pingGoogle() {

  ether.printIp("Pinging: ", ether.hisip);
 
  if ((ether.packetLoopIcmpCheckReply(ether.hisip))==0){
    counterPingFailed=counterPingFailed+1;
    textToSend = "Pings: " + String(counterPingFailed) + "(of 15) Relay: " + String(totalRelaySwith) + " Uptime: " + String(millis() / 1000) + "s";;
    SendToSerialAndUdp(textToSend);
    }

     if (counterPingFailed > 15) {
     SendToSerialAndUdp("RELAY OFF");
     counterPingFailed = 0;
     totalRelaySwith=totalRelaySwith+1;
     digitalWrite(5, !digitalRead(5));
     digitalWrite(6, !digitalRead(6));
     delay (5000);
     SendToSerialAndUdp("RELAY ON");
     digitalWrite(5, !digitalRead(5));
     digitalWrite(6, !digitalRead(6));
     }
     ether.clientIcmpRequest(ether.hisip);
}

void testrelay()
{
  digitalWrite(5, !digitalRead(5));
  digitalWrite(6, !digitalRead(6));
  }

// called when a ping comes in (replies to it are automatic)
static void gotPinged (byte* ptr) {
  ether.printIp(">>> ping from: ", ptr);
}

void watchdogUpdate() {
  wdt_reset();
  }

void setup () {

  pinMode(5, OUTPUT);    
  pinMode(6, OUTPUT);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  Serial.begin(9600);
  Serial.println(F("\n[Started...]"));
  //delay(000); // Задержка, чтобы было время перепрошить устройство в случае bootloop
  wdt_enable (WDTO_8S); // Для тестов не рекомендуется устанавливать значение менее 8 сек.
  Serial.println(F("\n[testDHCP]"));
  Serial.print("MAC: ");
  for (byte i = 0; i < 6; ++i) {
    Serial.print(mymac[i], HEX);
    if (i < 5)
      Serial.print(':');
  }
  Serial.println();
  if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0)
    Serial.println(F("Failed to access Ethernet controller"));

  Serial.println(F("Setting up DHCP"));
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP failed"));
  ether.printIp("My IP: ", ether.myip);
  ether.printIp("Netmask: ", ether.netmask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);

  //timer = -9999999; // start timing out right away

  ether.parseIp(ether.hisip, "8.8.8.8");

  ether.printIp("SRV: ", ether.hisip);
 
  // call this to report others pinging us
  ether.registerPingCallback(gotPinged);
  timer1.setInterval(60000, pingGoogle);            //every 60sec
  timer1.setInterval(3600000, rebootWithWatchdog); //every hour if ping failed > 10
  timer1.setInterval(86400000, rebootWithWatchdog2); //every day
  timer1.setInterval(1000, watchdogUpdate);
}

void rebootWithWatchdog () {
  if (totalRelaySwith > 10) {
    Serial.println("Reboot with watchdog");
    delay(30000);
  }
}

void rebootWithWatchdog2() {
    Serial.println("Reboot with watchdog2");
    delay(30000);
}

void loop () {
  word len = ether.packetReceive(); // go receive new packets
  word pos = ether.packetLoop(len); // respond to incoming ping
  if (len > 0 && ether.packetLoopIcmpCheckReply(ether.hisip))
  {
      SendToSerialAndUdp("Ping SUCCESSFUL");
      counterPingFailed=0;
   
  }

  timer1.run();
  delay(1);
}

Насколько я понимаю это именно то, что мне нужно, если будет пару минут, прошу вникните в суть моего проекта и подскажите, что поправить в вашем коде под мои задачи?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexpebody пишет:

начинаю изучать,

Начните изучать  вот с этого, а то так и будете беседовать "тихо сам с собою".

alexpebody
alexpebody аватар
Offline
Зарегистрирован: 15.07.2017

ЕвгенийП пишет:

alexpebody пишет:

начинаю изучать,

Начните изучать  вот с этого, а то так и будете беседовать "тихо сам с собою".

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

tokima
Offline
Зарегистрирован: 29.08.2015
alexpebody
alexpebody аватар
Offline
Зарегистрирован: 15.07.2017

Воу ) СПАСИБО БОЛЬШОЕ!! Насколько я понял это именно то, что нужно, только в скетче нужно будет поменять пинг того же google на пинг моего хоста, верно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexpebody пишет:

ЕвгенийП пишет:

Начните изучать  вот с этого, а то так и будете беседовать "тихо сам с собою".

Спасибо учту, уже читаю, но что по поводу моего кода? 

Ничерта Вы не читаете, иначе не задавали бы вопрос ...

alexpebody пишет:

что по поводу моего кода? 

Ничего! Я его не читал. Вставьте как положено, а там посмотрим.

alexpebody
alexpebody аватар
Offline
Зарегистрирован: 15.07.2017

ЕвгенийП пишет:

alexpebody пишет:

ЕвгенийП пишет:

Начните изучать  вот с этого, а то так и будете беседовать "тихо сам с собою".

Спасибо учту, уже читаю, но что по поводу моего кода? 

Ничерта Вы не читаете, иначе не задавали бы вопрос ...

alexpebody пишет:

что по поводу моего кода? 

Ничего! Я его не читал. Вставьте как положено, а там посмотрим.

Почему не читаю то? Код в первом сообщении я редактировать не могу, а во втором уже поправил. Извиняюсь, если где то протупил... 8-)

Но лучше видимо пойти по наименьшему сопротивлению и не мучаться с фреймом ICMP, взять вот этот скетч из приведенной статьи и подправить под мои задачи, может кто то помочь?

Скетч:

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

#define RSTpin 9
#define POWERpin 8

int InactivityPeriod = 10*60; // Время между опросами ресурсов, 10 минут.

byte mac[] = {0xC0, 0xFF, 0xEC, 0xAC, 0xA0, 0x01}; // mac-адрес. Должен не свопадать ни с одним из существующих в данной сети
byte ip[] = {192,168,1,112}; // ip-адрес устройста.

SOCKET pingSocket = 0;

char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

byte ErrorCont;
int Inactivity;

void TickEvery1s() // Эта процедура вызывается каждые полсекунды
{
  if (Inactivity>0) Inactivity--;
}

void setup() 
{
  Inactivity=InactivityPeriod;
  pinMode(RSTpin, OUTPUT);
  digitalWrite(RSTpin, LOW); delay(20); digitalWrite(RSTpin, HIGH); delay(200);  // Перезагружаем плату
  pinMode(POWERpin, OUTPUT);
  digitalWrite(POWERpin, HIGH);  //Включаем нагрузку
  Ethernet.begin(mac, ip);
  MsTimer2::set(1000, TickEvery1s); // период вызова каждые 1000ms 
  MsTimer2::start();

}

void loop()
{
  while (Inactivity>0) {delay(1);}
  
  ErrorCont=0;
  for (byte i=0; i<=3; i++){
    ICMPEchoReply GoogleechoReply = ping(IPAddress (8,8,8,8), 2);
    if (GoogleechoReply.status != SUCCESS) {ErrorCont++;}
    delay(500);
    }
  for (byte i=0; i<=3; i++){
    ICMPEchoReply YandexechoReply = ping(IPAddress (77,88,8,8), 2);
    if (YandexechoReply.status != SUCCESS) {ErrorCont++;}
    delay(500);
    }
  
  if (ErrorCont==8) {
    digitalWrite(POWERpin, LOW); delay(10000); digitalWrite(POWERpin, HIGH);}  // Перезагружаем нагрузку
    
  Inactivity=InactivityPeriod;    // Заводим таймер до следующей проверки
}

Что поправить в скетче, чтобы было ворт так: есть IP 192.168.0.80 к примеру, если пинг этого адреса пропал и в течении 10 секунд не возвращается, выключить питание (реле), подождать 10 секунд и включить питание, подождать 1 минуту, запустить мониторинг заново.

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

alexpebody  -ну уж адрес-то в готовый скетч можно и самому вписать. Не стыдно?

alexpebody
alexpebody аватар
Offline
Зарегистрирован: 15.07.2017

b707 пишет:

alexpebody  -ну уж адрес-то в готовый скетч можно и самому вписать. Не стыдно?

Эм, конечно не стыдно, я же не про адрес говорил ) адрес то вписать 2 секунды,

мне нужно сделать логику, как я пишу и тайминги, а как это написать я не знаю.

А логика нужна такая, пингуем IP с периодом например в 1 минуту, затем, если нет

пинга в течении 10 секунд, разрываем реле и ждем 10 секунд, затем включаем реле

и ждем 1 минуту, затем запускаем мониторинг заново и т.д. и т.п. - это не знаю как написать.

 

И еще непонятно по поводу реле, есть вот такое реле goo.gl/25hxNe, оно НОРМАЛЬНО ЗАМКНУТО

или НОРМАЛЬНО РАЗОМКНУТО? Мне нужно, чтобы было замкнуто, т.к. по сути мне нужно подавать

питание на камеру, пока нет сбоя. Я не пойму, Ардуинка будет давать на него HIGH т.е. замыкать,

пока не указано в скетче другого или это реле все время ЗАМКНУТО и Ардуино будет только

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