Самодельная сенсорная кнопка вместо датчика уровня жидкости
- Войдите на сайт для отправки комментариев
Доброго времени суток! Решил сделать датчик уровень жидкости на базе самодельного сенсора, взял обычную скрепку скрутил ее спиралью припаял к ней резистор на 1МОм подключил к пину 7, другой контакт от спирали к питанию 5V. Задача стояла сделать массив датчиков для разных уровней, при чем датчик должен срабатывать и держит 1, когда сенсор фиксирует прикосновение и выдавать 0, когда его нет. Написал простой код для проверки работы и тут возникли вопросы - в подпрограмме в исходном коде все работает и выдает правильно, как только я убираю ненужные строчки 53,54,55,56 все сбивается и вместо постоянной 1 уже идет череда единиц и нулей, тоже самое происходит при проверке сенсора в основной программе. Помогите разобраться что делаю не так?!
[code] int t; int i = 0; int j = 0; int col1 = 0; int row1 = 0; int sen_arr[4][2] = { {7, 0}, {23, 0}, {24, 0}, {25, 0} }; void setup() { Serial.begin (9600); pinMode (13, OUTPUT); } void loop() { sensor_data(sen_arr, row1); //if (sen_arr[row1][1] == 0 ){ // Serial.println(sen_arr[row1][1]); // } else { // Serial.println(sen_arr[row1][1]); // } } void sensor_data(int sen_arr[4][2], int row) { t = 0; pinMode (sen_arr[row][0], OUTPUT); digitalWrite (sen_arr[row][0], LOW); pinMode (sen_arr[row][0], INPUT); delayMicroseconds(25); while (!digitalRead (sen_arr[row][0])){ t++; } if (t == 0) { i++; if (i >= 3){ j = 0; sen_arr[row][1] = 0; //Serial.print("t = "); //Serial.print(t); //Serial.print(", i = "); //Serial.print(i); Serial.print(", sen_arr[row][1] = "); Serial.println(sen_arr[row][1]); digitalWrite (13, LOW); } } else { j++; if (j >= 3){ i = 0; sen_arr[row][1] = 1; Serial.print("t = "); Serial.print(t); Serial.print(", j = "); Serial.print(j); Serial.print(", sen_arr[row][1] = "); Serial.println(sen_arr[row][1]); digitalWrite (13, HIGH); } } } [/code]
А Вы не могли бы хоть немного прокомментировать код? И заодно, привести содержимое лога, который Вы печатаете? А то Ваши заявления, что "вместо постоянной 1 уже идет череда единиц и нулей" как-то повисают в воздухе. В каком месте оно идёт? Куда идёт?
Serial даёт задержку. Когда его убираешь - уходит и задержка.
Прокомментировал основное, логи по ссылке ("лог - правильно" - скетч в текущем виде, "лог - неправильно" - поставлен комментарий на 55-58). при изменениях в основной программе также идут изменения похожие на 2-й лог.
https://disk.yandex.ru/d/UN3MHgVvJHWIdA
понятно что связано с временными задержками, главный вопрос как сделать универсальный корректный код чтобы работа кнопки была по тех.заданию - нажата держит 1, отжата держит 0.
Jonotan75, вопрос конечно интересный. Но вот незадача. Как научить человека написать цифровой автомат, если объяснения занимают кучу времени. И нет гарантии что дойдет. Так что лучше с этим делом лучше завязать сразу.
Не очень понятно, как оно работает, и так же переменная row...
Датчики, для отладки, лучше временно заменить на кнопки с фиксацией или выключатели
Не тема, а парад нелепостей, начиная с заголовка
Что у Вас в массиве sen_arr? Если верить строкам №№30-31, то номера пинов. Но тогда зачем Вы ему что-то присваиваете в строках №№ 41 и 54?
Что у Вас в массиве sen_arr? Если верить строкам №№30-31, то номера пинов. Но тогда зачем Вы ему что-то присваиваете в строках №№ 41 и 54?
судя по коду, массив sen_arr двумерный, в каждой строчке первый элемент - номер пина кнопки, второй - состояние этой кнопки.
согласен с BH, код - сплошная нелепость, начиная с описания переменных и заголовка функции
Вот еще вот это мне понравилось:
проверяем переменную, если ноль - печатаем, а если нет... все равно печатаем!
"К чему эти метания. Маша?"
проверяем переменную, если ноль - печатаем, а если нет... все равно печатаем!
Почему Вы не допускаете, что человек - пофигист и так самовыражается?
На кнопки нельзя заменить, т.к. сенсор планируется использовать как датчик уровня, т.к. он реагирует на подъем воды и на спуск воды
Суть в чем скетч, проверить можно ли настроить сенсор как датчик уровня или нет, а принты для контроля и проверки. Проверка показала что задержки (выполнения команд) влияют на состояние сенсора. Готов выслушать дельные предложения по коду.
Не тема, а парад нелепостей, начиная с заголовка
Для каждого своя важная тема, у Вас есть недорогое решение датчика уровня минимум в двух положениях в одной емкости?
проверяем переменную, если ноль - печатаем, а если нет... все равно печатаем!
Почему Вы не допускаете, что человек - пофигист и так самовыражается?
Готов выслушать все включая критику) Но лучше дельные предложения по коду как настроить датчик!)
Что у Вас в массиве sen_arr? Если верить строкам №№30-31, то номера пинов. Но тогда зачем Вы ему что-то присваиваете в строках №№ 41 и 54?
Массив пинов и состояний на 4 датчика. Это фрагмент кода, хочу настроить один датчик.
А где схему такого сенсора взяли? Он вообще может корректно работать, от пальца? :-)
само собой, у вас проблема в тм, что не можете упорядочить свои мысли. Заголовок написан про одно, первое же предложение начинается про другое, схема описана так, что работать в принципе не может, скетч так вообще отдельная песня. Вы хоть с физ т.з. понимаете, как хотите что-то получить? Я вот думаю что ни фига не понимаете.
Но лучше дельные предложения по коду как настроить датчик!)
Блин, ну отвечайте же "дельно" на вопросы.
Я Вас спросил, что именно в этом массиве? А Вы мне что?
Массив пинов и состояний на 4 датчика. Это фрагмент кода, хочу настроить один датчик.
Объясните же толком, что именно в этом массиве?
Или это только мне нужно?
Но лучше дельные предложения по коду как настроить датчик!)
Блин, ну отвечайте же "дельно" на вопросы.
Я Вас спросил, что именно в этом массиве? А Вы мне что?
Массив пинов и состояний на 4 датчика. Это фрагмент кода, хочу настроить один датчик.
Объясните же толком, что именно в этом массиве?
Или это только мне нужно?
столбец 0 - пин датчиков, столбец 1 - состояние датчиков, по строкам 0-3 - четыре датчика, вроде все?
само собой, у вас проблема в тм, что не можете упорядочить свои мысли. Заголовок написан про одно, первое же предложение начинается про другое, схема описана так, что работать в принципе не может, скетч так вообще отдельная песня. Вы хоть с физ т.з. понимаете, как хотите что-то получить? Я вот думаю что ни фига не понимаете.
Разложу как вижу:
1) Касательно заголовка - чувствительность датчика будет увеличена, чтобы небыло прямого прикосновения? это конечная цель, 2) первое предложение - фиксация состояния как я понимаю не зависит от чувствительности если есть алгоритм, 3) по схеме - вот я и прошу определится - возможно это сделать, 4) скетч - набросок алгоритма который не идеален, коменты не убраны специально чтобы показать суть проблемы. Как-то так так что скажите по сути дела, как сделать правильно?!
А где схему такого сенсора взяли? Он вообще может корректно работать, от пальца? :-)
Схема обычная в инете есть, как кнопка работает идеально
Дожили, у народа на ТТР223 денег нет
То ли ещё будет.(
Как по мне, крутить в лупе с большой скоростью опрос датчиков не следует
Лучше опрашивать их через определённые промежутки времени, к примеру
А где схему такого сенсора взяли? Он вообще может корректно работать, от пальца? :-)
Схема обычная в инете есть, как кнопка работает идеально
По словесному описанию исходного сообщения схема такая :-)
... взял обычную скрепку скрутил ее спиралью припаял к ней резистор на 1МОм подключил к пину 7, другой контакт от спирали к питанию 5V...
Или я упустил что?
Вопрос по коду из #3
В чём смысл цикла в строка №34-35. Что там делается? Генерируется случайное целое число в переменной t? Или что?
Дожили, у народа на ТТР223 денег нет
ТТР223 нормально работает как кнопка. Как датчик уровня - не получится, думал об этом.
При подаче питания у нее начинается процесс самокалибровки.
После самокалибровки переходит в режим выключено, даже если был прижат палец.
Хотел определять опускание воды ниже определенного уровня в пластиковой емкости, в автополивалке.
Дожили, у народа на ТТР223 денег нет
Проблема в том, что в ТТР223 нет удержания 1, т.е. есть триггер если соединить перемычку - при одном нажатии фиксирует 1, при повторном - убирает 1 на 0. т.е. речь темы использование сенсора как датчика уровня воды необходимо при наличии воды (читай нажатии) фиксировать 1, а при опускания уровня воды (читай отжатия) фиксировать 0. Если в обычном режиме при нажатии более 10сек. срывается уровень 1 до 0. Вот такая проблема с вашей кнопкой...
Вопрос по коду из #3
В чём смысл цикла в строка №34-35. Что там делается? Генерируется случайное целое число в переменной t? Или что?
Нашел в инете, видео мужик нормально принцип объясняет работы кнопки и скетча http://www.youtube.com/watch?v=5R0TVoSefwM
Как по мне, крутить в лупе с большой скоростью опрос датчиков не следует
Лучше опрашивать их через определённые промежутки времени, к примеру
спасибо за предложение, основная проблема фиксить чистую 1 при нажатии и удержании и 0 при отжатии сенсора.. это сильно озадачивает как сделать... ( Скинул ролик может понятней будет.
основная проблема фиксить чистую 1 при нажатии и удержании и 0 при отжатии сенсора.. это сильно озадачивает как сделать... ( Скинул ролик может понятней будет.
Считать "тики" и , опытным путём , определить , что, например(условно) , меньше 5-бак пустой(0). больше 7- полный(1).
Середина - "серая зона" дребезг.
Ещё как вариант поискать другие датчики, т.к этот возможно будет работать нестабильно
И, кстати, вода - не палец, возможно ёмкость не увеличится, а, наоборот уменьшится, ещё от бака будет зависеть и ещё чего-нибудь...))
Возьми вот такой даччик и не тра... мосх. На моей бочке 2 сезона отстоял, грядёт третий. У меня только сверху стоИт, но ничего не мешает и в середину и в низ ёмкости врЕзаться
Вопрос по коду из #3
В чём смысл цикла в строка №34-35. Что там делается? Генерируется случайное целое число в переменной t? Или что?
Нашел в инете, видео мужик нормально принцип объясняет работы кнопки и скетча http://www.youtube.com/watch?v=5R0TVoSefwM
Простите, я не смотрю видео на ютубе (мне порнхаба хватает), Вы можете объяснить что делается в этих двух строчках Вашего (а не автора видео) кода? Генерируется случайное число? Или что?
увеличение входной емкости он там пытается фиксировать
если t==0 емкость исходная, если больше нуля - емкость увеличилась
увеличение входной емкости он там пытается фиксировать
если t==0 емкость исходная, если больше нуля - емкость увеличилась
Но там ведь может получиться любое число, в том числе и 0, и отрицательное, и какое угодно. Это же тупой цикл безо всяких задержек. За какое время переполнится int, станет отрицательным, а потом и снова нулём? На обычной 16МГц avr-дуине отрицательным оно станет через 160 миллисекунд, а нулём - через 320 миллисекунд! Это нормально для данной задачи? Я не знаю, может и нормально, но я пытаюсь, подвести ТС к понимаю этого момента, а он мне предлагает какие-то видосы. Они мне нужны, эти видосы? Зачем? Мне нужно что-то понять или самому ТС?
Возьми вот такой даччик и не тра... мосх. На моей бочке 2 сезона отстоял, грядёт третий. У меня только сверху стоИт, но ничего не мешает и в середину и в низ ёмкости врЕзаться
герконовый?
герконовый?
да
Дожили, у народа на ТТР223 денег нет
ТТР223 нормально работает как кнопка. Как датчик уровня - не получится, думал об этом.
При подаче питания у нее начинается процесс самокалибровки.
После самокалибровки переходит в режим выключено, даже если был прижат палец.
Хотел определять опускание воды ниже определенного уровня в пластиковой емкости, в автополивалке.
Чисто теоретически любое.
В предыдущих строках (30,31) был сброс емкости нулем, теперь пин читается как вход 32, а емкость заряжается через резистор 1М. Спустя некоторое время от момента сброса напряжение на входе достигнет половины питания и вместо нуля будет читаться единица. Она и останавливает цикл.
Фактически настраиваемый параметр это хреновины вот это время задержки
33
delayMicroseconds(25);
за это время напряжение должно дорасти до пол питания, если нет касания сенсора, тогда t =0.
А вообще этот аппаратно-программный сенсор успешен?
не проще так:?
Гермотрубка, герконы, резисторы, поплавок-кольцо-магнит.
Вообще его противопоказано применять в таком виде, из-за наличия такого фактора, как статическое электричество. Даже нормативы существуют о стойкости к статике при наличии электрических частей девайса доступных рукам.
Возьми вот такой даччик и не тра... мосх. На моей бочке 2 сезона отстоял, грядёт третий. У меня только сверху стоИт, но ничего не мешает и в середину и в низ ёмкости врЕзаться
герконовый?
Рассматривал это вариант, не очень практичен, т.к. громоздкий достаточно емкость есть одна небольшая и нужно отслеживать 2 уровня минимум и максимум, во-вторых нужна высокая точность речь идет о десятках граммов. И вообще хотелось что нибудь недорогое и универсальное - сенсор можно поставить через стенку на любой уровень, ничего резать не надо.
основная проблема фиксить чистую 1 при нажатии и удержании и 0 при отжатии сенсора.. это сильно озадачивает как сделать... ( Скинул ролик может понятней будет.
Считать "тики" и , опытным путём , определить , что, например(условно) , меньше 5-бак пустой(0). больше 7- полный(1).
Середина - "серая зона" дребезг.
Ещё как вариант поискать другие датчики, т.к этот возможно будет работать нестабильно
И, кстати, вода - не палец, возможно ёмкость не увеличится, а, наоборот уменьшится, ещё от бака будет зависеть и ещё чего-нибудь...))
ТТР223 нормально на воду реагирует, но недолго). Думаю вопрос только алгоритма и все заработает. Диапазон регистрации 1 или 0 параметром можно регулировать для гарантии. Можно по тикам по подробнее, какой-нибудь фрагмент кода применительно к ситуации.. буду экспериментировать)
Чисто теоретически любое.
В предыдущих строках (30,31) был сброс емкости нулем, теперь пин читается как вход 32, а емкость заряжается через резистор 1М. Спустя некоторое время от момента сброса напряжение на входе достигнет половины питания и вместо нуля будет читаться единица. Она и останавливает цикл.
Фактически настраиваемый параметр это хреновины вот это время задержки
33
delayMicroseconds(25);
за это время напряжение должно дорасти до пол питания, если нет касания сенсора, тогда t =0.
Все так и есть, спасибо) Минуса быть не может из-за задержки, только 0 и больше, я упростил для контроля ситуации - только 0 или 1
Для контроля уровня жидкости для радиопрозрачной емкости (Стекло или пластмасса)использую такой датчик из Китая:
,
У этого датчика нет самокалибровки в момент включения, как у TTP223. В этом конкретном датчике имеется выход-открытый коллектор.Использую такой датчик в схеме с Attiny85 для контроля уровня тосола в авто.Работает очень хорошо, и зимой и летом.
Можно по тикам по подробнее, какой-нибудь фрагмент кода применительно к ситуации.. буду экспериментировать)
delay только для упрощения примера, лучше millis
Рассматривал это вариант, не очень практичен, т.к. громоздкий достаточно емкость есть одна небольшая и нужно отслеживать 2 уровня минимум и максимум, во-вторых нужна высокая точность речь идет о десятках граммов. И вообще хотелось что нибудь недорогое и универсальное - сенсор можно поставить через стенку на любой уровень, ничего резать не надо.
Осталось только услышать, что эти десятки граммов нужно ловить на тонне жидкости, а жидкость эта - расплавленный чугун! Шутка, если что. Но есть сомнения, тот ли Вы метод измерения осваиваете...
Вернемся к поставленному вопросу, чтобы оценить реалистичность алгоритма.
Для RC цепочки время заряда до пол питания определяется формулой 0,69*RC, и где R =1 МОм,
подставив в нее граничные значения 25 мкс и 160 мс и рассчитав емкость получим, что
емкость самого контакта должна быть не более 36 пф, а максимальная емкость не более 200 нФ.
200 нФ это очень большая емкость для уединенного тела. По определению ESDA, модель человеческого тела для измерения емкости представляет собой конденсатор 100 пф , соединенный последовательно с резистором 1,5к.
Т.е. в плане алгоритма, тут все вполне сходится даже с солидным запасом.
Не совсем понятно как все это соотносится с задачей ТС, т.е. насколько может измениться емкость в его случае.