Набор воды в бочку
- Войдите на сайт для отправки комментариев
Как говорили мудрые: По частям слона съесть намного легче. Так вот одной из маленьких задач по автоматизации всего и вся, это автоматический набор емкости, из водопровода с давлением от 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.
Заметил в коде, что 5 и 6 нога используется для релющек в ней происходит иницилизация. Строка 69-70. ПОменял в строке 76 значения на 0 и 1. На Ардуино передернул разъемы из 5-6 в 0-1. Не помогло, так и определяется 51 см - максимальная дистанция.
Не понял почему не заработало на 0-ом и 1-ом пине. Нашел в чем проблема. Были заняты порты на вывод на реле. Переписал иницилизацию реле, в моем случае для открывания закрывания шарового крана с электроприводом нужно только две релюшки, оставил на 8-й и 9-й пин. Считывание дистанции сделал со 2-го и 3-его пина. Строка 25. Вывод значения дистанции в строке 106. В листинге оставил только один пунк on-off для старта набора воды в бочку. Могу подключится на web-интервейс ардуино и включить набор воды. Выключение сделать при достижении растояния 5 см.
Скетч дописываю. На концевике застрял, не хочет отключать.
с бочками и емкостями лучший датчик это на перелив.
без всяких меряний расстяний. струйкой бьете по дошечке на конце магнит и геркон закрпелен.
вода полилась дошечка от геркона оошло вот и сигнал. выключил струйки нет дошечка вернулсь на место. принцип коромысла.
моэно еще шарик на подъем как в чайниках датчик уровня. но будет же застревать.
можно еще конечно поплавок как в унитазе. упал вниз значит наливаем. поднялся опять геркон сработал. но тут тоже может застревать опять
с бочками и емкостями лучший датчик это на перелив.
без всяких меряний расстяний. струйкой бьете по дошечке на конце магнит и геркон закрпелен.
вода полилась дошечка от геркона оошло вот и сигнал. выключил струйки нет дошечка вернулсь на место. принцип коромысла.
моэно еще шарик на подъем как в чайниках датчик уровня. но будет же застревать.
Товарищ, за идею спасибо, пока вот задумка с ультразвуковым дальномером, доведу ее до ума, если возникнут какие либо трудности, то как вариант.