проект - контроль и управление Емкости для набора чистой воды
- Войдите на сайт для отправки комментариев
Данный проект - позволяет измерять уровень воды в Баке- _ вода очищеная и озонированная (все еще не знаю как себя поведет датчик ультразвука и датчик давления в этой среде - эксперименты впереди)- управление насосом одной кнопкой ( предусмотрен нижний порог срабатывания ) - датчик температуры - датчик давления ( задублирован - для проверки дальнейшей пригодности измерения уровня ) - имеется также аварийный поплавкоый датчик для защиты системы от перелива - датчик расхода воды измеряет( по хорошему надо калибровать - но....) обьемный расход - который запоминается и транслируется во времени ( сохранаяется ) и плюс управление озонатором - при расходе меньше 2 литров в минуту отключает и конечно сам датчик ультразвука - отслеживает полностью уровен ( эксперименты показывают точность+- 2проц- что очень не плохо ) -также предусмотена система задержки наполнения емкости (наполнение после после полного опорожнения). Приблизительно так это выглядит в макете - буду сомирать всю систесму в железе - Если будет интересно пишите- программку выложу завтра







Приветствую коллег по цеху!
Делал нечто подобное в макете http://arduino.ru/forum/proekty/kontroller-urovnya-zhidkostidatchik-urovnya-zhidkosti
Датчик работал нормально не смотря на пары, но окисления на мембранке были. Так в тестах и не дождался его поломки, купил водонепронецаемый.
В коде на всякий случай предусматривал автопроверку системы, если дистанция <=1 то сообщениея, что система нерабочая (не помню вставил ли в пример.)
P.S. как планируете организовать озонирование?
Озонаторы мы делаем на фирме есть нискочачтотные и высокочастотные и с разным выходом озона ( грамм в час) - это все отдельная тема
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); #include "Ultrasonic.h"// sensor connected to:// Trig - 12, Echo - 13 #include <Thermistor.h> #include <EEPROM.h> Thermistor temp(2);//pin A2- izmerenie temperaturi unsigned int Value ; // zapominanie rastoiania ultrasonic unsigned int Valume;//zapominanie peremenoi flowmeter Ultrasonic ultrasonic(12, 13); const int analogInPin = 0;// pressure data float outputValue = 0; int pinButton = A1; int stateRelay = HIGH; int stateButton=0; int previous = LOW; int leveltank = 0 ; long time = 0; long debounce = 50; int Relay = 10; // rele pin 10 int RelayPina = 7; //rele pin 7 int RelayPin = 9; //rele pin 7 byte sensorInterrupt = 0; // 0 = digital pin 2;1= digital pin 3 byte sensorPin = 2; // The hall-effect flow sensor outputs approximately 4.5 pulses per second per // litre/minute of flow. float calibrationFactor = 7.5; volatile byte pulseCount; float flowRate; unsigned int flowMilliLitres; float flowMilliLitres1; unsigned long totalMilliLitres; float totalMilliLitres1; unsigned long oldTime; void EEPROMWritelong(int address, long value) { //Decomposition from a long to 4 bytes by using bitshift. //One = Most significant -> Four = Least significant byte byte four = (value & 0xFF); byte three = ((value >> 8) & 0xFF); byte two = ((value >> 16) & 0xFF); byte one = ((value >> 24) & 0xFF); //Write the 4 bytes into the eeprom memory. EEPROM.write(address, four); EEPROM.write(address + 1, three); EEPROM.write(address + 2, two); EEPROM.write(address + 3, one); } //This function will return a 4 byte (32bit) long from the eeprom //at the specified address to adress + 3. long EEPROMReadlong(long address) { //Read the 4 bytes from the eeprom memory. long four = EEPROM.read(address); long three = EEPROM.read(address + 1); long two = EEPROM.read(address + 2); long one = EEPROM.read(address + 3); //Return the recomposed long by using bitshift. return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF); } void pulseCounter() { // Increment the pulse counter pulseCount++; } void setup() { Serial.begin(9600); pinMode(pinButton, INPUT); pinMode(Relay, OUTPUT); pinMode(RelayPina,OUTPUT); pinMode(RelayPin,OUTPUT); digitalWrite(Relay, HIGH); digitalWrite(RelayPin, HIGH); digitalWrite(RelayPina, HIGH); Value=0; Valume=0; pinMode(sensorPin, INPUT); digitalWrite(sensorPin, HIGH); pulseCount = 0; flowRate = 0.0; flowMilliLitres = 0; flowMilliLitres1 =0; totalMilliLitres = 0; totalMilliLitres1 = 0; oldTime = 0; totalMilliLitres1=EEPROMReadlong(0); // The Hall-effect sensor is connected to pin 2 which uses interrupt 0. // Configured to trigger on a FALLING state change (transition from HIGH // state to LOW state) attachInterrupt(sensorInterrupt, pulseCounter, FALLING); lcd.init(); lcd.clear(); lcd.backlight(); lcd.print("A Q U A"); } void loop() { float dist_cm = ultrasonic.Ranging(CM); // get distance Serial.println ("Distance cm" ) ; // print the distance Serial.println(dist_cm) ; delay(1000); int temperature = temp.getTemp(); Serial.print(" temperature is: "); Serial.print(temperature); Serial.println("*C"); lcd.clear(); lcd.setCursor(0,0); lcd.print(" temperature "); lcd.setCursor(2,1); lcd.print(temperature); delay(1000); Value=dist_cm; stateButton = digitalRead(pinButton); if ( byte (Value) <= 50 && (stateButton == HIGH&& previous == LOW && millis() - time > debounce)) { if(stateRelay == HIGH){ stateRelay = LOW; } else { stateRelay = HIGH; //upravlenie nasosom } time = millis(); } leveltank = map ( dist_cm,50,15,0,100); Serial.print(" WATER TANK % "); Serial.println(leveltank); lcd.clear(); lcd.setCursor(0,0); lcd.print(" WATER TANK % "); lcd.setCursor(2,1); lcd.print(leveltank); delay(1000); digitalWrite(Relay, stateRelay); previous == stateButton; if(byte (Value) >= 50&&(stateRelay=HIGH)) {stateButton==LOW ; } if ( byte (Value)<15 )// viklu4enie na 15 cm vklu4enie na 40cm urovnia ultrazvuka { digitalWrite(RelayPina, HIGH ); } if (byte(Value)>40) { digitalWrite(RelayPina, LOW ); } outputValue = float(analogRead(analogInPin)); Serial.print("Press Kpa = " ); Serial.println(outputValue); lcd.clear(); lcd.setCursor(0,0); lcd.print(" Pressure:"); lcd.setCursor(2,1); lcd.print(outputValue); delay(1000); if((millis() - oldTime) > 1000) // Only process counters once per second { // Disable the interrupt while calculating flow rate and sending the value to // the host detachInterrupt(sensorInterrupt); // Because this loop may not complete in exactly 1 second intervals we calculate // the number of milliseconds that have passed since the last execution and use // that to scale the output. We also apply the calibrationFactor to scale the output // based on the number of pulses per second per units of measure (litres/minute in // this case) coming from the sensor. flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor; // Note the time this processing pass was executed. Note that because we've // disabled interrupts the millis() function won't actually be incrementing right // at this point, but it will still return the value it was set to just before // interrupts went away. oldTime = millis(); // Divide the flow rate in litres/minute by 60 to determine how many litres have // passed through the sensor in this 1 second interval, then multiply by 1000 to // convert to millilitres. flowMilliLitres = (flowRate / 60)*1000 ; flowMilliLitres1= (pulseCount *60/7.5)/10000 ; //koli4estvo litrov // Add the millilitres passed in this second to the cumulative total totalMilliLitres += flowMilliLitres; totalMilliLitres1+= flowMilliLitres1; //s4et litrov // Print the flow rate for this second in litres / minute Valume=flowRate; if ( byte (Valume) <=2){ digitalWrite(RelayPin,HIGH); }else{ digitalWrite(RelayPin, LOW);// upravlenie ozonatorom } Serial.print("Flow rate: "); Serial.print(flowRate); // Print the integer part of the variabl Serial.print("L/min"); // Print the number of litres flowed in this second Serial.print(" Liquid Flowing: "); // Output separator Serial.print(flowMilliLitres); Serial.print("mL/Sec"); // Print the cumulative total of litres flowed since starting Serial.print(" Liquid Quantity: "); // Output separator Serial.print(totalMilliLitres); Serial.println("mL"); Serial.print(" Liquid Quantity: "); // Output separator Serial.print(totalMilliLitres1); Serial.println("L"); lcd.clear(); lcd.setCursor(0,0); lcd.print(" Flow rate: "); lcd.setCursor(2,1); lcd.print(flowRate); delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print(" Liquid Quantity:"); lcd.setCursor(2,1); lcd.print(totalMilliLitres1); delay(1000); // Reset the pulse counter so we can start incrementing again pulseCount = 0; // Enable the interrupt again now that we've finished sending output attachInterrupt(sensorInterrupt, pulseCounter, FALLING); long address=0; //Writing first long. EEPROMWritelong(address, totalMilliLitres1);//zapominanie rasxoda address+=4; } }есть подозрение на код расходомера ( ошибка в чтении Литр в час ) Просьба подправить если есть идеи - Заранее всем спасибо
Вот генератор Озона который используется в данной устарновке
По генератору как с Вами связаться ?
По генератору как с Вами связаться ?
e - mail : flamantino@yahoo.com
схема подключения идентична? Библиотеку менять не пришлось?
в дополнение к проекту - фото пульта
перебрал схему на Arduino Nano - получилось более компактно
flamantino пишет:
...(все еще не знаю как себя поведет датчик ультразвука и датчик давления в этой среде - эксперименты впереди)...
Сделал уровнемер на УЗ датчике. Чтобы не было коррозии от высокой влажности датчик поднял над ёмкостью. Фотки http://www.greentalk.ru/topic/3538-rastvornyj-uzel-dlya-nebolshih-teplitc/page-10#entry40491
flamantino
А у Вас УЗ датчик безошибочные данные всегда дает?
У меня частенько проскакивают не реальные значения. Но я их фильтрую... а у Вас не вижу ничего подобного....
Очень симпатично получилось
пока работает без ошибок - больше месяца - но я использую другую конструкция УЗ для установки -http://www.ebay.com/itm/Ultrasonic-Module-Distance-Measuring-Transducer-Sensor-Waterproof-DC-5V-Voltage-/231769251151?hash=item35f6861d4f:g:unwAAOSwsFpWSPbQ
схема подключения идентична? Библиотеку менять не пришлось?
Подключение было идентичным, а вот библиотеку брал по ссылке китайца с алиэкспресса. Перед покупкой уточняйте этот момент ибо есть такая экзотика, что товарищи вообще свою библиотеку писали под устройство.
P.S. вопрос к автору - а какова розничная цена подобных озоногенераторов?
цена зависит от многих факторов - начальная цена начинается с 1000 у е
Ну вот и сама установка( для чего делалось все из Ардуинки) - Озонорования и фильтрации воды - правда Озонатор пока не установлен в данном варианте - уствновлю на финальной стадии
походу опредеоилось что не правильно измеряет расход - буду разбиратся . Причем перебрал кучу - скетчей - все бесполезно - Может кто сталкивался - буду признателен-
Да еще добавил - усреднение температуры - а то сильно прыгало - после стало все нормально
После месяца эксплуатации начались проблемы- насос самопроизвольно стал включатся - датчики уровня - иногда проскакиевает - что дает переполнение или полное опорожнение - Что работатет стабильно и хорошо это датчик расхода - Всетаки я думаю проблема во влажной среде который дает такой сбой - Может кто выскажет идею - Буду благодарен
после не большой дороботки - Все работает - даже в среде Озона - Третий месяц + плюс среда - ВЛажность 85 проц - Будем дальше наблюдать