проект - контроль и управление Емкости для набора чистой воды

flamantino
Offline
Зарегистрирован: 13.06.2014

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

 

 

 

 

 

 

 

 

 

Bierman
Offline
Зарегистрирован: 13.05.2014

Приветствую коллег по цеху!

Делал нечто подобное в макете http://arduino.ru/forum/proekty/kontroller-urovnya-zhidkostidatchik-urovnya-zhidkosti

Датчик работал нормально не смотря на пары, но окисления на мембранке были. Так в тестах и не дождался его поломки, купил водонепронецаемый.

В коде на всякий случай предусматривал автопроверку системы, если дистанция  <=1 то сообщениея, что система нерабочая (не помню вставил ли в пример.)

 

 

P.S.  как планируете организовать озонирование?

flamantino
Offline
Зарегистрирован: 13.06.2014

Озонаторы мы делаем  на фирме есть нискочачтотные и высокочастотные и с разным выходом озона ( грамм  в час)  - это все отдельная тема  

flamantino
Offline
Зарегистрирован: 13.06.2014
#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;
}
 
 
  }

 

flamantino
Offline
Зарегистрирован: 13.06.2014

есть подозрение на код расходомера ( ошибка в чтении Литр в  час ) Просьба подправить если есть идеи - Заранее всем спасибо 

flamantino
Offline
Зарегистрирован: 13.06.2014

Вот генератор Озона который используется в данной устарновке

inspiritus
Offline
Зарегистрирован: 17.12.2012

По генератору как с Вами связаться ?

flamantino
Offline
Зарегистрирован: 13.06.2014

inspiritus пишет:

По генератору как с Вами связаться ?

e - mail : flamantino@yahoo.com

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Bierman пишет:
Датчик работал нормально не смотря на пары, но окисления на мембранке были. Так в тестах и не дождался его поломки, купил водонепронецаемый.

схема подключения идентична? Библиотеку менять не пришлось?

flamantino
Offline
Зарегистрирован: 13.06.2014

в дополнение к проекту  - фото пульта

 

flamantino
Offline
Зарегистрирован: 13.06.2014

flamantino
Offline
Зарегистрирован: 13.06.2014

перебрал схему на Arduino Nano - получилось более компактно 

Pyotr
Offline
Зарегистрирован: 12.03.2014

 flamantino пишет:
...(все еще не знаю как себя поведет датчик ультразвука и датчик давления в этой среде  - эксперименты впереди)...

Сделал уровнемер на УЗ датчике. Чтобы не было коррозии от высокой влажности датчик поднял над ёмкостью. Фотки http://www.greentalk.ru/topic/3538-rastvornyj-uzel-dlya-nebolshih-teplitc/page-10#entry40491

Jek
Offline
Зарегистрирован: 05.01.2014

flamantino

А у Вас УЗ датчик безошибочные данные всегда дает?

У меня частенько проскакивают не реальные значения. Но я их фильтрую... а у Вас не вижу ничего подобного....

 

flamantino
Offline
Зарегистрирован: 13.06.2014

Очень симпатично получилось 

flamantino
Offline
Зарегистрирован: 13.06.2014

пока работает без ошибок - больше  месяца  - но я  использую другую конструкция УЗ для установки -http://www.ebay.com/itm/Ultrasonic-Module-Distance-Measuring-Transducer-Sensor-Waterproof-DC-5V-Voltage-/231769251151?hash=item35f6861d4f:g:unwAAOSwsFpWSPbQ 

Bierman
Offline
Зарегистрирован: 13.05.2014

Tomasina пишет:

Bierman пишет:
Датчик работал нормально не смотря на пары, но окисления на мембранке были. Так в тестах и не дождался его поломки, купил водонепронецаемый.

схема подключения идентична? Библиотеку менять не пришлось?

Подключение было идентичным, а вот библиотеку брал по ссылке китайца с алиэкспресса. Перед покупкой уточняйте этот момент ибо есть такая экзотика, что товарищи вообще свою библиотеку писали под устройство.

 

 

 

 

P.S. вопрос к автору - а какова розничная цена подобных озоногенераторов?

flamantino
Offline
Зарегистрирован: 13.06.2014

цена зависит от многих факторов -  начальная цена начинается с 1000  у е

flamantino
Offline
Зарегистрирован: 13.06.2014

Ну вот и сама установка( для чего делалось все из Ардуинки) - Озонорования и фильтрации воды - правда Озонатор пока не установлен в данном варианте - уствновлю на финальной стадии

flamantino
Offline
Зарегистрирован: 13.06.2014

походу опредеоилось что не правильно измеряет расход - буду разбиратся . Причем перебрал кучу - скетчей - все бесполезно - Может кто сталкивался - буду признателен- 

 

flamantino
Offline
Зарегистрирован: 13.06.2014

Да еще добавил - усреднение температуры - а то сильно прыгало - после стало все нормально  

flamantino
Offline
Зарегистрирован: 13.06.2014

После месяца эксплуатации начались проблемы- насос самопроизвольно стал включатся - датчики уровня - иногда проскакиевает - что дает переполнение или полное опорожнение - Что работатет стабильно и хорошо это датчик  расхода - Всетаки я думаю проблема во влажной среде который дает такой сбой - Может кто выскажет идею - Буду благодарен  

flamantino
Offline
Зарегистрирован: 13.06.2014

после не большой дороботки - Все работает - даже в среде Озона - Третий месяц + плюс среда - ВЛажность 85 проц - Будем дальше наблюдать