Ви не увійшли.
Треба внести правку в код, в частину (було):
if (OCR1B == 65) {
TIMSK2 = 0;
DDRD &= ~_BV(3);
}
потрібно зробити:
if (OCR1B == 65) {
DDRD &= ~_BV(3);
TIMSK1 = 0x20;
TIMSK2 = 0x00;
}
Без правки, приблизно раз на 17 годин, протягом ~1 хв функціонал "побачив перешкоду - подав напругу на пін 5" не буде працювати. Лістинг програми з урахуванням правки приводжу нижче:
/* Connections (UNO):
* HC-SR501 sensor output --------> to pin 8
* Voltage output (active_HIGH) --> to pin 5
* White_LED cathode -------------> to pin 4
* Yellow_LED cathode ------------> to pin 3
*/
void setup() {
MCUCR |= _BV(PUD); // Disable all pull-ups
DDRD |= _BV(4) | _BV(5); // White LED | Output signal
initTIM1();
initTIM2();
sei();
}
void loop() {}
void initTIM1(void) { // Time interval
TCCR1A = 0x00;
TCCR1B = 0xCD;
TIMSK1 = 0x22;
OCR1A = 15625; // 1 sec at 16MHz
TCNT1 = OCR1B = 0;
}
void initTIM2(void) { // Flash LED
TCCR2A = 0x03;
TCCR2B = 0x04;
TIMSK2 = 0x00;
}
ISR(TIMER1_COMPA_vect) {
if (++OCR1B == 5) {
DDRD &= ~_BV(4);
DDRD |= _BV(3);
TIMSK2 = 0x06;
}
if (OCR1B == 65) {
DDRD &= ~_BV(3);
TIMSK1 = 0x20;
TIMSK2 = 0x00;
}
}
ISR(TIMER1_CAPT_vect) {
(OCR1B > 64) ? (PORTD |= _BV(5)) : (OCR1B = 0);
TIMSK2 = 0x00;
PORTD &= ~_BV(3);
}
ISR(TIMER2_COMPA_vect) {
--OCR2B;
PORTD |= _BV(3);
}
ISR(TIMER2_COMPB_vect) {
PORTD &= ~_BV(3);
}
Підключення: "плюси" обох діодів через резистори 200 Ом до плюсу живлення (5 чи 3.3В); "-" білого до піна 4, "-" жовтого до піна 3; вихід сенсора до піна 8; ну а напругу у разі спрацьовування після 1хв знімайте з піна 5. Тестуйте.
/* Connections (UNO):
* HC-SR501 sensor output --------> to pin 8
* Voltage output (active_HIGH) --> to pin 5
* White_LED cathode -------------> to pin 4
* Yellow_LED cathode ------------> to pin 3
*/
void setup() {
MCUCR |= (1 << PUD); // Disable all pull-ups
DDRD |= _BV(4) | _BV(5); // White LED | Output signal
initTIM1(); //
initTIM2(); // LED flashes
sei();
}
void loop() {}
void initTIM1(void) { // Time interval
TCCR1A = 0x00;
TCCR1B = 0xCD;
TIMSK1 = 0x22;
OCR1A = 15625; // 1 sec at 16MHz
TCNT1 = OCR1B = 0;
}
void initTIM2(void) { // Flash LED
TCCR2A = 0x03;
TCCR2B = 0x04;
TIMSK2 = 0;
}
ISR(TIMER1_COMPA_vect) {
if (++OCR1B == 5) {
DDRD &= ~_BV(4);
DDRD |= _BV(3);
TIMSK2 = 0x06;
}
if (OCR1B == 65) {
TIMSK2 = 0;
DDRD &= ~_BV(3);
}
}
ISR(TIMER1_CAPT_vect) {
(OCR1B > 64) ? (PORTD |= _BV(5)) : (OCR1B = 0);
TIMSK2 = 0;
PORTD &= ~_BV(3);
}
ISR(TIMER2_COMPA_vect) {
--OCR2B;
PORTD |= _BV(3);
}
ISR(TIMER2_COMPB_vect) {
PORTD &= ~_BV(3);
}
Минулорічний скетч не працює
Все там працює в точності з побажанням: 5 сек один світлодіод, потім 10 хвилин інший і через 10 хвилин, при спрацюванні датчика - третій.
Savik пише:Потрібен Скетч для Arduino Uno з датчиком руху HC-SR501:
Функціональність:При включенні Arduino Uno:
Білий світлодіод горить 5 секунд.
Жовтий світлодіод не блимає.
Після 5 секунд:
Жовтий світлодіод починає блимати на 1 хвилину.
Якщо датчик руху HC-SR501 виявляє рух протягом 1 хвилини:
Жовтий світлодіод загоряється постійним світлом на 5 секунд.
Відлік часу блимання жовтого світлодіода скидається.
Якщо протягом 1 хвилини датчик руху не виявляє руху:
Жовтий світлодіод перестає блимати.
Якщо після 1 хвилини датчик руху виявляє рух:
На пін 8 подається напруга.А ви свої минулорічні теми принципово не читаєте? Вам краще створити десяток нових з одним і тим же питанням?
Минулорічний скетч не працює
Потрібен Скетч для Arduino Uno з датчиком руху HC-SR501:
Функціональність:При включенні Arduino Uno:
Білий світлодіод горить 5 секунд.
Жовтий світлодіод не блимає.
Після 5 секунд:
Жовтий світлодіод починає блимати на 1 хвилину.
Якщо датчик руху HC-SR501 виявляє рух протягом 1 хвилини:
Жовтий світлодіод загоряється постійним світлом на 5 секунд.
Відлік часу блимання жовтого світлодіода скидається.
Якщо протягом 1 хвилини датчик руху не виявляє руху:
Жовтий світлодіод перестає блимати.
Якщо після 1 хвилини датчик руху виявляє рух:
На пін 8 подається напруга.
А ви свої минулорічні теми принципово не читаєте? Вам краще створити десяток нових з одним і тим же питанням?
В документації на датчик HC-SR501 вказано, що він калібрується 1 хвилину починаючи від моменту увімкнення (можливі непередбачувані спрацьовування) - запропонуйте, що робити впродовж першої хвилини. "Якщо протягом 1 хвилини датчик руху не виявляє руху: Жовтий світлодіод перестає блимати." - і світиться чи погашений? Не зрозуміла циклічність, за яких умов білий світлодіод знову вмикається? Чи циклічність не потрібна? Пін 8 у ролі виходу принципово? Його зручно використати як вхід для датчика HC-SR501.
Жовтий світодіод після 1 хвилин якщо не було руху, більше не працює він потрібен для відліку часу.
Пін 8 не принципово.
В документації на датчик HC-SR501 вказано, що він калібрується 1 хвилину починаючи від моменту увімкнення (можливі непередбачувані спрацьовування) - запропонуйте, що робити впродовж першої хвилини. "Якщо протягом 1 хвилини датчик руху не виявляє руху: Жовтий світлодіод перестає блимати." - і світиться чи погашений? Не зрозуміла циклічність, за яких умов білий світлодіод знову вмикається? Чи циклічність не потрібна? Пін 8 у ролі виходу принципово? Його зручно використати як вхід для датчика HC-SR501.
Валіза з мільйоном доларів.
Старі купюри по 50 та 20, без п'ятірок.
Скетч для Arduino Uno з датчиком руху HC-SR501:
І де скетч?
Потрібен Скетч для Arduino Uno з датчиком руху HC-SR501:
Функціональність:
При включенні Arduino Uno:
Білий світлодіод горить 5 секунд.
Жовтий світлодіод не блимає.
Після 5 секунд:
Жовтий світлодіод починає блимати на 1 хвилину.
Якщо датчик руху HC-SR501 виявляє рух протягом 1 хвилини:
Жовтий світлодіод загоряється постійним світлом на 5 секунд.
Відлік часу блимання жовтого світлодіода скидається.
Якщо протягом 1 хвилини датчик руху не виявляє руху:
Жовтий світлодіод перестає блимати.
Якщо після 1 хвилини датчик руху виявляє рух:
На пін 8 подається напруга.