Кодты іздеу

Сабақ 17/31: Arduino-да кідірісті үзу және жарыққа тәуелді резистор LDR | Robojax

Бұл сабақтың бөлігі: Arduino Course based on SunFounder's 3-in-1 Learning Kit

Сабақ 17/31: Arduino-да кідірісті үзу және жарыққа тәуелді резистор LDR | Robojax

Осы нұсқаулықта біз Arduino-ның екі маңызды тұжырымдамасын қарастырамыз: үзілістер (interrupts) және жарыққа тәуелді резисторлар (LDR). Сіз кодтағы кідірістерді қалай үзуге болатынын үйренесіз, осылайша Arduino батырманы басуға лезде жауап бере алады, содан кейін түнде күзет қоңырауын немесе шамды автоматты түрде қосатын жарық сезгіш тізбек құрастырамыз. Бұл жоба негізгі жыпылықтағыш LED эскиздерінен әрі қарай өтіп, нақты әлемдегі автоматтандыру жобаларын құруды бастағысы келетіндерге өте ыңғайлы. Сіз бұл дағдыларды дәлізіңізге ақылды түнгі шам жасау, есік ашылғанда дыбыс шығаратын қарапайым күзет дабылын құру, кешке қосылатын күн энергиясымен жұмыс істейтін бақша шамын жасау немесе күн батқанда жабылатын автоматты перде жасау үшін қолдана аласыз. Сабақ SunFounder 3-в-1 Arduino жинағына негізделген, бірақ тұжырымдамалар кез келген стандартты Arduino тақтасына қолданылады.

LDR_12708_orig
LDR Illustration and symbol

Аппараттық құралдар және компоненттер

Осы жобаны орындау үшін сізге келесі компоненттер қажет. Стандартты Arduino Uno немесе Nano осы құрылымға өте ыңғайлы.

  • Arduino Uno немесе Nano
  • Жарыққа тәуелді резистор (LDR), мысалы, Kweeds KM601
  • 10к Ом резистор
  • Батырма
  • Күзет қоңырауы (Buzzer)
  • Макет тақтасы және жалғау сымдары

Arduino үзілістерін түсіну

Стандартты Arduino эскизінде loop() функциясы үздіксіз жұмыс істейді, тапсырмаларды жолдар бойынша орындайды. delay() қолданғанда, Arduino сол уақыт аралығында басқа ештеңе жасамайды. Бұл басқа тапсырма орындалып жатқанда маңызды оқиғаға, мысалы, батырманы басуға жауап беру қажет болса, проблема тудырады. Мысалы, LED жыпылықтату үшін бір секундтық кідіріс болса, батырманы басу бір секундқа дейін тіркелмеуі мүмкін, бұл жауапсыздық сезімін тудырады (бейнеде 08:13).

Arduino үзілістері бұл мәселені шешеді. Үзіліс — бұл арнайы пиннің негізгі бағдарламаны "үзуге", қандай да бір әрекетті тоқтатып, Interrupt Service Routine (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-пинге қосылған, ол біздің үзіліс пиніміз. 10к Ом төмен тарту резисторы батырма басылмағанда пиннің LOW күйінде, ал басылғанда HIGH күйінде оқылуын қамтамасыз етеді. Күзет қоңырауы 8-пинге қосылған.

Үзіліс демонстрациясы үшін компоненттерді келесідей жалғаңыз:

  • Батырма: Бір аяғын 5V-қа, ал екінші аяғын цифрлық 2-пинге қосыңыз. 2-пиннен GND-ға 10к Ом резисторды қосыңыз.
  • Күзет қоңырауы: Теріс ұшын GND-ға, ал оң ұшын цифрлық 8-пинге қосыңыз.

Тізбек 2: Жарық сезу үшін LDR және күзет қоңырауы

LDR тізбегі үшін біз кернеу бөлгіш конфигурациясын қолданамыз. LDR-дің кедергісі жарыққа байланысты өзгереді, бұл аналогтық пиндегі кернеуді өзгертеді. Қараңғыда LDR-дің кедергісі жоғары (шамамен 10к Ом), ал жарықта кедергі айтарлықтай төмендейді (бейнеде 16:25). Біз өлшейтін нәрсе — осы кедергінің өзгеруі.

Кернеу бөлгіш қажет, себебі Arduino тек кернеуді оқи алады, кедергіні емес. LDR-ді тұрақты 10к Ом резистормен тізбектей орналастыру арқылы олардың арасындағы нүктедегі кернеу LDR-дің кедергісіне пропорционалды өзгереді. Бұл кернеу Arduino-ның аналогтық-цифрлық түрлендіргіші (ADC) арқылы оқылады.

LDR демонстрациясы үшін компоненттерді келесідей жалғаңыз:

  • LDR: Бір аяғын 5V-қа, ал екінші аяғын аналогтық A0 пиніне қосыңыз.
  • 10к Ом резистор: A0-ға баратын LDR аяғынан GND-ға қосыңыз. Бұл кернеу бөлгішті құрайды.
  • Күзет қоңырауы: Теріс ұшын GND-ға, ал оң ұшын цифрлық 8-пинге қосыңыз.

Ескерту: Нақты пин тағайындаулары кодта анықталған және сіздің құрылымыңызға сәйкес өзгертілуі мүмкін.

Кодты түсіндіру

Біз жобаның әрекетін басқаратын берілген кодтың пайдаланушы конфигурациялайтын бөліктеріне назар аударамыз. Толық бағдарламаны мақаланың астындағы жүктеу сілтемесінен алуға болады.

Код оңай өзгертілуге арналған. Эскиздің жоғарғы жағында реттей алатын негізгі айнымалыларды табасыз.

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

Мұнда buzzerPin 8-пинге орнатылған, дәл осы жерге дыбыстық сигнал құрылғысын (buzzer) қосасыз. interruptPin 2-пинге орнатылған, бұл түймені басуды тыңдайтын пин. state айнымалысы — дыбыстық сигнал құрылғысының ағымдағы күйін (HIGH немесе LOW) сақтайтын volatile байт. Ол volatile деп белгіленген, себебі ол үзіліс қызметінің процедурасында (ISR) өзгертіледі, және бұл кілтсөз Arduino-ның әрқашан ең соңғы мәнді оқуын қамтамасыз етеді. count айнымалысы — негізгі циклде өсетін қарапайым есептегіш, ол үзіліс белсенді болған кезде циклдің әлі де жұмыс істеп тұрғанын көрсету үшін қолданылады.

setup() функциясында дыбыстық сигнал құрылғысының пині OUTPUT ретінде, ал үзіліс пині INPUT ретінде орнатылады. Ең маңызды жол — attachInterrupt(), дәл осы жерде үзілісті конфигурациялайсыз. Бұл функция Arduino-ға қай пинді бақылау керектігін, үзіліс болған кезде қай функцияны шақыру керектігін және қандай триггер шартын қолдану керектігін айтады.

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

Бұл жол көрсетілген пинге үзіліс тіркейді. digitalPinToInterrupt() функциясы пин нөмірін дұрыс үзіліс нөміріне түрлендіреді. noisy — үзіліс іске қосылған кезде шақырылатын функцияның аты. Соңында, CHANGE — режим, ол пиннің кез келген күй өзгерісінде үзілісті іске қосады. Қажеттілікке қарай мұны RISING, FALLING немесе LOW деп өзгертуге болады.

noisy() функциясы — ISR. Бұл дыбыстық сигнал құрылғысының күйін ауыстыратын қарапайым toggle функциясы. Түйме басылғанда, үзіліс осы функцияны іске қосады, ол state айнымалысын инверсиялайды және оны дыбыстық сигнал құрылғысының пиніне жазады. Бұл негізгі цикл санаумен және кідірістермен айналысып жатқанда да, әр түйме басқан сайын дыбыстық сигнал құрылғысын қосуға және өшіруге мүмкіндік береді.

Жобаның әрекетін күндіз емес, түнде дыбыстық сигнал құрылғысын белсендіруге өзгерту үшін негізгі циклдегі шартты логиканы өзгертіп, HIGH және LOW күйлері үшін digitalWrite() командаларын ауыстырасыз.

Тірі Жоба және Демонстрация

Демонстрацияда сіз екі негізгі экспериментті көресіз. Біріншіден, үзіліс коды жоқ кезде үзіліс тізбегі жұмыс істеп тұрғаны көрсетіледі, мұнда циклдегі кідіріс түйме жауабын баяулатады. Бұл үзілістер шешетін мәселені ерекше көрсетеді.

Содан кейін, үзіліс коды жүктелген кезде, сериялық монитор есептегіштің әр секунд сайын өсетінін көрсетеді. Түйме басылғанда, дыбыстық сигнал құрылғысы негізгі циклдегі кідіріске қарамастан, лезде қосылады немесе өшеді. Бұл үзілістің күту уақытын сәтті айналып өтіп, өз тапсырмасын дереу орындайтынын дәлелдейді (бейнеде 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)