Подключение и индикация датчика уровня жидкости

demon969
Offline
Зарегистрирован: 24.04.2012

Arduino Duemilanove.

Подключен к 14 pin датчик уровня жидкости, который работает как ключ, размыкает и замыкае цепь. http://www.ebay.com/itm/New-Liquid-Water-Level-Sensor-Horizontal-Float-S...

Последовательно датчику жидкости подключен резистор на 220 ОМ

К 10 pin подключен светодиод.

Необходимо что бы когда датчик жидкости менял свое положение (размыкал цепь или замыкал) загорался или тух светодиод соответственно.

Пример кода, но не работает, так как хочу, помогите кто может.

void setup(void){

Serial.begin(9600);
pinMode(10, OUTPUT);//иницилизация светодиода
pinMode(14, INPUT);//подключение датчика жидкости
delay(500);
}


void WaterSensor(void)
{
if (14==HIGH)
{ digitalWrite(10, HIGH);}
if (14==LOW)
{digitalWrite(10, LOW);}
demon969
Offline
Зарегистрирован: 24.04.2012
Подправил код, но все равно не работает


	void setup(void){
	 
	Serial.begin(9600);
	pinMode(10, OUTPUT);//иницилизация светодиода
	pinMode(14, INPUT);//подключение датчика жидкости
	delay(500);
	}
	 
	 
	void WaterSensor(void)
	{
        digitalRead(14);
	if (14==HIGH)
	{ digitalWrite(10, HIGH);}
	if (14==LOW)
	{digitalWrite(10, LOW);}
demon969
Offline
Зарегистрирован: 24.04.2012
int val = 0;
void setup(void){

  Serial.begin(9600);
  pinMode(10, OUTPUT);//иницилизация светодиода
  pinMode(14, INPUT);//подключение датчика жидкости
  delay(500); 
} 

void WaterSensor(void)
      {
        val = digitalRead(14);// считываем значение с входа
        
        if (val==LOW)
       { digitalWrite(10, HIGH);}
       if (val==HIGH)
       {digitalWrite(10, LOW);}
       
      }

Добавил переменную в код, поменял резистор на 10 кОМ диод то горит, то не горит. Это говорит что скорее всего что неправильно сконфигурирован вход. помогите сделать так когда поплавок внизу(контакт замкнут) светодиод горит, когда поплавок вверху(контакт разомкнут) светодиод не горит, либо горит другого цвета.

maksim
Offline
Зарегистрирован: 12.02.2012

Это говорит о том, что скорее всего вы не правильно подключаете датчик... 

Убераете резистор вообще и подключаете один провод датчика к GND, а другой к цифровому выводу 14.

#define SENSOR 14
#define LED 10

void setup() {
  digitalWrite(SENSOR, 1);
  pinMode(LED, OUTPUT);        
}

void loop(){
  if (!digitalRead(SENSOR)) {
    digitalWrite(LED, HIGH);  
  } 
  else {
    digitalWrite(LED, LOW); 
  }
}

 

Tamer
Tamer аватар
Offline
Зарегистрирован: 24.06.2012

maksim пишет:

Это говорит о том, что скорее всего вы не правильно подключаете датчик... 

Убераете резистор вообще и подключаете один провод датчика к GND, а другой к цифровому выводу 14.

Если он работает как ключ, то надо подключать так же как и кнопку

А так в одном положении вход будет притянут к земле, а в другом висеть в воздухе. Или я не прав?

maksim
Offline
Зарегистрирован: 12.02.2012

Нет, там в коде включена внутренняя подтяжка к +5V.

demon969
Offline
Зарегистрирован: 24.04.2012

Поломав голову сделал так.

Как бы все работает, при опускани поплавка светодиод зажигается, при поднятии тухнет.

Подскажите, оптимальное это решение?

int val = 0;
void setup(void){

  Serial.begin(9600);
  pinMode(10, OUTPUT);//иницилизация светодиода
  pinMode(14, INPUT);//подключение датчика жидкости
  delay(500); 
} 

void WaterSensor(void)
      {
        digitalWrite(14, HIGH);//включаем на 14 пину логическую единицу
        val = digitalRead(14);// считываем значение с входа
        
          if (val==LOW)
        {digitalWrite(10, HIGH);}
          if (val==HIGH)
       {digitalWrite(10, LOW);}
       
      }

 

maksim
Offline
Зарегистрирован: 12.02.2012

Оптимальное решение уже выше я вам написал. Или мой код вас чем-то не устраивает? Или быть может не работает?

glags
Offline
Зарегистрирован: 10.07.2012

maksim пишет:

Нет, там в коде включена внутренняя подтяжка к +5V.

Внутренняя подтяжка включается програмно, по умолчанию она не включена. Чтоб уё включить надо назначить порт как вход и записать в него "0" или "1" (командой digitalWrite), в зависимости от того к замле или плюсу хотите подтянуть вход. Внутренняя подтяжка осуществляется через резак 10к.

Записать в 14 порт "1" достаточно один раз в void setup().

PS: может мне кто поможет в теме "Не закрывается файл на SD карте "

demon969
Offline
Зарегистрирован: 24.04.2012

maksim пишет:

Оптимальное решение уже выше я вам написал. Или мой код вас чем-то не устраивает? Или быть может не работает?

Ваш код работает, и мне подсказали что более оптимальный, но я не до конца его понял (не программер я и до конца не осознал оператор !). Спасибо за помощь.

glags
Offline
Зарегистрирован: 10.07.2012

Это операция инверсии, тоесть если стоит перед значением "!" то результат обратный. Вот по этому проверяется одно и тоже условие с отличием только в "!".

step962
Offline
Зарегистрирован: 23.05.2011

glags пишет:

Внутренняя подтяжка включается програмно, по умолчанию она не включена. Чтоб уё включить надо назначить порт как вход и записать в него "0" или "1" (командой digitalWrite), в зависимости от того к замле или плюсу хотите подтянуть вход. Внутренняя подтяжка осуществляется через резак 10к.

Это не совсем так - подтянуть к земле ("pull-down") порт не удастся. Только к плюсу ("pull-up"). Запись нуля отключит какую бы то ни было подтяжку.

Вот что Atmel пишет в дейташите на ATMega328:

If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to be configured as an output pin. The port pins are tri-stated when reset condition becomes active, even if no clocks are running.

glags
Offline
Зарегистрирован: 10.07.2012

step962 пишет:

glags пишет:

Внутренняя подтяжка включается програмно, по умолчанию она не включена. Чтоб уё включить надо назначить порт как вход и записать в него "0" или "1" (командой digitalWrite), в зависимости от того к замле или плюсу хотите подтянуть вход. Внутренняя подтяжка осуществляется через резак 10к.

Это не совсем так - подтянуть к земле ("pull-down") порт не удастся. Только к плюсу ("pull-up"). Запись нуля отключит какую бы то ни было подтяжку.

Вот что Atmel пишет в дейташите на ATMega328:

If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to be configured as an output pin. The port pins are tri-stated when reset condition becomes active, even if no clocks are running.

Извиняюсь, ошибся.

PS: может мне кто поможет в теме "Не закрывается файл на SD карте "

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

to demon969

подскажите про работу самого датчика, что-то я плдохо уловил :(

в баночке есть шарик, который двигается вместе с уровнем воды и в зависимости от положения, например уровень снизился производит замыкание? так?

Но высота баночки мелкая, т.е. и уровень воды контролируется в очень небольшом пределе...

Tamer
Tamer аватар
Offline
Зарегистрирован: 24.06.2012

Оно не контролирует уровень все время и не работает как стрелка бензобака) Срабатывает при достижении определенного уровня жидкости, скажем поставили в верху бочки и как только бочка будет заполнена отключаем насос

ЗЫ. Да принцип попловка унитаза тот же) только там механически вода перекрывается, а тут ключ электрический замыкается/размыкается

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

неее....ну такие вещи понятны...хотя если брать пример с бочкой почему бы простой поплавок как у бочка унитаза не использовать? хотя там скорее всего давление не то на входе...

123ksn
Offline
Зарегистрирован: 24.11.2014

Рекомендую классную и простую схему измерителя уровня воды в баке отсюда http://radiokot.ru/forum/viewtopic.php?f=3&t=108460