Пребарување код

Лекција 17/31: Како да прекинете доцнење во Arduino и Light Dependant Resistor LDR | Robojax

Лекција 17/31: Како да прекинете доцнење во Arduino и Light Dependant Resistor LDR | Robojax

Во овој водич, ќе истражиме два основни концепти на Arduino: прекини и светлосно-зависни отпорници (LDR). Ќе научите како да ги прекинете одложувањата во вашиот код, така што вашиот Arduino може да реагира веднаш на притискање на копчиња, а потоа ќе изградиме коло за детекција на светлина што може автоматски да вклучи зумер или светло ноќе. Овој проект е совршен за секој што сака да оди подалеку од основните скици со трепкање на LED и да започне да гради одговорни, реални автоматизирани проекти. Можете да ги примените овие вештини за да креирате паметно ноќно светло за вашиот ходник, едноставен безбедносен аларм што ќе се огласи кога вратата ќе се отвори, соларно градинарско светло што се активира при самрак, или автоматска завеса што се затвора кога сонцето ќе зајде. Лекцијата е базирана на SunFounder 3-во-1 Arduino комплетот, но концептите важат за било која стандардна Arduino плоча.

LDR_12708_orig
LDR Illustration and symbol

Хардвер и компоненти

За да го следите овој проект, ќе ви требаат следниве компоненти. Стандарден Arduino Uno или Nano е совршен за оваа изработка.

  • Arduino Uno или Nano
  • Светлосно-зависен отпорник (LDR), како што е Kweeds KM601
  • 10k Ом отпорник
  • Притисно копче
  • Зумер
  • Прототипна плоча и поврзувачки жици

Разбирање на Arduino прекини

Во стандардна Arduino скица, функцијата loop() работи континуирано, извршувајќи задачи ред по ред. Кога користите delay(), Arduino престанува да прави било што друго за тој период. Ова е проблем ако треба да реагирате на важен настан, како притискање на копче, додека друга задача работи. На пример, ако имате едносекундно одложување за трепкање на LED, притискањето на копче може да не биде регистрирано до една секунда, што делува неодговорно (во видеото на 08:13).

Arduino прекините го решаваат овој проблем. Прекин е хардверска функција што овозможува одреден пин да го „прекине“ главниот програм, да паузира што и да прави, и да изврши специјална функција наречена Рутина за сервисирање на прекин (ISR). Ова му овозможува на вашиот Arduino да реагира веднаш на настани со висок приоритет, без оглед на тоа што друго се случува. Важно е да се напомене дека не сите пинови поддржуваат прекини. На Arduino Uno и Nano, само пиновите 2 и 3 можат да се користат за оваа намена (во видеото на 02:37). Други плочи како Mega имаат повеќе опции, но за овој проект, ќе се држиме до пин 2.

Прекините можат да бидат активирани од различни промени на состојбата на пинот: LOW, CHANGE, RISING и FALLING. Режимот CHANGE го активира прекинот секогаш кога состојбата на пинот се менува од HIGH на LOW или од LOW на HIGH, што е совршено за прекинувач со притисно копче.

Водич за поврзување

buzzer_push_button_schematic
lcd1602_I2C_wiring_sunfounder

Ќе изградиме две кола во оваа лекција. Првото демонстрира прекини со копче и зумер, а второто користи LDR за детекција на нивоата на светлина. Да започнеме со колото за прекини.

Коло 1: Копче и зумер за демонстрација на прекин

Ова коло е едноставно. Копчето е поврзано на пин 2, што е нашиот пин за прекин. Отпорник од 10k Ом за повлекување надолу осигурува дека пинот чита LOW кога копчето не е притиснато, и HIGH кога е притиснато. Зумерот е поврзан на пин 8.

За демонстрацијата на прекин, поврзете ги компонентите на следниов начин:

  • Притисно копче: Поврзете една нога на 5V и другата нога на дигитален пин 2. Поврзете отпорник од 10k Ом од пин 2 до GND.
  • Зумер: Поврзете го негативниот вод на GND и позитивниот вод на дигитален пин 8.

Коло 2: LDR и зумер за детекција на светлина

За колото со LDR, користиме конфигурација на делител на напон. Отпорноста на LDR се менува со светлината, што ја менува напонската вредност на аналогниот пин. Кога е темно, LDR има висока отпорност (околу 10k Ом), а кога е светло, отпорноста значително опаѓа (во видеото на 16:25). Оваа промена во отпорноста е она што го мериме.

Делител на напон е неопходен бидејќи Arduino може да чита само напон, не отпорност. Со поставување на LDR во серија со фиксен отпорник од 10k Ом, напонот на точката помеѓу нив се менува пропорционално на отпорноста на LDR. Овој напон потоа се чита од аналогно-дигиталниот конвертор (ADC) на Arduino.

За демонстрацијата со LDR, поврзете ги компонентите на следниов начин:

  • LDR: Поврзете една нога на 5V и другата нога на аналоген пин A0.
  • Отпорник од 10k Ом: Поврзете од ногата на LDR што оди до A0 надолу до GND. Ова го создава делителот на напон.
  • Зумер: Поврзете го негативниот вод на GND и позитивниот вод на дигитален пин 8.

Забелешка: Точните доделувања на пиновите се дефинирани во кодот и можат да се променат за да одговараат на вашата поставеност.

Објаснување на кодот

Ќе се фокусираме на деловите од дадениот код што може да ги конфигурира корисникот и што го контролираат однесувањето на проектот. Целосната програма е достапна за преземање подолу во статијата.

Кодот е дизајниран да биде лесно изменлив. На врвот на скицата, ќе ги најдете клучните променливи што можете да ги прилагодите.

const byte buzzerPin = 8;
const byte interruptPin = 2;
volatile byte state = LOW;
int count=0;

Овде, buzzerPin е поставен на пин 8, каде што го поврзувате зујачот. interruptPin е поставен на пин 2, кој е пинот што ќе слуша за притискање на копчето. Променливата state е volatile бајт што ја држи моменталната состојба на зујачот (HIGH или LOW). Таа е означена како volatile затоа што се менува внатре во рутината за прекини (ISR), и овој клучен збор осигурува дека Arduino секогаш ја чита најновата вредност. Променливата count е едноставен бројач што се зголемува во главната јамка за да покаже дека јамката сè уште работи додека прекинот е активен.

Во функцијата setup(), пинот за зујачот е поставен како OUTPUT, а пинот за прекини е поставен како INPUT. Критичната линија е attachInterrupt(), каде што го конфигурирате прекинот. Оваа функција му кажува на Arduino кој пин да го следи, која функција да ја повика кога ќе се случи прекинот, и кој услов за активирање да користи.

attachInterrupt(digitalPinToInterrupt(interruptPin), noisy, CHANGE);

Оваа линија прикачува прекин на одредениот пин. Функцијата digitalPinToInterrupt() го конвертира бројот на пинот во точниот број на прекинот. noisy е името на функцијата што ќе се повика кога ќе се активира прекинот. Конечно, CHANGE е режимот, кој го активира прекинот при секоја промена на состојбата на пинот. Можете да го промените ова во RISING, FALLING или LOW во зависност од вашите потреби.

Функцијата noisy() е ISR. Таа е едноставна функција за префрлување што ја менува состојбата на зујачот. Кога копчето е притиснато, прекинот ја активира оваа функција, која ја инвертира променливата state и ја запишува на пинот за зујачот. Ова ви овозможува да го вклучувате и исклучувате зујачот со секое притискање на копчето, дури и додека главната јамка е зафатена со броење и одложување.

За да го промените однесувањето на проектот за да го активирате зујачот ноќе наместо преку ден, би ја модифицирале условната логика во главната јамка, заменувајќи ги командите digitalWrite() за HIGH и LOW состојбите.

Жив проект и демонстрација

Во демонстрацијата, ќе видите два клучни експерименти. Прво, колото за прекини е прикажано како работи без кодот за прекини, каде што одложувањето во јамката го прави одговорот на копчето бавен. Ова го истакнува проблемот што прекините го решаваат.

Потоа, со вчитан кодот за прекини, серискиот монитор покажува дека бројачот се зголемува секоја секунда. Кога копчето е притиснато, зујачот се вклучува или исклучува веднаш, без оглед на одложувањето во главната јамка. Ова докажува дека прекинот успешно го заобиколува времето на чекање и ја извршува својата задача веднаш (во видеото на 14:07).

За делот со LDR, серискиот монитор ја печати суровата аналогна вредност. Можете да видите дека вредноста е висока (околу 960) при силна светлина и значително опаѓа (на околу 400 или помалку) кога сензорот е покриен. Ова покажува како отпорноста на LDR се менува со интензитетот на светлината. Кодот потоа користи праг за да одреди дали е „ден“ или „ноќ“ и соодветно го контролира зујачот. Со покривање на сензорот за да симулирате ноќ, можете да го активирате зујачот, а со изложување на светлина, можете да го исклучите.

Поглавја

  • [00:00] Вовед во Arduino прекини и LDR
  • [01:43] Проблемот со одложувањата во Arduino код
  • [03:37] Разбирање на пиновите за прекини и режимите
  • [04:20] Поврзување на колото со копче и зујач
  • [06:22] Објаснување на кодот за демонстрација на одложување
  • [07:48] Демонстрација на проблемот со одложување
  • [09:26] Имплементација и кодирање на прекинот
  • [11:50] Како функционира функцијата за прекин
  • [14:26] Вовед во светлосно зависни отпорници (LDR)
  • [15:44] Мерење на отпорноста на LDR со мултиметар
  • [17:22] Поврзување на колото со LDR и зујач
  • [19:55] Код за читање на LDR вредности
  • [20:49] Демонстрација на промените на LDR вредностите
  • [22:08] Поставување на прагови за ден и ноќ
  • [23:40] Код за контрола на зујач со LDR
  • [25:21] Демонстрација на автоматско ноќно светло

Слики

An LDR
An LDR
LDR Illustration and symbol
LDR Illustration and symbol
lcd1602_I2C_wiring_sunfounder
lcd1602_I2C_wiring_sunfounder
buzzer_push_button_schematic
buzzer_push_button_schematic
buzzer_push_button_wiring
buzzer_push_button_wiring
ldr
ldr
LDR_12708_orig
LDR_12708_orig
913-Lesson 17/31: interrupt a delay in Arduino and Light Dependent Resistor LDR
Јазик: C++
/*
Lesson 20/31: interrupt a delay in Arduino and Light Dependent Resistor LDR
Get this code and watch video Download and resource page https://robojax.com/RJT600
YouTube video https://www.youtube.com/watch?v=N_L11m1v_yk
 
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
const byte buzzerPin = 8;
const byte interruptPin = 2;
volatile byte state = LOW;
int count=0;

void setup() {
  pinMode(buzzerPin, OUTPUT);
  pinMode(interruptPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin), noisy, CHANGE);
  Serial.begin(9600);
  digitalWrite(buzzerPin, state);
}

void loop() {
  count++;
  Serial.println(count);
  delay(1000);
}

void noisy() {
  state = !state;
  digitalWrite(buzzerPin, state);
}

Ресурси и референци

Датотеки📁

Arduino библиотеки (zip)