Помогите закончить проект!
- Войдите на сайт для отправки комментариев
Здравствуйте!
Цель проекта: набирать воду со скважины в напорный бачок, сигнализировать о пропаже уровня в расширительном бачке отопления.
Мониторить температуру дома и управлять циркуляционным насосом и тэнами(пока не реализовано) отопления.
Мне нужны советы, чтобы завершить данный проект.
Жизнь распорядилась так, что придется покинуть скоро данный объект и заниматься им не будет времени.
Поэтому было принято решение написать Вам!
Hard:
К duemilanove подключены 1wire 7 pin ds18b20.
Потенциометр wateralarm(изначально использовался как основной датчик уровня воды)
Медные электроды(используются сейчас как датчик уровня воды)
Ethernet shield ETHER_28J60.
/*макетка 1 - - 2,3 water 4 1wire 5 + 6 расширитель */ #include <DallasTemperature.h> #include "etherShield.h" #include "ETHER_28J60.h" #include <OneWire.h> #define ONE_WIRE_BUS 7 #define TEMPERATURE_PRECISION 9 #define ENC28J60_CONTROL_CS 10 #define SPI_MOSI 11 #define SPI_MISO 12 #define SPI_SCK 13 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); OneWire ds(7); // on pin 7 // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); // декларация сетки ETHER_28J60 e;// Создали обьект e класса ETHER_28J60 // сетка uint8_t tcp_open(uint8_t mac, uint8_t ip, uint16_t port); static uint8_t mac[6] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24}; static uint8_t ip[4] = { 192, 168, 0, 25}; static uint16_t port = 8080; //.. адреса датчиков DeviceAddress Tpod1 = { 0x28, 0xB8, 0x76, 0x57, 0x04, 0x00, 0x00, 0x89}; DeviceAddress Tpod2 = { 0x28, 0xFE, 0x50, 0x57, 0x04, 0x0, 0x0, 0x2a }; DeviceAddress Ttitan = { 0x28, 0xA5, 0x47, 0x57, 0x04, 0x00, 0x00, 0xD1 } ; DeviceAddress Tobr = { 0x28, 0x53, 0x9B, 0x57, 0x04, 0x00, 0x00, 0x6E } ; DeviceAddress Thome = { 0x28, 0x5B, 0x9B, 0x57, 0x04, 0x00, 0x00, 0xCF }; // красный + белый - желтый сигнал // переменные температуры float tempS1; float tempS2; float tempS3; float tempS4; float tempS5; float tempC = 0; // переменные уровня воды // расширителя int rash = 5; //расширитель на 5 аналоге int alarm = 6; // его светодиод // бак int v1 = 4;// включатель int v2 = 3; // выключатель int water = 5;// насос int waterAlarm = 2;// сигналка на потенциометре uint8_t counter; //Здесь будем хранить счетчик void setup() { // e.ETHER_28J60clkout(2); // change clkout from 6.25MHz to 12.5MHz delay(10); e.setup(mac, ip, port); // настройка пинов pinMode(alarm, OUTPUT); pinMode(v1, INPUT); pinMode(v2, INPUT); pinMode(waterAlarm, INPUT); pinMode(water, OUTPUT); sensors.begin(); /* Serial.begin(9600); // Start up the library // if (!sensors.getAddress(Tpod1, 0)) Serial.println("Unable to find address for Device 0"); // if (!sensors.getAddress(Tpod2, 1)) Serial.println("Unable to find address for Device 1"); // if (!sensors.getAddress(Tobr, 2)) Serial.println("Unable to find address for Device 2"); // if (!sensors.getAddress(Ttitan, 3)) Serial.println("Unable to find address for Device 3"); // if (!sensors.getAddress(Thome, 4)) Serial.println("Unable to find address for Device 4"); // проверяем устройства Serial.print("Locating devices..."); Serial.print("Found "); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" devices."); // report parasite power requirements Serial.print("Parasite power is: "); if (sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF"); */ } void loop() { //digitalWrite(water,1); sensors.requestTemperatures(); //получаем температуру tempS1 = sensors.getTempC(Tpod1); tempS2 = sensors.getTempC(Tpod2); tempS3 = sensors.getTempC(Tobr); tempS4 = sensors.getTempC(Ttitan); tempS5 = sensors.getTempC(Thome); delay(600); char* params; if (params = e.serviceRequest()) { e.print("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"); // надо послать заголовок кодировки e.print("<H1>Hello World</H1>"); e.print(" Tемпература подачи 1 = ");//output the temperature to ethernet e.print(tempS1); e.print(" С. <br>"); e.print(" Tемпература подачи 2 = ");//output the temperature to ethernet e.print(tempS2); e.print(" С. <br>"); e.print(" Tемпература обратки = ");//output the temperature to ethernet e.print(tempS3); e.print("С. <br>"); e.print(" Tемпература титана = ");//output the temperature to ethernet e.print(tempS4); e.print(" С. <br>"); e.print(" Tемпература дома = ");//output the temperature to ethernet e.print(tempS5); e.print(" С. <br>"); e.print( digitalRead(water )); e.print("<H1>Web Remote</H1>"); if (strcmp(params, "?cmd=on") == 0) { // digitalWrite(outputPin, HIGH); e.print("<A HREF='?cmd=off'>Turn off</A>"); } else if (strcmp(params, "?cmd=off") == 0) // Modified -- 2011 12 15 # Ben Schueler { // digitalWrite(outputPin, LOW); e.print("<A HREF='?cmd=on'>Turn on</A>"); } e.respond();// отправляем данные клиенту } // проверяем расширитель if (analogRead(rash)<800){ digitalWrite(alarm,0); } if (analogRead(rash)>999){ digitalWrite(alarm,1); } // набираем воду в бак if (analogRead(v1)>800 && analogRead(waterAlarm)<900) { digitalWrite(water,0);// включаем } if (analogRead(v2)<900 || analogRead(waterAlarm)>900){ digitalWrite(water,1);// выключаем } if (analogRead(waterAlarm)>900){ digitalWrite(water,1); } /* Serial.print("tpod2fxb 2 = "); Serial.println(tempS2,2 ); Serial.print(" tpod1a = "); Serial.println(tempS1,2 ); Serial.print(" tobratki = "); Serial.println(tempS3,2 ); Serial.print("ttitana = "); Serial.println(tempS4,2 ); Serial.print("tdoma = "); Serial.println(tempS5,2 ); */ // Serial.print(" CRC="); // Serial.print( OneWire::crc8( data, 8), HEX); // Serial.println(); }
Возникли следующие проблемы!
Потенциометр уровня загрязнялся(гдет через месяц приходилось чистить) и происходили ложные срабатывания. Когда переделал на электроды(единица там подается резистором 10 кОм а 0 соб-сно водой) заметил что электроды начали зеленеть Вопрос: что будет надежнее потенциометр или электроды и надолго ли хватит медных электродов сеч 2,5 мм.
Ethernet shield при разработке открывал "hello world" и мой скетч, однако при удалении на 10 метров все стало открываться на 10й раз(сейчас если будет время поставлю костыль на 3,3 в. которые действительно проседают, однако мои познания в электроннике настолько скудны, что это может занять сушественное время, которого как раз нету). При подключении Ethernet использовал два разных кабела комп-хаб, заведомо рабочие(может всетаки в них проблема?)
Изначально Eshield был подключен для мониторинга значений ds18, чтоб потом написать готовый скетч включающий исп. механизмы, т.к. пока не представляю при каких значениях температуры(или разницы) включать и выключать циркуляцию отопления, однако есть желание не отключать Ethernet и мониторить объект.
Вопрос!
Что в данной ситуации сделать, чтоб получилось :-) "максимально стабильно" и "по возможности функционально"
Из непременного требования необходимо оставить набор воды в напорный бачек(что было реализовано в первой версии из 2х if и работало исправно, за исключением косяка с потенциометром)
P.S. Скетч был собран ночами копипастом из разных источников, поэтому прошу сильно камнями не кидаться.
Критику выслушаю с удовольствием.
Изначально планировалось завершить все в мае, дом мой собственный поэтому делалось все для себя(костыли,костыли).
Сейчас придется сдавать дом квартирантам и уехать к тетке из-за ее болезни.
2 причины оставить Ethernet : Мониторить отопление чтоб не разморозили и наглядная дем. версия "чего-то".
Уровень, как я понимаю, контролируется только в баке? В скважине нет проблем?
В баке сколько места для установки датчика? Не много-мало, а "скока вешать в граммах"? Какие крепления возможны: на вертикальную/горизонтальную/наклонную поверхность?
Что за датчик wateralarm? Ссылочку можете предоставить?
Не рассматривалось что-либо вроде Float-Switch-Liquid-Fluid-Water-Level-Controller-Sensor-2M или Horizontal-Water-Level-Sensor-Liquid-Float-Switch-PL-4?
В общем - конкретики побольше не мешало бы.
wateralarm это потенциометр с пенопластовым поплавком и штангой из сварочного электрода :-) из первого опыта работало, только раз в полтора месяца потенциометр приходилось чистить(печка рядом)
бак - канистра 20 л. к потолку прикрученная(планировалось летом ставить на крыше, живем всего год)
насчет ссылки спасибо, навеяло прикрутить аварийный герконовый датчик(есть несколько герконов)
поднял питание на lm317 для ентершилд, закомментировал
014
#define ENC28J60_CONTROL_CS 10
015
#define SPI_MOSI 11
016
#define SPI_MISO 12
017
#define SPI_SCK 13
стало иногда открываться, посадил ентершилд на 5в, стало намного стабильнее.
возможны глюки при касании воды общего контура оборудования, тащу заземление.
думаю заключить обращения сервера в void .
когда прикрутил все это через роутер di-524 к dyn dns стало открываться, но падает(непонятно что, толи роутер, толи ардуин),
пришлось откручивать
почему-то повисает при включении воды (не включается) digitalWrite(5), после этого перестает открываться из локалки, после нажатия на сброс набирает воду и открывается из локалки.
вариан включения сейчас выглядит так(повторюсь значения исправно берутся с двух медных штырей(советовали залудить чтоб не зеленели)) и добавлю, что силовые цепи включаются шилдом 5 в. релюшек(2 шт)с питанием самой дуины
в общем данный ентершилд в след проектах(по возможности) юзать не буду, буду искать другие варианты связи(бесплатные)
или другой шилд(куплен на buyincoins.com) он там один.
(есть dsl 200t, может когда нибудь на нем, но не сейчас).
датчики мониторят температуру, выводят ее в локалку(когда ниче не висит), можно понаблюдав за показаниями прикручивать
циркуляционный насос отопления и если повисания продолжатся оставить все без ентершилда.
в локалку(с подредактированным скетчем выводит
Tемпература подачи 1 = 66 С.// электрокотел
Tемпература подачи 2 = 64 С.// выводит температуру из котла печки( фактич. обратка электрокотла)
Tемпература обратки = 60С.
Tемпература титана = -127 С.
Tемпература дома = -127 С.
насос выключен
дом и титан пока в космосе :-) (релюшка планировалась прыгать между электрокотлом и титаном), чтоб не нагружать электросеть.
используй что-то более простое, нежели электроды для контроля уровня воды, например один или несколько датчиков по ссылкам выше. Можно хоть самому сделать, если неохота ждать посылки из китая. Поплавок, груз, геркон, прикрепить к стенке, вывести провода, загерметизировать.
Такое устройство не нужно будет обслуживать.
>Tемпература титана = -127 С.
Это ты статикой датчики из ума вывел. перезагрузи устройство (можно попробовать в таком случае переинициализировать оные) и не трогай больше датчики.