20.04.2026

“Vaqt relesi” o’quv loyihasi [14+]

“Blink” sketchni takomillashtirib, unig asosida tashqi yuklamani (masalan, chiroqni, rozetkani) ishga tushirib, bir necha sekund, daqiqa yoki soatdan keyin uni yana o’chiradigan qurilma – vaqt relesini yaratish mumkin. Buning uchun “pauza” o’zgaruvchisining (“delay()” funksiyasining argumenti) qiymatini kattaroq qiymatdagi sonlar bilan almashtirish zarur.

Biroq bunda, agar o’zgaruvchining qiymati 32767 dan oshib ketsa, dastur noto’g’ri ishlashni boshlaydi. Chunki, “Blink” sketchi bo’yicha misollarda foydalanilgan “pauza” o’zgaruvchisining qiymat turini int sifatida belgilaganmiz, demak uning qiymat qabul qilish sohasi -32767 … 32767 oralig’ida bo’lishi mumkin xolos. Bu esa, atigi 32.767 sekundni tashki qiladi. Qiymat turi unsigned int bo’lganda ham, uning maksimal qiymati 65535 (65.535 sekund) dan ortmaydi. Demak, vaqt relesi uchun “delay()” funksiyasi argumenti uchun int, unsigned int kabi qiymat turlari to’g’ri kelmaydi.

Shuning uchun, o’zgaruvchining qiymat turi sifatida long (yoki unsigned long) ni tanlash maqsadga muvofiq bo’ladi. long qiymat turining o’zgarish sohasi -2 147 483 648 … 2 147 483 647, vaqt birligi sifatida ifodalanganda (yaxlitlangan holda) ko’pi bilan: 2 147 483 647 millisekund = 2 147 483 sekund = 35 791 daqiqa = 596 soat = 24 kungacha ko’rsatilishi mumkin. unsigned long ni qiymat turiniki esa, 4 294 967 295 millisekund = 4 294 967 sekund = 71 582 daqiqa = 1 193 soat = 49 kungacha ko’rsatilishi mumkin. Biroq, vaqt relesi ko’proq 1 sutkagacha bo’lgan vaqt uchun ishlatilishini hisobga olib, biz ham o’zgaruvchining qiymatini 1 sutka bilan cheklaymiz (1 sutka = 24 soat = 1 440 daqiqa = 86 400 sekund = 86 400 000 millisekund).

Bundan tashqari, vaqt birligini qulayroq ifodalash uchun, uni soat, minut va sekundlarda ifodalaymiz. Shunga mos “h”, “m”, “s” o’zgaruvchilarini ham e’lon qilib olamiz. Ularning qiymati 32767 dan oshmasligini hisobga olib, barchasining qiymat turini int sifatida tanlashimiz mumkin.

“delay()” funksiyasi argumenti faqat millisekundlarda ko’rsatilishini hisobga olib, uni unsigned long qiymat turidagi  pauza o’zgaruvchisi bilan belgilaymiz va soat, daqiqa va sekund birliklarida ko’rsatilgan o’zgaruvchilar qiymatlarini millisekundga o’tkazib olishimiz zarur.
1 sekund = 1000 millisekund;
1 daqiqa = 60 sekund = 60 * 1000 millisekund = 60 000 millisekund;
1 soat = 60 daqiqa = 60 * 60 000 millisekund = 3 600 000 millisekund;
1 sutka = 24 soat = 24 * 3 600 000 millisekund = 86 400 000 millisekund.
Demak, jami biz soat, daqiqa va sekundlarda belgilaydigan vaqt millisekundlarda quyidagiga bo’ladi:

pauza = h * 86 400 000 + m * 3 600 000 + s * 60 000;

Kerakli elektron komponentlar va ularning bog’lanish sxemasi “Blink” sketchining rele moduli uchun foydalanilgan jihozlar hamda bog’lanish sxemasi bilan bir xil bo’ladi. Yuklama faqat 1 marta ishga tushib, 1 marta o’chishini hisobga olsak, “loop()” funksiyasiga kod kiritish talab etilmaydi, ya’ni faqat “setup()” funksiyasiga kod kiritishimiz yetarli. Sketchimiz quyidagi ko’rinishga keladi:

Vaqt relesi (long, unsigned long)
int pin = 13; //pin raqami. ichki svetodiod raqami – 13 yoki LED_BUILTIN
long pauza = 0; //pauza dastlabki qiymati, millisekund
int h = 0; // rele vaqti, soat.
int m = 0; // rele vaqti, daqiqa
int s = 5; // rele vaqti, sekund

void setup() {
// “pin” o’zgaruvchi pinni OUTPUT (signal chiqarish) rejimiga o’tkazamiz:
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH); // svetodiodni yoqamiz;
pauza = h * (60 * 60 * 1000) + m * (60 * 1000) + s * 1000;
delay(pauza); // uzoq muddatli pauza o’rnatamiz
digitalWrite(pin, LOW); // svetodiodni o’chiramiz;
}

void loop() {
}

Sketchning ArduBlock dasturidagi ko’rinishi:

Agar rele vaqti 18 soatdan oshmasa (“pauza” o’zgaruvchisining qiymati 65535 sekunddan oshmasa), sketchni o’zgaruvchilarning qiymat turlari unsigned int bo’lgan holatga yoki rele vaqti 9 soatdan oshmasa, o’zgaruvchilarning qiymat turlari int bo’lgan holatga ham keltirish mumkin. Buning uchun pauza o’zgaruvchisini sekundlarda ifodalab, “delay()” funksiyasining argumentini esa, uning 1000 ga ko’paytirilgan holatiga keltiriladi:

Vaqt relesi (int, unsigned int)

int pin = 13; //pin raqami. ichki svetodiod raqami – 13 yoki LED_BUILTIN
unsigned int pauza = 0; //pauza dastlabki qiymati, sekund. 65535 sekunddan oshmaydi.
//int pauza = 0; //pauza dastlabki qiymati, sekund. 32767
int h = 0; // rele vaqti, soat
int m = 0; // rele vaqti, daqiqa
int s = 5; // rele vaqti, sekund

void setup() {
// “pin” o’zgaruvchi pinni OUTPUT (signal chiqarish) rejimiga o’tkazamiz:
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH); // svetodiodni yoqamiz;
pauza = h * (60 * 60) + m * 60 + s;
delay(pauza * 1000); // uzoq muddatli pauza o’rnatamiz
digitalWrite(pin, LOW); // svetodiodni o’chiramiz;
}

void loop() {
}

Sketchning ArduBlock dasturidagi ko’rinishi:

Mustahkamlash uchun mashqlar (o’quv kurslari davomida bajariladi):

1) Vaqt relesi sketchidan soat birligini chiqarib tashlab, faqat daqiqa va sekundlarda boshqarishga moslashtiring.
2) Vaqt relesi sketchidan soat va daqiqa birliklarini chiqarib tashlab, faqat sekundlarda boshqarishga moslashtiring.
3) Vaqt relesi sketchini pauza o’zgaruvchisining qiymati int, unsigned int va long bo’lgan holatlar uchun o’zgartirilsa, relening maksimal ishlash vaqti qanchaga teng bo’ladi? (soat, daqiqa, sekundlarda ifodalang)
4) Vaqt relesi sxemasiga rele modulini ham qo’shib, uni tashqi yuklamani yoqib-o’chirishga moslashtiring.
5) Barcha topshiriqlarni ‘Wemos D1 mini’ platasi uchun bajaring.
6) Yuqoridagi topshiriqlarni ArduBlock dasturida bajarishni mashq qiling.

Добавить комментарий