Сенсорные датчики и уровень воды (проблема при перезагрузке)!
- Войдите на сайт для отправки комментариев
Добрый день всем.
Возникла задача измерять уровень жидкостей, но прикосаться к ним нельзя. Приходится использовать дистанционные методы. Технологии и идеи не новы, никого и ничем тут не удивишь. Емкость маленька, так что УЗ отвалился, так как готовые решение или погружают в бак что либо, либо слишком дальнобойные. ИК не прокатил, опять защитить устройство надо, и крутые искажения при запотевании, пытались снизу поставить дальномер, но большие погрешности были! Приято решение использовать емкостные датчики.
/* ------> Далее кусок можно пропустить, идет описание старых опытов с готовыми изделиями ---->
Изначально все было радужно и красиво, когда была идея использовать котовые сенсорные кнопки с контроллером, они определяли наводки на "антене" говорили где есть вода где нет. Красота! До первыго испытания! Такие кнопки обладают "настройкой при старте", как только вы подаете туда питание она определяет свое состояние и держит его как изначальное. В моем случае, если аппарат включился, а вода в емкасти есть, то датчик выдаст на выходе 0 - типа "все пусто, заливай". Он среагирует только на изменение. Не будем же перед стартом сливать всю воды из бака? Глупо! Тем более что такая кнопочка через n - секунд отключалась, если на ее контакте не меняется емкость. Тоже подстава!
*/ <---- все!
Решено использовать саму ардуину что бы мерить уровень. Тема тут тоже не нова, есть библиотека и все хорошо, почти!
В общем виде выглядит это так: к стенке приклеиваем контакты (кусочки текстолита или алюминевый / медный скотч), грузим библиотеку, калибруем - счастье. Но не тут то было. После перезагрузки ардуины, на выходе имее значения около нуля... Но стоит выдернуть и вставить контакты, то все значения воскресают и все работает адекватно! Программный метод из библиотеки - типа не калибровать датчики не сработал, если я не правильно понял как это - поправте меня! (Тут кстати вопрос - как это програмно решить!?!)
Разумеется созрел план, где мы можем рвать контакты но не руками а автоматизированно. Придумано -сделано. Присобачил реле, которое после старта (10 сек) разрывается соединение, и все должно быть хорошо! Но опять что то идет не так!!! Реле щелкает, на момент щелчков появляется провалы в выводе состояний датчиков, а дальше все почти по нулям! Не работает вроде! Но если взять внешнее питания и присобачить к реле, то после щелчка все работает идеально! "Наверное не хватает силы тока" подумал я и присобачил усилитель!
Но усилитель запитанный от внешнего питания но принимающий команды от этого же контроллера показал что срабатывание реле на картину опять не влияют! Я взял и подключил усилок к другой ардуине - полностью развязав схемы измерения и управления реле, и другая ардуина отдает команды реле, оно срабатывает и все значения работают нормально!!!
1. Прошу помощи в понимании - почему при использовании усилителя (тока) но подключенном одном контроллере разрыв ничего не дает?
2. Можно ли разрыв и сброс значений делать программно?
3. Как избавиться от использования библиотеки? Как будет выглядеть своя функция для измерения, что бы она не запоминала изначальные значения и на подстраивалась, а тупо выводила то что сейчас видит?
Пишу я мутновато, может что-то не будет понятно из слов, я попробую пояснить! Очень итересная идея, довольно простое исполнение, которое может многим пригодится, но надо доточить до работоспособности и лишних реле+усилителей! Очень надеюсь на помощь!
#include <CapacitiveSensor.h>
#define relePIN 12
CapacitiveSensor cs_3 = CapacitiveSensor(2,3);
CapacitiveSensor cs_2 = CapacitiveSensor(4,5);
CapacitiveSensor cs_1 = CapacitiveSensor(6,7);
byte firststart = 0;
unsigned long sttime;
void setup()
{
cs_1.set_CS_AutocaL_Millis(0xFFFFFFFF); // turn off autocalibrate on channel 1 - just as an example
/* cs_2.set_CS_AutocaL_Millis(0xFFFFFFFF);
cs_3.set_CS_AutocaL_Millis(0xFFFFFFFF);
*/
//reset_CS_AutoCal;
Serial.begin(9600);
pinMode(relePIN,OUTPUT);
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
/* pinMode(7, OUTPUT);
* digitalWrite(7, HIGH);
pinMode(8, OUTPUT);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
long test1 = cs_3_4.capacitiveSensor(80); //a: Sensor resolution is set to 80Serial.println(cs);
long test2 = cs_3_5.capacitiveSensor(80); //a: Sensor resolution is set to 80Serial.println(cs);
long test3 = cs_3_6.capacitiveSensor(80); //a: Sensor resolution is set to 80Serial.println(cs);
Serial.print(test1);
Serial.print(test3);
Serial.println(test3);
//
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
//
pinMode(7, INPUT);
pinMode(7, INPUT);
*/
sttime = 0;
}
void loop() {
cs_1.set_CS_AutocaL_Millis(0xFFFFFFFF); // turn off autocalibrate on channel 1 - just as an example
if (firststart == 0 && millis() - sttime > 10000)
{
digitalWrite(relePIN,HIGH);
delay(100);
digitalWrite(relePIN,LOW);
delay(100);
digitalWrite(relePIN,HIGH);
delay(100);
digitalWrite(relePIN,LOW);
delay(100);
digitalWrite(relePIN,HIGH);
delay(100);
digitalWrite(relePIN,LOW);
delay(100);
firststart = 1;
digitalWrite(13,HIGH);
}
long cs1 = cs_1.capacitiveSensor(80);
Serial.print("1 / 3: ");
Serial.print(cs1);
/*
Serial.print(" || ");
long cs2 = cs_2.capacitiveSensor(10);
Serial.print("2 / 3: ");
Serial.print(cs2);
*/
Serial.print(" || ");
long cs3 = cs_3.capacitiveSensor(80);
Serial.print("3 / 3: ");
Serial.println(cs3);
delay(100);
if (digitalRead(9) == 1 )
{
digitalWrite(13,LOW);
digitalWrite(relePIN,HIGH);
delay(4000);
digitalWrite(relePIN,LOW);
digitalWrite(13,HIGH);
}
}
Не знаю почему и что у Вас не работает, но мне видится такое решение. Если емкость с водой и стенки тонкие, приклеиваем полоски фольги вертикально в 1-2 мм друг от друга на высоту посудины и измеряем ёмкость получившего кондёра:
1. С помощью аналогового компаратора и Т/С1 в режиме захват.
2. Пропускаете через кондёр ВЧ сигнал, детектор, преобразователь ток-напряжение на ОУ и на АЦП МК. Ток будет пропорционален ёмкости конденсатора. С дуины можно подать макс. 8 мГц. На такой частоте ток получится приличный -может сотни мкА-единицы мА.
Я поступил почти так же: вода - одна обкладка, длинная изолированная петля провода в эмалевой изоляции - другая. В инете нашел "измерение емкости ардуино" и все работает как часы. Только несколько температурозависимо. Но мне пофиг.
Не знаю почему и что у Вас не работает, но мне видится такое решение....
Спасибо за ответы, но "Не работает" не совсем верное определение. НЕ РАБОТАЕТ КАК ХОТЕЛОСЬ БЫ....
Мне мешает то что значения нулевые после сброса питания контроллера (или даже перезагрузки) и почему надо разрывать линию между контроллером и сенсором? Это заставляет делать лишние телодвижения + добавлять устройства, которые вносят свои искажения.
Как раз хотел уточник, как реализовать то что сделано в библиотеке напрямую, что бы видеть в каком месте библиотека "подкладывает свинью". Эта досадная мелочь отделяет это решение от "универсального метода измерения уровня" в небольших емкостях....
Я поступил почти так же: вода - одна обкладка, длинная изолированная петля провода в эмалевой изоляции - другая. В инете нашел "измерение емкости ардуино" и все работает как часы. Только несколько температурозависимо. Но мне пофиг.
А можно поточнее как подключается и какой скетч? А то в инете очень много чего, спасибо!
Спасибо, завтра буду пробовать!
Только схему подключения не допонял:
К между А4 и А5 мы подключаем резистор, а к А5 подключаем сам "сенсор"?
не, к этим выводам подключаете конденсатор. И все. Давно бы уж по камментам в гугле нашли оригинал ;) , вот отсюда я код спер:
http://wordpress.codewrite.co.uk/pic/2014/01/21/cap-meter-with-arduino-uno/
Это как раз я нашел, но у конденсатора 2 обкладки, у меня одна... Вторая "мнимо" идет на землю. Из вашего первого сообщения я понял, что у вас тоже самое. Т.е. используем только один котакт для подключения сенсора, или во второй нужно GDN подключить.
P.S. C физикой у меня плоховато, пытаюсь учить по мере изучения электроники и программирования...
А вес емкости измерять можно?
Это как раз я нашел, но у конденсатора 2 обкладки, у меня одна... Вторая "мнимо" идет на землю. Из вашего первого сообщения я понял, что у вас тоже самое. Т.е. используем только один котакт для подключения сенсора, или во второй нужно GDN подключить.
P.S. C физикой у меня плоховато, пытаюсь учить по мере изучения электроники и программирования...
ток не может течь по одному проводу, всегда надо два :)
Это как раз я нашел, но у конденсатора 2 обкладки, у меня одна...
Я сделал так
Можно сделать так:
Очень интересно!
на счет вашего основного метода - мне нельзя притрагиваться к воде (агрессия там такая что контакты может разъесть очень быстро + пачкает содержимое, это очень критично). Второй метод итереснее, но есть проблема, когда идет процесс налива, по специфике жидкость льется по всей поверхности, а приводит к срабатыванию датчика, если он один и большой. Если их будет несколько (т.е. на каждый уровень отдельный датчик) может не хватить мощности!
Но за идеи большое спасибо, я их все отработаю!
ток не может течь по одному проводу, всегда надо два :)
Это я тоже в школе проходил))) но как то закрадываются сомнения)))
ток не может течь по одному проводу, всегда надо два :)
Это я тоже в школе проходил))) но как то закрадываются сомнения)))
Никому не верьте!
Вспомните отвертку-индикатор. Когда вы ей дотрагиваетесь до фазы в розетке, индикатор светится. Значит ток течет. Но провод-то один!
Ну ладно вам прикалываться, я конечно тот еще тундук, но даже так я понимаю, что провод 1, но проводников 2, вторым проводником или тот кто держит ответку, или окружающее пространство выступает в роле заземления)))
С емкостным датчиком кстати тоже самое
http://www.devicesearch.ru/article/datchiki_urovnya
http://dic.academic.ru/dic.nsf/enc_chemistry/4738/%D0%A3%D0%A0%D0%9E%D0%92%D0%9D%D0%95%D0%9C%D0%95%D0%A0%D0%AB
https://www.youtube.com/watch?v=_GPvCxkWgbE
Большое расстояние между обкладками ваших "конденсаторов"
ведёт к увеличению влияния ёмкости кабеля
и окружающих предметов ( например человека подошедшего к датчику).
https://www.youtube.com/watch?v=0HezuejPpmA
Потому коаксиальный датчик самое то что надо
Я понимаю, но все мои варианты когда в бак что либо погружается становится огромной проблемой + площадь бака очень критична (любая лишняя ступенька может выйти боком, причем через несколько месяцев). Возможно я уговорю своих сделать бак другой формы, но пока форма бака неизменна.
На счет паразиток. Я пришел к выводу что если поверх датчиков наклеить алюмниевый скотч (через прокладку) и подать на него или +5 или заземлить, то значения подскакивают, но влияние окружающих предметов не вызывают перехода за "пороговые" значения, т.е. грубо говоря, можно легко отфильтровать "массивного" человека.
Проблема моего метода - сбой измерений при перезагрузке контроллера и необходимость разрыва контактов от сенсора, что бы вернуться к "нормальным" значениям...
Ну ладно вам прикалываться, я конечно тот еще тундук, но даже так я понимаю, что провод 1, но проводников 2, вторым проводником или тот кто держит ответку, или окружающее пространство выступает в роле заземления)))
С емкостным датчиком кстати тоже самое
Нет. Проводник один. И с емкостным датчиком, действительно, то же самое.
Более того, для течения тока обычно нужен ровно один проводник. Этот проводник должен соединять "+" с "-". Кто вам вообще про два рассказал?
Ну про 2 судя по скетчу предположил...
Можно попроще - какой контакт куда подключить? А то каша в голове....
Да все Вы правильно делаете. Берете алгоритмы/схемы измерения емкости. Второй контакт "конденсатора" - "мнимо в землю". И градуируете свой датчик-конденсатор. Сначала на стенде.
Почему сейчас датчик в ноль сбрасывается при обрыве питания, сказать сложно.
Может софт кривой - упрощайте до уровня простейших примеров измерения емкости и добейтесь стабильной работы.
Может в схеме какой косяк - проверьте схему на обычных конденсаторах.
В любом случае, емкость зависит только от характеристик среды и никак не может быть связана с включением/выключением конденсатора.
http://www.devicesea
Большое расстояние между обкладками ваших "конденсаторов"
ведёт к увеличению влияния ёмкости кабеля
и окружающих предметов ( например человека подошедшего к датчику).
Больше расстояние - меньше емкость. Более того: оперируйте величинами в сотни пикорофарад, а не единицы. Тогда емкость предметов влиять никак не будет.
упрощайте до уровня простейших примеров измерения емкости и добейтесь стабильной работы.
Уже было, я игрался , скетч тутачки - http://arduino.ru/forum/obshchii/datchik-urovnya-zhidkosti#comment-150649 В строках 13 номер пина на резистор, а в строке 14 - на обкладку, вторая обкладка заземлена.
учите физику. Вы вместо когденсатора подключаете к одному выводу резистор, а другой у вас болтается в воздухе. Подключите между пинами конденсатор и будет вам щасте.
учите физику. Вы вместо когденсатора подключаете к одному выводу резистор, а другой у вас болтается в воздухе. Подключите между пинами конденсатор и будет вам щасте.
Понятно все. Фраза "Подключен как интегрирующая RC, R=100k" осталось недоступна. Уточните какой мне раздел физики стоиит учить обладая высшим инженерным образованием и стажем инженера електронщика.
Общая теория электрических цепей.
Мне по ТОЭ професора высокие оценки выставили, их мнение для меня более авторитетное чем Ваше. Загуглили уже что такое интегрирующая RC или так, неуком дальше будете проводами емкости мотать?
Я не знаю какие там оценки по ТОЭ у вас были, но по русскому точно незачет. И да: ТОЭ профессора не преподают. Так что RC цепь тут совершенно ни причем. Вы же сами писали выше:
В строках 13 номер пина на резистор, а в строке 14 - на обкладку, вторая обкладка заземлена.
Между двумя пинами нет никакой электрической связи. Резистор куда? Обкладка куда? А вы говорите - ТОЭ. Чтобы померять емкость конденсатора ардуиной никакая RC цепь не нужна, нужно просто два пина. Один аналоговый, другой обычный. Между ними подключаем конденсатор. Подаем на один вывод единицу и меряем время когда на другом выводе появится единица. Так как логические пороги нечеткие, считываем аналогом. Меряем время. Пересчитываем в емкость. Сопротивление не нужно, так как качество конденсатора дерьмовое, емкость маленькая, все разрядится само собой за микросекунды.
Учите матчасть.
нужно просто два пина. Один аналоговый, другой обычный. Между ними подключаем конденсатор. Подаем на один вывод единицу и меряем время когда на другом выводе появится единица. Так как логические пороги нечеткие, считываем аналогом. Меряем время. Пересчитываем в емкость.
Почему-то мне кажется, что единица на втором выводе не появится никогда.
Сопротивление не нужно, так как качество конденсатора дерьмовое, емкость маленькая, все разрядится само собой за микросекунды.
Обычно в схемах с конденсаторами сопротивлением ограничивают скорость зарядки конденсатора (увеличивают время зарядки). Конденсатор в цепи без сопротивления может зарядиться быстрее чем выполняется команда микроконтроллера.
Почему-то мне кажется, что единица на втором выводе не появится никогда.
Да, согласен, ошибся, надо наоборот ждать когда ноль появится.
Категорически рекомендую запатентовать этот способ.
Мне достоверно известно, что так емкость еще никто не измерял.
что тут патентовать? Это очевидно. Как ведет себя разряженный конденсатор в постоянном токе?
Постоянный ток через конденсатор не течет.
Ни через заряженный, ни через разряженный.
Вот еще одному двойка по электротехнике. Пока конденсатор заряжается, постоянный ток по нему течет. Вот, например, одна из самых простых и очевидных схем, которая используется на практике:
Кто объяснит как она работает?
Кто объяснит как она работает?
я объясню. ток в приведённой схеме во время зарядки конденсатора не является постоянным - осциллограф неверующим в зубы.
Вот, например, одна из самых простых и очевидных схем,
Эта схема ровно в пять раз сложнее заявленной "конденсатор между двумя выходами Ардуины". Предлагаю все-таки не отходить далеко от вопроса. Пара-тройка конденсаторов и Ардуина есть у большинства участников форума.
Практика - критерий истины. С Вас схема и скетч. Если с их помощью можно будет отличать друг от друга разные конденсаторы, то метод рабочий.
https://www.arduino.cc/en/Tutorial/CapacitanceMeter
https://www.arduino.cc/en/Tutorial/CapacitanceMeter
Спасибо. Но...
1. Там есть резистор. У нас же заявлено:
2. Конденсатор подключается не между двумя пинами, а на землю. У нас же заявлено:
Спасибо. Но...
1. Там есть резистор. У нас же заявлено:
мне пофиг, что у вас там заявлено - дал расово правильную ссылку. нужно сказать спасибо и не выёпываться.
Вы её, простите, кому давали? Я, например, не справшивал. А спрашивал совсем другую схему, продекларированную одним из участников дискуссии.
И это не у меня заявлено. Это у нас у всех заявлено в одном из сообщений этой темы.
Вы её, простите, кому давали? Я, например, не справшивал.
не спрашивал, значит не бери - кому-то будет полезно почитать
упрощайте до уровня простейших примеров измерения емкости и добейтесь стабильной работы.
Уже было, я игрался , скетч тутачки - http://arduino.ru/forum/obshchii/datchik-urovnya-zhidkosti#comment-150649 В строках 13 номер пина на резистор, а в строке 14 - на обкладку, вторая обкладка заземлена.
Мне в бак нельзя ничего помещать. Ваш метод крут, если мне позволят сделать желобок вдоль бака. Пока бак это емкость коснусообразная, что бы максимально все стекало и не где не задерживалось + минимальная площадь внутренней поверхности.
Может найдутся люди кто сможет глянуть библиотеку, и ее нутро. Я пытался "вкурить" но не получается у меня - не хватка знаний и опыта!
Мне в бак нельзя ничего помещать.
что за жидкость в баке?
Сверхчистая вода + увеличение площади грозит ростом бактерий, котых отуда "не выкурить". В бак нельзя кроме очень чистой воды ничего заливать. Будет лишняя поверхность там они будут плодится...
Сверхчистая вода + увеличение площади грозит ростом бактерий, котых отуда "не выкурить". В бак нельзя кроме очень чистой воды ничего заливать. Будет лишняя поверхность там они будут плодится...
что такое "сверхчистая вода"? - дистиллированная?
*что бы бактерии не плодились, нужно соблюдать стерильность - самый простой способ: кипячение.
сложный способ - ультрафиолет.
Тут специфика есть, дистилированная в обычном понимании "слишком грязная" вода в моем случае. Бактерий там травят, но в других циклах и подругому. Проблема всех подобных вещей именно в баке, каждая мелочь влияет!
Тут специфика есть, дистилированная в обычном понимании "слишком грязная" вода в моем случае. Бактерий там травят, но в других циклах и подругом. Проблема всех подобных вещей именно в баке, каждая мелочь влияет!
ну, смотри - если у тебя вода очистки выше, чем дистиллированная, то она является идеальным диэлектриком.
какие с чего ты там потенциалы конденсаторами собрался снимать - я не понимаю.
*и бактерии в такой воде не могут завестись... но, это пока вторично и не важно.
так, дистиллированная вода или очищенная?
Если честно, тонкости и не могу и не осилю рассказать. Что понтенциал там будет это точно, так как датчик измеряет разницу между воздухом и водой, потенциал скакнет когда датчик перекроется жидкостью. Проводимость воды я не помню, если доведем дело до конца, я скажу какая там проводимость достигнута. Вода будет очищена (очень жестко, как мне говорят - несколько раз пополоскав рот можно лишится зубов). Я занимаюсь программной частью, а механику процесса знаю слабо, поэтому некоторые ответы могут быть очень не точными... Не хочется врать даже
пока думаешь, как бы делал я:
цилиндрический стеклянный бак со стеклянным поплавком в виде плоского диска по диаметру бака - фото-датчиками снаружи бака ловить дуиной крайние положения диска.
очень жестко, как мне говорят - несколько раз пополоскав рот можно лишится зубов
ясно - руби программерское бабло, а механику поручи идиотам, которые тебе это рассказали.