Набор воды в бочку

maikl_baklan@bk.ru
Offline
Зарегистрирован: 25.05.2014

Как говорили мудрые: По частям слона съесть намного легче. Так вот одной из маленьких задач по автоматизации всего и вся, это автоматический набор емкости, из водопровода с давлением от 1,5 до 2 атм. Приехал шаровый электрический кран. 

ТЗ:

1. Кнопка старт-стопа набора жидкости должна быть непосредственно на бочке.

2. Старт-стоп набора жидкости можно сделать удаленно.

3. Старт набора жидкости по времени.

4. Стоп набора жидкости по наполнению.

Для датчика уровня жидкости решил использовать ультразвуковой дальномер HC-SR04, поискал примеры его использования и подключения. В процессе экспериментов обнаружил удобную библиотеку "Ultrasonic.h". В отдельной прошивке все работает отлично, растояние мерится 

#include <Ultrasonic.h>

Ultrasonic ultrasonic(5,6); // (Trig PIN,Echo PIN)

void setup() {
  Serial.begin(9600);
//  pinMode(4, OUTPUT); // VCC pin
//  pinMode(7, OUTPUT); // GND ping
//  digitalWrite(4, HIGH); // VCC +5V mode  
//  digitalWrite(7, LOW);  // GND mode
}

void loop()
{
  Serial.print(ultrasonic.Ranging(CM)); // CM or INC
  Serial.println(" cm" );
  delay(100);
}

А вот когда начал сливать два скетча, перить растояние не получается, значение приобретает максимальное в 51 см, Не могу понять в чем засада.

/* Дмитрий Осипов. http://www.youtube.com/user/d36073?feature=watch
 v.02 Управляем Arduino с Web страницы Webserver Ethernet ENC28J60 Enternet HR911105A Pin ON OF Relays. 
 Version 0.2 2014/10/02
 ----- 
 Обновление: в  Version 0.2.
 1). Web страница отображает, значения аналоговых входов analogRead(A0),(A1),(A2),(A3).
 2). Запись / восстановление, из EEPROM состояния LedPins.
 3). Установка времени авто обновления данных Web страницы, на устройстве клиента.
 Пригодится для скорости отображения изменений значений / данных, с датчиков.
 ----- 
 Что нам понадобится:
 1). ENC28J60 Ethernet LAN / Network Module. 
 http://www.ebay.com/sch/i.html?_from=R40&_sacat=0&_nkw=ENC28J60&rt=nc&LH...
 
 2). Библиотека / Library - "ethercard".
 EtherCard is a driver for the ENC28J60 chip, compatible with Arduino IDE.
 https://github.com/jcw/ethercard
 Или берем здесь. https://yadi.sk/d/R57sVoglbhTRN
 3).
 Скачать sketch.
 v.02 Управляем Arduino с Web страницы Webserver Ethernet ENC28J60 Enternet HR911105A Pin ON OF Relays.
 
 -----------------------
 *************************************************************** 
 Вспомогательные видео инструкции, sketch.
 ***************************************************************
 v.01 Управляем Arduino с Web страницы Webserver Ethernet ENC28J60 Enternet HR911105A Pin ON OF Relays.
 https://yadi.sk/i/KYFASZdnbhUr5
 Видео инструкция.
 v.01 Управляем Arduino с Web страницы Webserver Ethernet ENC28J60 Enternet HR911105A Pin ON OF Relays.
 http://www.youtube.com/watch?v=PPB2Xvubt4s&list=UU7aH7HVqDvwB1xNHfSl-fDw
 *************************************************************** 
 
 Подключаем Pins "ENC28J60 Module" к Arduino Uno.
 VCC -   3.3V
 GND -    GND
 SCK - Pin 13
 SO  - Pin 12
 SI  - Pin 11
 CS  - Pin 10 - Можно выбрать любой Pin. 
 
 Подключаем  "ENC28J60 Module" например к Router, загружаем sketch, открываем страницу
 в браузере например 192.168.1.222 , на странице можем включать выключат Pins / реле. 
 ---------
 Примечание: "ENC28J60 Module" питается от 3.3 volts, и потребляет по документации 250mA.
 Arduino Uno Максимальный допустимый ток, получаемый с 3V3 контакта — 50 мА.
 У меня прекрасно всё работает с 3V3 контакта Arduino Uno.
 На всякий случай, предупреждаю.
 ------------------
 */

#include <EtherCard.h>  // Подключаем скачанную библиотеку. https://yadi.sk/d/R57sVoglbhTRN
#include <EEPROM.h> // Для  Записи / восстановление из EEPROM состояния LedPins.
#include "Ultrasonic.h"

// MAC Address должен быть уникальным в вашей сети. Можно менять. 
static byte mymac[] = { 
  0xD8,0xD8,0xD8,0xD8,0xD8,0xD8 };

// ip, статический / постоянный Address нашей Web страницы. Можно менять.  
static byte myip[] = { 
  192,168,0,122 };

// Буфер, чем больше данных на Web странице, тем больше понадобится значения буфера.
byte Ethernet::buffer[1150];
BufferFiller bfill;

// Массив задействованных номеров Pins Arduino, для управления например 8 реле.
int LedPins[] = {
  2,3,4,5,6,7,8,9};

// Массив для фиксации изменений.
boolean PinStatus[7]; // с 0 до 7.

//Тут я добавил ультразвуковой измеритель
Ultrasonic ultrasonic(5, 6);
//int echoPin = 6; 
//int trigPin = 7; 
//int duration, cm; 

//-------------

const char http_OK[] PROGMEM =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n\r\n";

const char http_Found[] PROGMEM =
"HTTP/1.0 302 Found\r\n"
"Location: /\r\n\r\n";

const char http_Unauthorized[] PROGMEM =
"HTTP/1.0 401 Unauthorized\r\n"
"Content-Type: text/html\r\n\r\n"
"<h1>401 Unauthorized</h1>";



//------------



// Делаем функцию для оформления нашей Web страницы. 
void homePage()
{
  // Раскомментируйте / закомментируйте нужное вам количество датчиков.
	//int sensor0 = ultrasonic.Ranging(CM);       // get distance
	//delay(100);
  int sensor0 = analogRead(A0);
  int sensor1 = analogRead(A1);
  int sensor2 = analogRead(A2);
  int sensor3 = analogRead(A3);


  bfill.emit_p(PSTR("$F"
    "<title>ArduinoPIN Webserver</title>"    
    "ArduinoPIN 2: <a href=\"?ArduinoPIN2=$F\">$F</a><br />"  
    "ArduinoPIN 3: <a href=\"?ArduinoPIN3=$F\">$F</a><br />"
    "ArduinoPIN 4: <a href=\"?ArduinoPIN4=$F\">$F</a><br />"
    "ArduinoPIN 5: <a href=\"?ArduinoPIN5=$F\">$F</a><br />"
    "ArduinoPIN 6: <a href=\"?ArduinoPIN6=$F\">$F</a><br />"
    "ArduinoPIN 7: <a href=\"?ArduinoPIN7=$F\">$F</a><br />"
    "ArduinoPIN 8: <a href=\"?ArduinoPIN8=$F\">$F</a><br />"   
    "ArduinoPIN 9: <a href=\"?ArduinoPIN9=$F\">$F</a>"),   

  http_OK,

  PinStatus[0]?PSTR("off"):PSTR("on"),
  PinStatus[0]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
  PinStatus[1]?PSTR("off"):PSTR("on"),
  PinStatus[1]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
  PinStatus[2]?PSTR("off"):PSTR("on"),
  PinStatus[2]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
  PinStatus[3]?PSTR("off"):PSTR("on"),
  PinStatus[3]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
  PinStatus[4]?PSTR("off"):PSTR("on"),
  PinStatus[4]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"), 
  PinStatus[5]?PSTR("off"):PSTR("on"),
  PinStatus[5]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"),
  PinStatus[6]?PSTR("off"):PSTR("on"),
  PinStatus[6]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"), 
  PinStatus[7]?PSTR("off"):PSTR("on"),
  PinStatus[7]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"));

  //------------


  // Для отображения на Web странице значений с аналоговых входов analogRead(A0),(A1),(A2),(A3).

  // Авто обновление Web страницы, пригодится для частоты отображения данных с датчиков.
  // После нажатия на устройстве клиента "ArduinoPIN ON или OFF", 
  // происходит обновление Web страницы, и значение с датчиков на ней.
  // Можно этот процесс автоматизировать, + установить таймер / время авто обновление Web страницы.
  // Если авто обновление Web страницы вам не нужно, закомментируйте стоку "<meta http-equiv='refresh' content='10'/>".  
  // Время таймера устанавливается content='2'/>" '2' это 2 секунды.

  // выводим значения analogRead(A0);.
  bfill.emit_p(PSTR(
  "<meta http-equiv='refresh' content='2'/>" // Авто обновление Web страницы клиента, каждые 2 секунды.
  "<font color=\"brown\"><h3>AnalogRead(A0)</h3>""<h1>$D</h1>"),sensor0);  // h1 размер шрифта.


  // Раскомментируйте / закомментируйте нужное вам количество датчиков.

  // выводим значения analogRead(A1);.
  bfill.emit_p(PSTR("<font color=\"blue\"><h3>AnalogRead(A1)</h3>""<h1>$D</h1>"),sensor1);

  // выводим значения analogRead(A2);.
  bfill.emit_p(PSTR("<font color=\"Amber\"><h3>AnalogRead(A2)</h3>""<h3>$D</h3>"),sensor2);  

  // выводим значения analogRead(A3);.
  bfill.emit_p(PSTR("<font color=\"Burnt Orange\"><h3>AnalogRead(A3)</h3>" "<h3>$D</h3>"),sensor3);

  // Можно в одной строке.
  bfill.emit_p(PSTR("<h1>(A0)=$D"": (A1)=$D"": (A2)=$D"": (A3)=$D</h1>"),ultrasonic.Ranging(CM), sensor1 ,sensor2 ,sensor3);
}



//------------------------



void setup()
{
   // Иницилизация ног ультразвукового дальномера
  	//pinMode(trigPin, OUTPUT); 
	//pinMode(echoPin, INPUT); 

 Serial.begin(9600);

  // По умолчанию в Библиотеке "ethercard" (CS-pin) = № 8.
  // if (ether.begin(sizeof Ethernet::buffer, mymac) == 0).
  // and change it to: Меняем (CS-pin) на 10.
  // if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0).

  if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0);

  if (!ether.dhcpSetup()); 

  // Выводим в Serial монитор IP адрес который нам автоматический присвоил наш Router. 
  // Динамический IP адрес, это не удобно, периодический наш IP адрес будет меняться. 
  // Нам придётся каждый раз узнавать кой адрес у нашей страницы.
  ether.printIp("My Router IP: ", ether.myip); // Выводим в Serial монитор IP адрес который нам присвоил Router. 

  // Здесь мы подменяем наш динамический IP на статический / постоянный IP Address нашей Web страницы.
  // Теперь не важно какой IP адрес присвоит нам Router, автоматический будем менять его, например на "192.168.1.222". 
  ether.staticSetup(myip);

  ether.printIp("My SET IP: ", ether.myip); // Выводим в Serial монитор статический IP адрес. 
  //-----

  for(int i = 0; i <= 7; i++)
  {
    pinMode(LedPins[i],OUTPUT); // весь массив LedPins делаем OUTPUT.
    PinStatus[i]=EEPROM.read(i); // Перезаписываем значения массива PinStatus, значениями из EEPROM.
    digitalWrite(LedPins[i],PinStatus[i]); // Восстанавливаем прошлое состояние LedPins.  
  }

}

// --------------------------------------

void loop()
{

  delay(1); // Дёргаем микроконтроллер.

  word len = ether.packetReceive();   // check for ethernet packet / проверить ethernet пакеты.
  word pos = ether.packetLoop(len);   // check for tcp packet / проверить TCP пакеты.

  if (pos) {
    bfill = ether.tcpOffset();
    char *data = (char *) Ethernet::buffer + pos;
    if (strncmp("GET /", data, 5) != 0) {
      bfill.emit_p(http_Unauthorized);
    }
    else {

      data += 5;
      if (data[0] == ' ') {       
        homePage(); // Return home page, Если обнаружено изменения на станице, запускаем функцию.
        // for (int i = 0; i <= 7; i++)digitalWrite(LedPins[i],PinStatus[i]);                              
        // EEPROM.write(i,PinStatus[i]);delay(10);Serial.println(1);
		// Ультразвуковой дальномер.
		//float dist_cm = ultrasonic.Ranging(CM);       // get distance
		//Serial.println(dist_cm);                      // print the distance
		
/*			digitalWrite(trigPin, LOW); 
			delayMicroseconds(2); 
			digitalWrite(trigPin, HIGH); 
			delayMicroseconds(10); 
			digitalWrite(trigPin, LOW); 
			duration = pulseIn(echoPin, HIGH); 
			cm = duration / 58;
			Serial.print(cm); 
			Serial.println(" cm"); 
			delay(100);
*/
      }


      // "16" = количество символов "?ArduinoPIN1=on ".
      else if (strncmp("?ArduinoPIN2=on ", data, 16) == 0) {
        PinStatus[0] = true; 
        digitalWrite(LedPins[0],PinStatus[0]); 
        EEPROM.write(0,PinStatus[0]); // записываем в ячейку EEPROM №0, текущее состояние LedPins[0].    
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN3=on ", data, 16) == 0) {
        PinStatus[1] = true;
        digitalWrite(LedPins[1],PinStatus[1]); 
        EEPROM.write(1,PinStatus[1]);
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN4=on ", data, 16) == 0) {
        PinStatus[2] = true;
        digitalWrite(LedPins[2],PinStatus[2]); 
        EEPROM.write(2,PinStatus[2]);
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN5=on ", data, 16) == 0) {
        PinStatus[3] = true;
        digitalWrite(LedPins[3],PinStatus[3]); 
        EEPROM.write(3,PinStatus[3]);
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN6=on ", data, 16) == 0) {
        PinStatus[4] = true; 
        digitalWrite(LedPins[4],PinStatus[4]);  
        EEPROM.write(4,PinStatus[4]);      
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN7=on ", data, 16) == 0) {
        PinStatus[5] = true; 
        digitalWrite(LedPins[5],PinStatus[5]);  
        EEPROM.write(5,PinStatus[5]);      
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN8=on ", data, 16) == 0) {
        PinStatus[6] = true; 
        digitalWrite(LedPins[6],PinStatus[6]); 
        EEPROM.write(6,PinStatus[6]);       
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN9=on ", data, 16) == 0) {
        PinStatus[7] = true;
        digitalWrite(LedPins[7],PinStatus[7]); 
        EEPROM.write(7,PinStatus[7]);
        bfill.emit_p(http_Found);
      }



      //------------------------------------------------------  



      else if (strncmp("?ArduinoPIN2=off ", data, 17) == 0) {
        PinStatus[0] = false; 
        digitalWrite(LedPins[0],PinStatus[0]); 
        EEPROM.write(0,PinStatus[0]);       
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN3=off ", data, 17) == 0) {
        PinStatus[1] = false; 
        digitalWrite(LedPins[1],PinStatus[1]);  
        EEPROM.write(1,PinStatus[1]);      
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN4=off ", data, 17) == 0) {
        PinStatus[2] = false; 
        digitalWrite(LedPins[2],PinStatus[2]); 
        EEPROM.write(2,PinStatus[2]);       
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN5=off ", data, 17) == 0) {
        PinStatus[3] = false; 
        digitalWrite(LedPins[3],PinStatus[3]); 
        EEPROM.write(3,PinStatus[3]);       
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN6=off ", data, 17) == 0) {
        PinStatus[4] = false;  
        digitalWrite(LedPins[4],PinStatus[4]); 
        EEPROM.write(4,PinStatus[4]);      
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN7=off ", data, 17) == 0) {
        PinStatus[5] = false; 
        digitalWrite(LedPins[5],PinStatus[5]); 
        EEPROM.write(5,PinStatus[5]);       
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN8=off ", data, 17) == 0) {
        PinStatus[6] = false; 
        digitalWrite(LedPins[6],PinStatus[6]);  
        EEPROM.write(6,PinStatus[6]);      
        bfill.emit_p(http_Found);
      }
      else if (strncmp("?ArduinoPIN9=off ", data, 17) == 0) {
        PinStatus[7] = false; 
        digitalWrite(LedPins[7],PinStatus[7]); 
        EEPROM.write(7,PinStatus[7]);       
        bfill.emit_p(http_Found);
      }
      //---------------------------


      else {
        // Page not found
        bfill.emit_p(http_Unauthorized);
      }
    }
    ether.httpServerReply(bfill.position());    // send http response
  }
}

Мной добавлены строчки 76 и изменена строка 175.

maikl_baklan@bk.ru
Offline
Зарегистрирован: 25.05.2014

Заметил в коде, что 5 и 6 нога используется для релющек в ней происходит иницилизация. Строка 69-70. ПОменял в строке 76 значения на 0 и 1. На Ардуино передернул разъемы из 5-6 в 0-1. Не помогло, так и определяется 51 см - максимальная дистанция.

Не понял почему не заработало на 0-ом и 1-ом пине. Нашел в чем проблема. Были заняты порты на вывод на реле. Переписал иницилизацию реле, в моем случае для открывания закрывания шарового крана с электроприводом нужно только две релюшки, оставил на 8-й и 9-й пин. Считывание дистанции сделал со 2-го и 3-его пина. Строка 25. Вывод значения дистанции в строке 106. В листинге оставил только один пунк on-off  для старта набора воды в бочку. Могу подключится на web-интервейс ардуино и включить набор воды. Выключение сделать при достижении растояния 5 см.

#include <EtherCard.h>  // Подключаем скачанную библиотеку. https://yadi.sk/d/R57sVoglbhTRN
#include <EEPROM.h> // Для  Записи / восстановление из EEPROM состояния LedPins.
#include "Ultrasonic.h"

// MAC Address должен быть уникальным в вашей сети. Можно менять. 
static byte mymac[] = { 
  0xD8,0xD8,0xD8,0xD8,0xD8,0xD8 };

// ip, статический / постоянный Address нашей Web страницы. Можно менять.  
static byte myip[] = { 
  192,168,0,122 };

// Буфер, чем больше данных на Web странице, тем больше понадобится значения буфера.
byte Ethernet::buffer[1150];
BufferFiller bfill;

// Массив задействованных номеров Pins Arduino, для управления например 8 реле.
int LedPins[] = {
  8,9};

// Массив для фиксации изменений.
boolean PinStatus[1]; // с 0 до 7.

//Тут я добавил ультразвуковой измеритель
Ultrasonic ultrasonic(2,3);

//-------------

const char http_OK[] PROGMEM =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n\r\n";

const char http_Found[] PROGMEM =
"HTTP/1.0 302 Found\r\n"
"Location: /\r\n\r\n";

const char http_Unauthorized[] PROGMEM =
"HTTP/1.0 401 Unauthorized\r\n"
"Content-Type: text/html\r\n\r\n"
"<h1>401 Unauthorized</h1>";



//------------



// Делаем функцию для оформления нашей Web страницы. 
void homePage()
{
  // Раскомментируйте / закомментируйте нужное вам количество датчиков.
  int sensor0 = analogRead(A0);
  int sensor1 = analogRead(A1);
  int sensor2 = analogRead(A2);
  int sensor3 = analogRead(A3);


/*  bfill.emit_p(PSTR("$F"
    "<title>ArduinoPIN Webserver</title>"    
    "ArduinoPIN 2: <a href=\"?ArduinoPIN2=$F\">$F</a><br />),   
*/
  bfill.emit_p(PSTR("$F"
    "<title>ArduinoPIN Webserver</title>"    
    "ArduinoPIN 2: <a href=\"?ArduinoPIN2=$F\">$F</a><br />"),   
  http_OK,

  PinStatus[0]?PSTR("off"):PSTR("on"),
  PinStatus[0]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"));

  //------------


  // Для отображения на Web странице значений с аналоговых входов analogRead(A0),(A1),(A2),(A3).

  // Авто обновление Web страницы, пригодится для частоты отображения данных с датчиков.
  // После нажатия на устройстве клиента "ArduinoPIN ON или OFF", 
  // происходит обновление Web страницы, и значение с датчиков на ней.
  // Можно этот процесс автоматизировать, + установить таймер / время авто обновление Web страницы.
  // Если авто обновление Web страницы вам не нужно, закомментируйте стоку "<meta http-equiv='refresh' content='10'/>".  
  // Время таймера устанавливается content='2'/>" '2' это 2 секунды.

  // выводим значения analogRead(A0);.
  bfill.emit_p(PSTR(
  "<meta http-equiv='refresh' content='2'/>" // Авто обновление Web страницы клиента, каждые 2 секунды.
  "<font color=\"brown\"><h3>AnalogRead(A0)</h3>""<h1>$D</h1>"),sensor0);  // h1 размер шрифта.


  // Раскомментируйте / закомментируйте нужное вам количество датчиков.

  // выводим значения analogRead(A1);.
  bfill.emit_p(PSTR("<font color=\"blue\"><h3>AnalogRead(A1)</h3>""<h1>$D</h1>"),sensor1);

  // выводим значения analogRead(A2);.
  bfill.emit_p(PSTR("<font color=\"Amber\"><h3>AnalogRead(A2)</h3>""<h3>$D</h3>"),sensor2);  

  // выводим значения analogRead(A3);.
  bfill.emit_p(PSTR("<font color=\"Burnt Orange\"><h3>AnalogRead(A3)</h3>" "<h3>$D</h3>"),sensor3);

  // Можно в одной строке.
  bfill.emit_p(PSTR("<h1>(A0)=$D"": (A1)=$D"": (A2)=$D"": (A3)=$D</h1>"),ultrasonic.Ranging(CM), sensor1 ,sensor2 ,sensor3);
}



//------------------------



void setup()
{
 Serial.begin(9600);
  // По умолчанию в Библиотеке "ethercard" (CS-pin) = № 8.
  // if (ether.begin(sizeof Ethernet::buffer, mymac) == 0).
  // and change it to: Меняем (CS-pin) на 10.
  // if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0).

  if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0);

  if (!ether.dhcpSetup()); 

  // Выводим в Serial монитор IP адрес который нам автоматический присвоил наш Router. 
  // Динамический IP адрес, это не удобно, периодический наш IP адрес будет меняться. 
  // Нам придётся каждый раз узнавать кой адрес у нашей страницы.
  ether.printIp("My Router IP: ", ether.myip); // Выводим в Serial монитор IP адрес который нам присвоил Router. 

  // Здесь мы подменяем наш динамический IP на статический / постоянный IP Address нашей Web страницы.
  // Теперь не важно какой IP адрес присвоит нам Router, автоматический будем менять его, например на "192.168.1.222". 
  ether.staticSetup(myip);

  ether.printIp("My SET IP: ", ether.myip); // Выводим в Serial монитор статический IP адрес. 
  //-----

  for(int i = 0; i <= 1; i++)
  {
    pinMode(LedPins[i],OUTPUT); // весь массив LedPins делаем OUTPUT.
    PinStatus[i]=EEPROM.read(i); // Перезаписываем значения массива PinStatus, значениями из EEPROM.
    digitalWrite(LedPins[i],PinStatus[i]); // Восстанавливаем прошлое состояние LedPins.  
  }

}

// --------------------------------------

void loop()
{

  delay(1); // Дёргаем микроконтроллер.

  word len = ether.packetReceive();   // check for ethernet packet / проверить ethernet пакеты.
  word pos = ether.packetLoop(len);   // check for tcp packet / проверить TCP пакеты.

  if (pos) {
    bfill = ether.tcpOffset();
    char *data = (char *) Ethernet::buffer + pos;
    if (strncmp("GET /", data, 5) != 0) {
      bfill.emit_p(http_Unauthorized);
    }
    else {

      data += 5;
      if (data[0] == ' ') {       
        homePage(); // Return home page, Если обнаружено изменения на станице, запускаем функцию.
        // for (int i = 0; i <= 7; i++)digitalWrite(LedPins[i],PinStatus[i]);                              
        // EEPROM.write(i,PinStatus[i]);delay(10);Serial.println(1);
      }


      // "16" = количество символов "?ArduinoPIN1=on ".
      else if (strncmp("?ArduinoPIN2=on ", data, 16) == 0) {
        PinStatus[0] = true; 
        digitalWrite(LedPins[0],PinStatus[0]); 
        EEPROM.write(0,PinStatus[0]); // записываем в ячейку EEPROM №0, текущее состояние LedPins[0].    
        bfill.emit_p(http_Found);
      }
      //------------------------------------------------------  
      else if (strncmp("?ArduinoPIN2=off ", data, 17) == 0) {
        PinStatus[0] = false; 
        digitalWrite(LedPins[0],PinStatus[0]); 
        EEPROM.write(0,PinStatus[0]);       
        bfill.emit_p(http_Found);
      }
      //---------------------------


      else {
        // Page not found
        bfill.emit_p(http_Unauthorized);
      }
    }
    ether.httpServerReply(bfill.position());    // send http response
  }
}





















 

maikl_baklan@bk.ru
Offline
Зарегистрирован: 25.05.2014

Схема включения

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

arDubino
Offline
Зарегистрирован: 12.01.2017

с бочками и емкостями лучший датчик это на перелив.

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

вода полилась дошечка от геркона оошло вот и сигнал. выключил струйки нет дошечка вернулсь на место. принцип коромысла.

моэно еще шарик на подъем как в чайниках датчик уровня. но будет же застревать.

arDubino
Offline
Зарегистрирован: 12.01.2017

можно еще конечно поплавок как в унитазе. упал вниз значит наливаем. поднялся опять геркон сработал. но тут тоже может застревать опять

maikl_baklan@bk.ru
Offline
Зарегистрирован: 25.05.2014

arDubino пишет:

с бочками и емкостями лучший датчик это на перелив.

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

вода полилась дошечка от геркона оошло вот и сигнал. выключил струйки нет дошечка вернулсь на место. принцип коромысла.

моэно еще шарик на подъем как в чайниках датчик уровня. но будет же застревать.

Товарищ, за идею спасибо, пока вот задумка с ультразвуковым дальномером, доведу ее до ума, если возникнут какие либо трудности, то как вариант.