Как пин сделать входом и установить на него низкий уровень

Gosha
Offline
Зарегистрирован: 06.02.2014

Добрый всем день!

Недавно ко мне в строящийся дом залезли жулики. Озадачился созданием сигнализации с двумя PIR датчиками.

При написании кода в среде Arduino все работает без проблем. Но - потребление в 30 мА слишком много. 

 
int Sirena = 12; // выход на сирену
int led = 13; //просто лед
int Pir1 = 2;  //вход ПИР датчика
int Pir2 = 3;  //вход ПИР датчика
int Kn = 4;  //вход ПИР датчика


void setup() {                
 
  pinMode(led, OUTPUT);     
  pinMode(Sirena, OUTPUT);
 pinMode(Pir1, INPUT);
  pinMode(Pir2, INPUT);
 pinMode(Kn, INPUT);
}

void loop() {
 if (digitalRead (Pir1) == HIGH || digitalRead (Pir2) == HIGH || digitalRead (Kn) == HIGH)
  {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);             
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(500);             
}
}

Поэтому очень хочется перевести код на Attiny13a

При написании вот такого кода в среде AtmelStudio 6



#define F_CPU 1200000UL

#include <avr/io.h>
#include <util/delay.h>

#define LED_BIT1 _BV(PB1)
#define LED_BIT2 _BV(PB2)
#define LED_BIT3 _BV(PB3)
#define LED_BIT4 _BV(PB4)

int main()
{
	DDRB |= LED_BIT1; // OUTPUT нога 6
	DDRB |= LED_BIT2; // OUTPUT нога 7
//	DDRB &= ~ LED_BIT3; // INPUT нога 2
//	PORTB &= ~LED_BIT3; // LOW	
	
	DDRB &= ~(1<<3);  // устанавливаем вывод PB3 как вход
	PORTB &= ~(1<<3); // устанавливаем низкий уровень на выводе PB3
	DDRB &= ~(1<<4);  // устанавливаем вывод PB4 как вход
	PORTB &= ~(1<<4); // устанавливаем низкий уровень на выводе PB4
	
	while (1)
	{
		if (PINB & (1<<PINB3)||PINB & (1<<PINB4))  //Чтение состояния(лог. 1) на порту ввода вывода:
		
		{
		PORTB |= LED_BIT2; // HIGH
		_delay_ms(900);
		PORTB &= ~LED_BIT2; // LOW
		
		PORTB |= LED_BIT1; // HIGH
		_delay_ms(300);
		PORTB &= ~LED_BIT1; // LOW
		}
	
	}
}

На входах PB3 PB4 все время присутствует 1 (меряю вольтметром).

Датчики PIR работают правильно - при сработке выдают 1, через некоторое время ее сбрасывают (в том числе без контроллера)

А на ногах контроллера все равно присутстует 1, независимо от того, подключен датчик или нет.

КТо может сказать - как правильно прописать пины как ВХОДы и установить на них 0 по умолчанию?

 

Logik
Offline
Зарегистрирован: 05.08.2014

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

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Gosha  Етот ваш код отлично подходит для тини13 и занимает без ужимки всего половину памяти, только ножки выставьте как на тини там их всего 5.

 
int Sirena = 12; // выход на сирену
int led = 13; //просто лед
int Pir1 = 2;  //вход ПИР датчика
int Pir2 = 3;  //вход ПИР датчика
int Kn = 4;  //вход ПИР датчика


void setup() {                
 
  pinMode(led, OUTPUT);     
  pinMode(Sirena, OUTPUT);
 pinMode(Pir1, INPUT);
  pinMode(Pir2, INPUT);
 pinMode(Kn, INPUT);
}

void loop() {
 if (digitalRead (Pir1) == HIGH || digitalRead (Pir2) == HIGH || digitalRead (Kn) == HIGH)
  {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);             
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(500);             
}
}

Gosha
Offline
Зарегистрирован: 06.02.2014

Logik пишет:

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

Хочу - чтобы при срабатывании датчика движения (а это 1 на вход) - тинька это понимала. Если я подтяну ногу через резистор к питанию - все равно же на входе будет 1, независимо от сигнала датчика? Правильно?

 

 

Gosha
Offline
Зарегистрирован: 06.02.2014

bodriy2014 пишет:

Gosha  Етот ваш код отлично подходит для тини13 и занимает без ужимки всего половину памяти, только ножки выставьте как на тини там их всего 5.

 
int Sirena = 12; // выход на сирену
int led = 13; //просто лед
int Pir1 = 2;  //вход ПИР датчика
int Pir2 = 3;  //вход ПИР датчика
int Kn = 4;  //вход ПИР датчика


void setup() {                
 
  pinMode(led, OUTPUT);     
  pinMode(Sirena, OUTPUT);
 pinMode(Pir1, INPUT);
  pinMode(Pir2, INPUT);
 pinMode(Kn, INPUT);
}

void loop() {
 if (digitalRead (Pir1) == HIGH || digitalRead (Pir2) == HIGH || digitalRead (Kn) == HIGH)
  {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);             
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(500);             
}
}

А программировать из среды Ардуино?

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Gosha пишет:

А программировать из среды Ардуино?

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

Могу скинуть и IDE портабл с установленной тини13.

Logik
Offline
Зарегистрирован: 05.08.2014

Gosha пишет:

Logik пишет:

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

Хочу - чтобы при срабатывании датчика движения (а это 1 на вход) - тинька это понимала. Если я подтяну ногу через резистор к питанию - все равно же на входе будет 1, независимо от сигнала датчика? Правильно?

 

 

Нет. Если датчик выдаст 0 - будет ноль, т.к. ток с выхода датчика больше чем с подтяжки. Если датчик выдаст 1 - будет 1. Если ничего не выдаст - отключили, будет один за счет подтяжки

Gosha
Offline
Зарегистрирован: 06.02.2014

bodriy2014 пишет:

Gosha пишет:

А программировать из среды Ардуино?

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

Могу скинуть и IDE портабл с установленной тини13.

БОльшое спасибо! HEX вполне подойдет
Мыло Swed777@ya.ru

Если можно - пины будут такие:

Ардуино (PIR1=2  PIR2=3) --- это в Attiny13a - порты PB3 PB4 (номер ноги в тиньке 2 и 3 соответственно)  

Ардуино (Kn=4)  ---- это в Attiny13a - порт PB0 (5 нога тиньки)

Ардуино (Sirena = 12) ---- это в Attiny13a - порт PB2 (5 нога тиньки)

Заранее еще раз спасибо!

Gosha
Offline
Зарегистрирован: 06.02.2014

Logik пишет:

Gosha пишет:

Logik пишет:

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

Хочу - чтобы при срабатывании датчика движения (а это 1 на вход) - тинька это понимала. Если я подтяну ногу через резистор к питанию - все равно же на входе будет 1, независимо от сигнала датчика? Правильно?

 

 

Нет. Если датчик выдаст 0 - будет ноль, т.к. ток с выхода датчика больше чем с подтяжки. Если датчик выдаст 1 - будет 1. Если ничего не выдаст - отключили, будет один за счет подтяжки

Спасибо. Но можно еще раз и помедленнее для "одаренных" ))

А почему, если подключить датчик к пину БЕЗ подтяжки к Питанию - то при отсутствии сигнала датчика на ноге висит 1? Она же по-идее должен уходить через контакт датчика на землю и на пине должен быть низкий уровень?

Или я туплю?

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Gosha пишет:

БОльшое спасибо! HEX вполне подойдет
Мыло Swed777@ya.ru

Если можно - пины будут такие:

Ардуино (PIR1=2  PIR2=3) --- это в Attiny13a - порты PB3 PB4 (номер ноги в тиньке 2 и 3 соответственно)  

Ардуино (Kn=4)  ---- это в Attiny13a - порт PB0 (5 нога тиньки)

Ардуино (Sirena = 12) ---- это в Attiny13a - порт PB2 (5 нога тиньки)

Заранее еще раз спасибо!

Вот код скомпилировал сразу для разных частот 9.6 и 1.2МГц

выслал на почту проверяйте.

 
int Sirena = PB2; // выход на сирену
int led = PB1; //просто лед
int Pir1 = PB3;  //вход ПИР датчика
int Pir2 = PB4;  //вход ПИР датчика
int Kn = PB0;  //вход ПИР датчика


void setup() {                
 
  pinMode(led, OUTPUT);     
  pinMode(Sirena, OUTPUT);
 pinMode(Pir1, INPUT);
  pinMode(Pir2, INPUT);
 pinMode(Kn, INPUT);
}

void loop() {
 if (digitalRead (Pir1) == HIGH || digitalRead (Pir2) == HIGH || digitalRead (Kn) == HIGH)
  {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);             
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(500);             
}
}

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Кстати у меня выход датчика в самом даьчике подтянут.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Gosha Я код не просмотрел просто скомпилировал, чтож вы включение сирены забыли прописать!?

Gosha
Offline
Зарегистрирован: 06.02.2014

bodriy2014

Подтянут к питанию или земле?

Каким резистором?

Сейчас только что пробовал 4,7 ком и к питанию, и к земле. Все равно на входе 1. (это я про код для тиньки говорю)

Протормозил - код был отладочный, пытался разобраться со входом.

МОжно сейчас поправлю и на почту вышлю?

 

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

Gosha пишет:

А почему, если подключить датчик к пину БЕЗ подтяжки к Питанию - то при отсутствии сигнала датчика на ноге висит 1? 

Там может висеть и переключаться 100500 раз в секунду всё что угодно - будут тупо ловиться все помехи.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Gosha пишет:

bodriy2014

Подтянут к питанию или земле?

Каким резистором?

Сейчас только что пробовал 4,7 ком и к питанию, и к земле. Все равно на входе 1. (это я про код для тиньки говорю)

Протормозил - код был отладочный, пытался разобраться со входом.

МОжно сейчас поправлю и на почту вышлю?

Берете резистор на 10КОм и подтягиваете к земле выход датчика пир он же вход на тини13, чтоб когда датчик выдавал LOW пин не ловил наводки и небыло ложных срабатываний.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

соберите все на Ардуино и проверьте что работает без ложных срабатываний, потом просто перекомпилируете под тини, у вас команды простые все пойдет.

У меня отладочная плата, так я сразу для тини код пишу.

И не забывайте что все входы контроллера нужно подтягивать иначе это антена которая ловит помехи!(

Gosha
Offline
Зарегистрирован: 06.02.2014

На Ардуино код работает четко, без ложных срабатываний. Собрал, проверил, 2 часа гонял собранное.

С тинькой  - завтра сделаю печатную плату , включая подтягивающие резисторы, тогда проверю.

Еще раз хочу уточнить - подтягиваем к ЗЕМЛЕ, правильно? А то Logik сказал, что подтягиваем к питанию.

В любом случае - всем спасибо. Завтра отпишусь о результатах

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Gosha пишет:

На Ардуино код работает четко, без ложных срабатываний. Собрал, проверил, 2 часа гонял собранное.

С тинькой  - завтра сделаю печатную плату , включая подтягивающие резисторы, тогда проверю.

Еще раз хочу уточнить - подтягиваем к ЗЕМЛЕ, правильно? А то Logik сказал, что подтягиваем к питанию.

В любом случае - всем спасибо. Завтра отпишусь о результатах

Если вы подтяните выход своего датчика к питанию то он всегда будет выдавать HIGH и сирена всегда будет голосить!)

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

Gosha пишет:

Еще раз хочу уточнить - подтягиваем к ЗЕМЛЕ, правильно? А то Logik сказал, что подтягиваем к питанию.

Это зависит от того, какой сигнал выдаёт датчик при срабатывании. Если высокий уровень (1), то стягиваем к земле. Если низкий уровень (0), то подтягиваем к питанию. То есть как бы наоборот, по сравнению с сигналом датчика.

Gosha
Offline
Зарегистрирован: 06.02.2014

Ок, понятно. Датчик движения стандартный, в состоянии покоя - 0, при срабатывании - 1.

Gosha
Offline
Зарегистрирован: 06.02.2014

Отчитываюсь - сделал печатную плату, входы подтянул к земле резисторами 10К.

Все заработало! Причем на коде С++, что для меня, не программиста, особенно приятно.

Всем, помогающим мне - БОЛЬШОЕ спасибо.

Единственно, что пока напрягает - это потребление тока 3,5 мА. Правда, это вместе с КРЕН5.

Так что сейчас буду заниматься спящим режимом тиньки )

 

gena
Offline
Зарегистрирован: 04.11.2012

 Возможно поискать стабилизаторы с малым током потребления. А также рассмотреть вопрос перехода на питание 3,3 В (т.е. литий ион без стабилизатора). Какая частота у Тини?

Gosha
Offline
Зарегистрирован: 06.02.2014

.

Gosha
Offline
Зарегистрирован: 06.02.2014

gena пишет:

 Возможно поискать стабилизаторы с малым током потребления. А также рассмотреть вопрос перехода на питание 3,3 В (т.е. литий ион без стабилизатора). Какая частота у Тини?

Не подскажите, какие именно? Я только крен-ки знаю ) Частота - 1,2 мгц

Добавил спящий режим, который "PowerDown", с просыпанием каждые 4 секунды. Потребление стало 2,5 мА. Все равно многовато

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

С такой частотой можно питать напрямую от 3,7В Li-ion аккумуляторов, без понижающего стабилизатора. Только не помню, будут ли PIR-датчики от 3,7В работать.

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

Gosha пишет:

Не подскажите, какие именно? Я только крен-ки знаю ) 

Да куча импортных стабилизаторов от разных производителей есть (L7805, LD1085, AMS1117, LD1117, LM1117 и другие), даташиты на них надо смотреть

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Jeka_M пишет:

С такой частотой можно питать напрямую от 3,7В Li-ion аккумуляторов, без понижающего стабилизатора. Только не помню, будут ли PIR-датчики от 3,7В работать.

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

Jeka_M
Jeka_M аватар
Онлайн
Зарегистрирован: 06.07.2014

bodriy2014 пишет:

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

Да, точно, есть там стаб на 3,3. Можно тогда в обход стаба подключить. Микросхема BISS0001 на модуле должна нормально работать в диапазоне 3В - 5В, судя по даташиту.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Gosha ,   а что за сирена на выходе устройства ?
это про энергосбережение....
малопотребляющееустройство в случае тревоги будет включать реле для подачи питания ( не малого ) на сирену ?
зачем тогда малопотребляющееустройство ?

Gosha
Offline
Зарегистрирован: 06.02.2014

SU-27-16 пишет:

Gosha ,   а что за сирена на выходе устройства ?
это про энергосбережение....

Сирена китайская - воет и моргает красными вспышками. В режиме сработки потребляет 300 ма.

НО - надеюсь, ей не придется срабатывать, по-крайней мере, часто.

Поэтому основной потребитель акуммулятора на 7Ач будет как раз таки тинька и два датчика.

PIR датчики стандартные, HC-SR501. На плате нашел стабилизатор на 3,3 вольта ) - так что bodriy2014, Jeka_m Спасибо за идею. Обойдусь вообще без крен-ки )

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Gosha пишет:

Сирена китайская - воет и моргает красными вспышками. В режиме сработки потребляет 300 ма.

НО - надеюсь, ей не придется срабатывать, по-крайней мере, часто.

Поэтому основной потребитель акуммулятора на 7Ач будет как раз таки тинька и два датчика.

PIR датчики стандартные, HC-SR501. На плате нашел стабилизатор на 3,3 вольта ) - так что bodriy2014, Jeka_m Спасибо за идею. Обойдусь вообще без крен-ки )

Акум свинец 7Ач как в бесперебойниках?, если да то расслабьтесь и перестаните считать потребеление)))

У него ток саморазряда такой что потребеление даже Atmega328 не сыграет роли на длительном участке времени, не говоря уже о экономной тини13.

Знаю о чем говорю мерил!(

Gosha
Offline
Зарегистрирован: 06.02.2014

Ага, такой.

Хорошо, буду чаще контролировать напряжение на акуммуляторе.

Спасибо