Mundarija:

IOT123 - Quyosh kuzatuvchisi - nazoratchi: 8 qadam
IOT123 - Quyosh kuzatuvchisi - nazoratchi: 8 qadam

Video: IOT123 - Quyosh kuzatuvchisi - nazoratchi: 8 qadam

Video: IOT123 - Quyosh kuzatuvchisi - nazoratchi: 8 qadam
Video: ТИНЕЙДЖЕРЫ И ПЕРВОКЛАШКИ || Смешные жизненные моменты от 123 GO! GOLD 2024, Iyul
Anonim
Image
Image
IOT123 - Quyosh kuzatuvchisi - nazoratchi
IOT123 - Quyosh kuzatuvchisi - nazoratchi
IOT123 - Quyosh kuzatuvchisi - nazoratchi
IOT123 - Quyosh kuzatuvchisi - nazoratchi

Bu yo'riqnomaning kengaytmasi

IOT123 - SOLAR TRACKER - TILT/PAN, PANEL FRAME, LDR MOUNTS RIG. Bu erda biz servolarni boshqaruvchi va quyosh pozitsiyasi sensorlariga e'tibor qaratamiz. Shuni ta'kidlash kerakki, ushbu dizaynda 2 ta MCU ishlatiladi: quyosh kuzatuvchisi uchun bitta (3,3V 8MHz Arduino Pro Mini) va sensorlar/aktyorlar uchun bitta mustaqil MCU.

Bu 0.3 versiyasi

To'liq qoniqishdan so'ng, barcha loyihalarni nashr qilish o'rniga, men uzluksiz integratsiyani amalga oshiraman va tez -tez etkazib beraman, kerakli narsani o'zgartiraman. Men batareya zaryadlovchisi uchun yana bir ko'rsatma yozaman, _ boshqaruvchining dasturiy ta'minoti/uskunasini optimallashtirish tugagach. Men shuni aytib o'tmoqchimanki, optimallashtirish qaerda kerak.

Ushbu yondashuvning sabablaridan biri mijozlarning fikr -mulohazalari. Agar siz ehtiyoj sezsangiz yoki yaxshiroq yondashuvga ega bo'lsangiz, iltimos, izoh bering, lekin shuni yodda tutingki, men hamma narsani sizga etkaza olmayman va ehtimol sizga mos keladigan vaqtga. Bu tushuntirishlar unchalik ahamiyatli emasligi sababli ular ushbu maqoladan o'chiriladi.

Bunga nima kiradi:

  1. Quyoshning taxminiy joyini sezish uchun LDR -larni asl yo'riqnomadan foydalaning.
  2. Servolarni quyoshga qarating.
  3. Harakatlarning sezgirligi variantlari.
  4. Quyosh tomon harakatlanayotganda qadam o'lchami variantlari.
  5. Servolarda ishlatiladigan burchak cheklovlari uchun variantlar.
  6. Harakatlarning kechikishi variantlari.
  7. MCUlar orasidagi qiymatlarni o'rnatish/olish uchun I2C interfeysi.
  8. Harakatlar orasidagi chuqur uyqu.

Bunga nimalar kirmaydi (va vaqt ruxsat berilganidek ko'rib chiqiladi):

  1. Quvvat faqat kunduzi ishlatiladi.
  2. Tong pozitsiyasini eslab, qorong'i tushganda u erga borish.
  3. MCU -dan regulyatorni olib tashlash.
  4. MCU -dagi LEDlarni o'chirish.
  5. Quvvatni RAW o'rniga VCC orqali qayta yo'naltirish.
  6. USB -dan ketma -ket TTL konvertoriga regulyatsiya qilinmagan kuchsiz miltillash uchun vaqtinchalik echimlarni taqdim etish.
  7. Batareya zo'riqishida monitor.

TARIX

2017 yil 20 -dekabr V0.1 KODI

Dastlabki versiyada yorug'lik manbai kuzatiladi, har doim yoniq, zaryad yo'q

7 -yanvar, 2018 -yil V0.2 -KOD

  • QO'ShIMChA O'ZGARTIRISHLAR

    • I2C pinlarini qo'shing
    • Servo GND -larga kalit qo'shing
    • Tekshirish qutisi panjarasida bosilgan yorliq
  • Dasturiy ta'minotning o'zgarishi

    • EEPROM -dan konfiguratsiyani o'qing
    • I2C avtobusini boshqa MCUga qul sifatida qo'llab -quvvatlash (3.3V)
    • I2C orqali konfiguratsiyani o'rnating
    • I2C orqali Enabled ni o'rnating
    • I2C orqali konfiguratsiyani oling
    • Ish vaqti xususiyatlarini I2C (hozirda yoqilgan va joriy yorug'lik intensivligi) orqali oling.
    • Ketma -ket jurnalni olib tashlang (bu I2C qiymatlariga ta'sir qildi)

2018 yil 19 -yanvar V0.3 KODI

  • QURILMA

    Yorliq yangilandi. Kalit endi CONFIG yoki TRACK rejimini tanlash uchun ishlatiladi

  • Dasturiy ta'minot

    • I2C faqat konfiguratsiya uchun ishlatiladi
    • Nazoratchi kuzatishni boshlashdan oldin 5 soniya kutadi, qo'llarni harakatlantirishga imkon beradi
    • I2C konfiguratsiyasidan foydalanish uchun SPDT CONFIG -da birlik chizilmasin
    • Harakatni kuzatish oralig'ida, qurilma uyqu rejimida, uyqu daqiqalari konfiguratsiyasi uchun (standart 20 daqiqa).

1 -qadam: Materiallar va asboblar

Materiallar va asboblar
Materiallar va asboblar
Materiallar va asboblar
Materiallar va asboblar
Materiallar va asboblar
Materiallar va asboblar

Hozirda to'liq materiallar va manbalar ro'yxati mavjud.

  1. 3D bosma qismlar.
  2. Arduino Pro Mini 3.3V 8 MGts
  3. 4x6 sm o'lchamdagi ikki tomonlama prototipli tenglikni universal bosilgan elektron platasi (ikkiga bo'linadi)
  4. 1 ta 40P erkak sarlavhasi (o'lchamiga kesiladi).
  5. 1 ta 40P ayol sarlavhasi (o'lchamiga kesiladi).
  6. 4 ta 10K 1/4 Vt kuchlanishli rezistorlar.
  7. Ulanish simlari.
  8. Lehim va temir.
  9. 20 ta 4G x 6 mm zanglamaydigan pan boshining o'z -o'zidan tejamkor vintlari.
  10. 4 ta 4G x 6 mm zanglamaydigan dastgohli o'z -o'zidan tejamkor vintlardek.
  11. 1 off 3.7V LiPo batareyasi va ushlagichi (2P dupontli ulagichlarda tugaydi).
  12. 1 ta 2P erkak o'ng burchakli sarlavha
  13. 1 o'chirilgan SPDT kaliti 3 pinli 2,54 mm
  14. Kuchli siyanoakrilat elim
  15. Dupont ulagichlari ayol 1P sarlavhasi (1 ko'k, 1 yashil yashil).

2 -qadam: O'chirish sxemasini yig'ish

Devrenni yig'ish
Devrenni yig'ish
Devrenni yig'ish
Devrenni yig'ish
Devrenni yig'ish
Devrenni yig'ish

Hozirgi davrda kuchlanishni taqsimlash davri (voltmetr) yo'q.

  1. 4x6 sm uzunlikdagi ikki tomonlama prototipli tenglikni universal bosilgan elektron platasini uzun o'qi bo'ylab yarmiga bo'ling.
  2. 40P erkak sarlavhasini bo'laklarga bo'ling:

    1. 2 ta 12P
    2. 3 ta 3P
    3. 6 ta 2P.
  3. 40P ayol sarlavhasini bo'laklarga bo'ling:

    1. 2 ta 12P
    2. 1 ta 6P
  4. Lehim 2 o'chirilgan 12 Ayol sarlavhasi ko'rsatilgandek.
  5. 3P erkak (qo'shimcha) sarlavhadan ajratilgan ajratgichni SPDT kalitining pastki qismiga siyanakrilat elim bilan yopishtiring.
  6. Boshqa tomondan, 6 -sonli 2P, 2 -off 3Pmale sarlavhasi va ko'rsatilganidek SPDT kalitini lehimlang.
  7. Lehim 4 ta 10K rezistorli (A, B, C, D qora) GND pinli sarlavhasi (#2 qora) va A0 - A3 sarlavhasi pinlariga (#5, #6, #7, #8), keyin teshik orqali (sariq) ko'rsatilgandek (3 ta rasm + 1 diagramma).
  8. LDR PINS lehimlash PIN -kodlari №3, №6, #8, #10 -dan 3.3V izini o'tkazing va VCC pinining boshiga (yashil) teshikka o'ting.
  9. 3.3V -ni ayol boshi tomonida ko'rsatilganidek (qizil) 1, 12, 15 -sonli PIN -kodlarga lehimlang.
  10. Teshik orqali, yon tomondan (qizil) RAW sarlavhasi PIN #1.
  11. Ko'rsatilganidek, boshqa tomondan ayol pinni lehimlash uchun 11 -sonli PIN -koddan to'q sariq rangli ulanishni kuzatib boring.
  12. #20 dan #30 gacha va #31 dan #13 va #16 gacha bo'lgan ko'k simli simlarni izlang va lehimlang.
  13. Lehimlovchi ayol sarlavha PIN -kodi 11 -raqamli erkak sarlavhasi teshigidan.
  14. 30 mm uzunlikdagi 2 dyuymli ulagichni 1P sarlavhali ayol bilan tayyorlang (1 ko'k, 1 yashil yashil). Strip va boshqa uchini qalay.
  15. Lehimlangan ko'k Dupont simli #28; lehim yashil Dupont sim #29.
  16. Arduino -ning yuqori qismida 6P ayol boshini, so'ngra lehimni mahkamlang.
  17. Arduino -ning yuqori tomonida int #29 va 30 -sonli 2P to'g'ri burchakli ayol sarlavhasini mahkamlang.
  18. Arduino -ning pastki qismiga 12P -dan 2 -ni va 3 -sonli 3 -pinli erkak pinni mahkamlang, so'ngra lehimlang.
  19. Arduino erkak 12P pinlarini PCB 12P ayol sarlavhalariga joylashtiring.

3 -qadam: MCU yonib -o'chib turadi

MCU miltillaydi
MCU miltillaydi
MCU miltillaydi
MCU miltillaydi
MCU miltillaydi
MCU miltillaydi

Arduino Pro Mini 6P ayol sarlavhasi yordamida FTDI232 USB -TTL konvertori yordamida qulay tarzda yonadi. 2 ta taxtaning hizalanishi uchun yuqoridagi rasmga qarang.

3.3V sozlamalari FTDI232 qurilmangizda tanlanganligiga ishonch hosil qiling. Quyidagi kod yordamida ko'rsatmalarga amal qiling (GIST havolasini ishlating).

Kam quvvatli kutubxonani (biriktirilgan va https://github.com/rocketscream/Low-Power) o'rnatish kerak.

Arduino Pro Mini + PCB korpusga o'rnatilgandan so'ng, u hali ham yonib turishi mumkin, chunki bosh pimlari ochiq. Sarlavhani ochadigan panel ramkasidan nazorat birligini ajratib oling.

I2C/EEPROM konfiguratsiyali va harakatlar orasidagi uyqu tsikliga ega quyosh naychasini kuzatuvchi. Kutish tsikli davomiyligi aniqligi vaqt oshishi bilan kamayadi, lekin buning uchun etarli

/*
* koddan o'zgartirilgan
* Matias Leroy tomonidan
*
* V0.2 O'zgartirishlar
** I2C SETINI OLING
** EEPROM SETINI OLING
** Seriyali chiqishni olib tashlang - ta'sirlangan I2C
** Kuzatuvni yoqish/o'chirish
** I2C orqali xizmatlarni cheklang
** IGC VIA AVG INTENSITY o'qing
* V0.3 O'zgartirishlar
** 2 rejimni almashtiring - iz (NO2C) va konfiguratsiya (I2C ishlatadi)
** UZLASH TAKIM QO'LIDA (8 IKKINCHI CHUNKLARNING O'ZI HAQIQATI YO'Q).
** UYLANISH/UGTIRISHDAGI DETACH/ATTACH XIZMATLARI (TRANSISTOR tez -tez ishlatiladi)
** Konfiguratsiya qilinadigan boshlang'ich pozitsiyani olib tashlang (REDUNDANT)
** SIYORLANGAN SEKUNIYALARNI TASHKIL QILING (REDUNDANT)
** Konfiguratsiyani yoqish/o'chirishni olib tashlash (REDUNDANT)
** YANGILANGAN konfiguratsiyali trekkerni olib tashlang (DAVLAT KOMPUTERINI QO'LLANING)
** Zo'riqish o'lchagichini olib tashlang - Alohida I2C komponentlarini ishlatadi
** I2C ishlatilmaganda seriyali jurnalga qo'shish
*/
#qo'shing
#qo'shing
#qo'shing
#qo'shing
#qo'shing
#efEPROM_VERSION1
#belgilashI2C_MSG_IN_SIZE3
#PIN_LDR_TL A0 ni belgilang
#deinPIN_LDR_TR A1
#deinPIN_LDR_BR A3
#PIN_LDR_BL A2 ni aniqlang
#belgilashPIN_SERVO_V11
#belgilashPIN_SERVO_H5
#identifikator IDX_I2C_ADDR0
#identifikator IDX_V_ANGLE_MIN1
#identifikator IDX_V_ANGLE_MAX2
#identifikatsiya IDX_V_SENSITIVITY3
#identifikator IDX_V_STEP4
#identifikator IDX_H_ANGLE_MIN5
#identifikator IDX_H_ANGLE_MAX6
#IDID_H_SENSITIVITY7
#identifikator IDX_H_STEP8
#identifikatsiya IDX_SLEEP_MINUTES9
#identifikatsiya IDX_V_DAWN_ANGLE10
#identifikatsiya IDX_H_DAWN_ANGLE11
#defineIDX_DAWN_INTENSITY12 // barcha LDRS o'rtacha
#defineIDX_DUSK_INTENSITY13 // barcha LDRS o'rtacha
#identifikator IDX_END_EEPROM_SET14
#defineIDX_CURRENT_INTENSITY15 // barcha LDRS o'rtacha - IDX_DAWN_INTENSITY havosidagi to'g'ridan -to'g'ri bo'lmagan yorug'likni hisoblash uchun ishlatiladi
#identifikator IDX_END_VALUES_GET16
#identifikatsiya IDX_SIGN_117
#identifikatsiya IDX_SIGN_218
#identifikatsiya IDX_SIGN_319
Servo _servoH;
Servo _servoV;
bayt _i2cVals [20] = {10, 10, 170, 20, 5, 10, 170, 20, 5, 20, 40, 10, 30, 40, 0, 0, 0, 0, 0, 0};
int _servoLoopDelay = 10;
int _slowingDelay = 0;
int _angleH = 90;
int _angleV = 90;
int _averageTop = 0;
int _averageRight = 0;
int _averageBottom = 0;
int _averageLeft = 0;
bayt _i2cResponse = 0;
bool _inConfigMode = noto'g'ri;
voidsetup ()
{
Serial.begin (115200);
getFromEeprom ();
agar (inConfigMode ()) {
Serial.println ("Konfiguratsiya rejimi");
Serial.print ("I2C manzili:");
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onReceive (qabulEvent);
Wire.onRequest (requestEvent);
} boshqa {
Serial.println ("Kuzatuv rejimi");
kechikish (5000); // batareyani ulashda va hokazo.
}
}
voidloop ()
{
getLightValues ();
agar (! _inConfigMode) {
// ToDo: TRANSISTOR SWITCH -ni yoqing
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
uchun (int i = 0; i <20; i ++) {
agar (i! = 0) {
getLightValues ();
}
moveServos ();
}
kechikish (500);
_servoH.detach ();
_servoV.detach ();
// ToDo: TRANSISTOR SWITCH -ni o'chiring
kechikish (500);
uxlab qolganlar uchun ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// -------------------------------- Joriy rejim
boolinConfigMode () {
pinMod (PIN_SERVO_H, Kirish);
_inConfigMode = digitalRead (PIN_SERVO_H) == 1;
qaytarish _inConfigMode;
}
// --------------------------------- EEPROM
voidgetFromEeprom () {
agar (
EEPROM.read (IDX_SIGN_1)! = 'S' ||
EEPROM.read (IDX_SIGN_2)! = 'T' ||
EEPROM.read (IDX_SIGN_3)! = EEPROM_VERSION
) EEPROM_write_default_configuration ();
EEPROM_read_configuration ();
}
voidEEPROM_write_default_configuration () {
Serial.println ("EEPROM_write_default_configuration");
uchun (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
EEPROM.update (i, _i2cVals );
}
EEPROM.update (IDX_SIGN_1, 'S');
EEPROM.update (IDX_SIGN_2, 'T');
EEPROM.update (IDX_SIGN_3, EEPROM_VERSION);
}
voidEEPROM_read_configuration () {
Serial.println ("EEPROM_read_configuration");
uchun (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
_i2cVals = EEPROM.read (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// -------------------------------- I2C
voidreceiveEvent (int soni) {
agar (hisob == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
bayt indeksi = Wire.read ();
bayt qiymati = Wire.read ();
almashtirish (cmd) {
case'G ':
agar (indeks <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [indeks];
}
tanaffus;
ish ':
agar (indeks <IDX_END_EEPROM_SET) {
_i2cVals [indeks] = qiymat;
EEPROM.update (indeks, _i2cVals [indeks]);
}
tanaffus;
standart:
qaytish;
}
}
}
voidrequestEvent ()
{
Wire.write (_i2cResponse);
}
// --------------------------------- LDRlar
voidgetLightValues () {
int valueTopLeft = analogRead (PIN_LDR_TL);
int valueTopRight = analogRead (PIN_LDR_TR);
int valueBottomRight = analogRead (PIN_LDR_BR);
int valueBottomLeft = analogRead (PIN_LDR_BL);
_averageTop = (valueTopLeft + valueTopRight) / 2;
_averageRight = (valueTopRight + valueBottomRight) / 2;
_averageBottom = (valueBottomRight + valueBottomLeft) / 2;
_averageLeft = (valueBottomLeft + valueTopLeft) / 2;
int avgIntensity = (valueTopLeft + valueTopRight + valueBottomRight + valueBottomLeft) / 4;
_i2cVals [IDX_CURRENT_INTENSITY] = xarita (avgIntensity, 0, 1024, 0, 255);
}
// -------------------------------- XIZMAT
voidmoveServos () {
Serial.println ("moveServos");
agar ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// chapga
Serial.println ("moveServos chapga ketadi");
kechikish (_slowingDelay);
uchun (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.yozish (_angleH--);
kechikish (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH+_i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {
// to'g'ri ketmoqda
Serial.println ("moveServos chapga ketmoqda");
kechikish (_slowingDelay);
uchun (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
kechikish (_servoLoopDelay);
}
}
boshqa {
// hech narsa qilmadi
Serial.println ("moveServos hech narsa qilmaydi");
kechikish (_slowingDelay);
}
agar ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV+_i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// yuqoriga ko'tarilish
Serial.println ("moveServos yuqoriga ko'tariladi");
kechikish (_slowingDelay);
uchun (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
kechikish (_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {
// pastga tushish
Serial.println ("moveServos pastga ketadi");
kechikish (_slowingDelay);
uchun (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
kechikish (_servoLoopDelay);
}
}
boshqa {
Serial.println ("moveServos hech narsa qilmaydi");
kechikish (_slowingDelay);
}
}
// --------------------------------- UYDI
voidasleepFor (imzolanmagan sekiz sekundli segment) {
Serial.println ("uxlab yotganlar uchun");
uchun (unsignedint sleepCounter = sakkizSekundSegmentlar; sleepCounter> 0; sleepCounter--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

GitHub tomonidan ❤ bilan uyushtirilgan rawtilt_pan_tracker_0.3.ino ni ko'ring

4 -qadam: O'chirish korpusini yig'ish

O'chirish korpusini yig'ish
O'chirish korpusini yig'ish
O'chirish korpusini yig'ish
O'chirish korpusini yig'ish
O'chirish korpusini yig'ish
O'chirish korpusini yig'ish
  1. Ardiuno Pro Mini PCB sarlavhalariga o'rnatilganligiga ishonch hosil qiling.
  2. SOLAR TRACKER boshqaruv paneli qutisini SOLAR TRACKER boshqaruv paneli qutisining devorlariga joylashtiring va 2 ta 4G x 6 mm zanglamaydigan po'latdan yasalgan o'z -o'zidan tejamkor vintlar bilan mahkamlang.
  3. 6P sarlavhali Ardiuno Pro Mini + PCB -ni SOLAR TRACKER tekshirgich qutisi tagidagi bo'sh joyga joylashtiring.
  4. SOLAR TRACKER boshqaruv paneli qutisi qopqog'ini SOLAR TRACKER boshqaruv paneli qutilarining devorlariga joylashtiring va 4G x 6 mm zanglamaydigan po'latdan yasalgan o'z -o'zidan tejamkor vintlar bilan mahkamlang.
  5. 4G x 6 mm zanglamaydigan po'latdan yasalgan o'z -o'zidan tejamkor vintlardek 4 ta panel ramkasining tagiga yuqoridan yig'ing.

5 -qadam: Uskunani boshqaruvchiga ulash

Uskunani boshqaruvchiga ulash
Uskunani boshqaruvchiga ulash
Uskunani boshqaruvchiga ulash
Uskunani boshqaruvchiga ulash
Uskunani boshqaruvchiga ulash
Uskunani boshqaruvchiga ulash

Oldingi yo'riqnomadan tayyor bo'lgan tegishli ulanishlar - bu 4 ta 2P LDR ulanishi va servodan 2 ta 3P 3 ulanish. Zaryadlash tayyor bo'lgunga qadar vaqtinchalik narsa - bu batareya. Hozircha 2P DuPont aloqasi uzilgan 3.7V LiPo -dan foydalaning.

  1. LDR ulanishlarini (qutbsiz) yuqoridan joylashtiring:

    1. Yuqori o'ng
    2. Yuqori chap
    3. Pastki o'ng
    4. Pastki chap
  2. Servo ulanishlarni (signal simini chapga) yuqoridan joylashtiring:

    1. Gorizontal
    2. Vertikal
  3. TESTGA TAYYORGA KUTING: 3.7V DC quvvat simini +va tepaga, -ve pastga joylashtiring.

6 -qadam: Tekshirgichni sinovdan o'tkazish

Image
Image

Yuqorida aytib o'tilganidek, dasturiy ta'minot Quyosh zaryadlash uchun optimallashtirilmagan. Tabiiy (quyosh) va tabiiy bo'lmagan yorug'lik manbalari yordamida uni sinovdan o'tkazish va sozlash mumkin.

Nazorat qilinadigan muhitda kuzatishni sinab ko'rish uchun SLEEP MINUTES ni pastroq qiymatga qo'yish qulay bo'lishi mumkin (keyingi bosqichga qarang).

7 -qadam: I2C orqali konsoli kiritish yordamida sozlash

Bu tekshirgichni ikkinchi MCU orqali sozlash, konsoli oynasiga sozlamalarni kiritish bilan izohlanadi.

  1. Quyidagi skriptni D1M WIFI BLOCK (yoki Wemos D1 Mini) ga yuklang.
  2. USB -ni kompyuterdan uzing
  3. PIN-kod ulanishlari: -ve (Controller) => GND (D1M)+ve (Controller) => 3V3 (D1M) SCL (Controller) => D1 (D1M)

    SDA (nazoratchi) => D2 (D1M)

  4. SPDT tugmachasini CONFIG ga aylantiring
  5. USB -ni kompyuterga ulang
  6. Arduino IDE -dan to'g'ri COM porti bo'lgan konsol oynasini ishga tushiring
  7. "Yangi qator" va "9600 bod" tanlanganligiga ishonch hosil qiling
  8. Buyruqlar matn yuborish qutisiga kiritiladi, so'ngra Enter tugmasi bosiladi
  9. Buyruqlar Belgilar bayt formatida
  10. Agar ikkinchi bayt (uchinchi segment) kiritilmagan bo'lsa, skript tomonidan 0 (nol) yuboriladi
  11. Ketma -ket kirishdan ehtiyot bo'ling; "Enter" tugmachasini bosishdan oldin nima yozganingizni ko'rib chiqing. Agar siz qulflangan bo'lsangiz (masalan, I2C manzilini unutgan qiymatga o'zgartirish), siz yana boshqaruvchi dasturini o'chirib qo'yishingiz kerak bo'ladi.

Buyruqning birinchi belgisining qo'llab -quvvatlanadigan o'zgarishlari:

  • E (servo kuzatishni yoqish) konfiguratsiya paytida harakatni to'xtatish uchun foydali. Bu quyidagicha ishlatiladi: E 0
  • D (Servo kuzatishni o'chirib qo'yish), agar qurilmani qayta yuklamasa, avtomatik kuzatishni boshlash uchun foydalidir. Bu kiritish usuli: D 0
  • G (Konfiguratsiya qiymatini olish) EEPROM va IN -MEMORY qiymatlarini o'qiydi: Bu quyidagicha kiritiladi: G (indeks 0 - 13 va 15 bayt qiymatlari)
  • S (EEPROM qiymatini o'rnatish) qayta yuklashdan keyin mavjud bo'lgan qiymatlarni EEPROM ga o'rnatadi. Bu quyidagicha ishlatiladi: S (indeks 0 - 13 bayt qiymatlari, qiymat - bayt qiymatlari va har bir xususiyat uchun farq qiladi)

Kod indekslar uchun haqiqat nuqtasidir, lekin to'g'ri qiymatlar/sharhlar uchun qo'llanma uchun quyidagilar ishlatiladi:

  • I2C ADDRESS 0 - boshqaruvchining qulli manzili, nazoratchi bilan aloqa qilish uchun masterga kerak (standart 10)
  • MINIMUM VERTIK ANGLE 1 - burchakli vertikal servo pastki chegarasi (standart 10, diapazon 0 - 180)
  • Maksimal vertikal burchak 2 - burchakli vertikal servo yuqori chegarasi (standart 170, diapazon 0 - 180)
  • SENSITIVITY VERTICAL LDR 3 - vertikal LDR o'qish chegarasi (standart 20, diapazon 0 - 1024)
  • Vertikal burchak burchagi 4 - har bir sozlashda burchakli vertikal servo qadamlar (standart 5, diapazon 1 - 20)
  • Minimal gorizontal burchak 5 - burchak gorizontal servo pastki chegarasi (standart 10, diapazon 0 - 180)
  • Maksimal gorizontal burchak 6 - burchak gorizontal servo yuqori chegarasi (standart 170, diapazon 0 - 180)
  • SENSITIVITY HORIZONTAL LDR 7 - Gorizontal LDR o'qish chegarasi (standart 20, diapazon 0 - 1024)
  • HORIZONTAL ANGLE STEP 8 - har bir sozlashda burchakli gorizontal servo qadamlar (standart 5, diapazon 1 - 20)
  • SLEEP MINUTES 9 - kuzatuvlar orasidagi taxminiy uyqu davri (standart 20, diapazon 1 - 255)
  • VERTIK TUG'O'R 10 -QISM - KELAJA QILISH - quyosh botganda qaytish uchun vertikal burchak.
  • GORIZONTAL TUG'O'R 11 -KELAJA QO'LLANISH - quyosh botganda qaytib keladigan gorizontal burchak.
  • DAWN INTENSITY 12 - BOSHQA QO'LLANISH - har kuni quyoshni kuzatishni boshlaydigan barcha LDRlarning o'rtacha o'rtacha qiymati.
  • DUSK INTENSITY 13 - Kelajakda foydalanish - har kuni quyoshni kuzatishni tugatadigan barcha LDRlarning o'rtacha o'rtacha qiymati.
  • EEPROM QIMMATLARINING MARKER 14 -UCHI - QIMMATI ISHLATILMAYDI
  • Joriy intensivlik 15 - yorug'lik intensivligining joriy o'rtacha foizi
  • Xotiradagi qadriyatlarning oxiri 16 - qiymat ishlatilmayapti.

Ketma -ket kirishni (konsol oynasidagi klaviatura kiritish) yozib oladi va char, bayt, bayt formatidagi I2C quliga uzatadi

#qo'shing
#defineI2C_MSG_IN_SIZE2
#belgilashI2C_MSG_OUT_SIZE3
#belgilashI2C_SLAVE_ADDRESS10
mantiqiy _newData = noto'g'ri;
const bayt _numChars = 32;
char _receivedChars [_numChars]; // olingan ma'lumotlarni saqlash uchun massiv
voidsetup () {
Serial.begin (9600);
Wire.begin (D2, D1);
kechikish (5000);
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
statik bayt ndx = 0;
char endMarker = '\ n';
char rc;
while (Serial.available ()> 0 && _newData == false) {
rc = Serial.read ();
agar (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
agar (ndx> = _numChars) {
ndx = _numChars - 1;
}
} boshqa {
_receivedChars [ndx] = '\ 0'; // qatorni tugatish
ndx = 0;
_newData = to'g'ri;
}
}
}
voidparseSendCommands () {
agar (_newData == rost) {
constchar delim [2] = "";
char *belgisi;
token = strtok (_receivedChars, delim);
char cmd = _receivedChars [0];
bayt indeksi = 0;
bayt qiymati = 0;
int i = 0;
while (token! = NULL) {
//Serial.println(token);
i ++;
kalit (i) {
1 -holat:
token = strtok (NULL, delim);
indeks = atoi (token);
tanaffus;
2 -holat:
token = strtok (NULL, delim);
if (token! = NULL) {
qiymat = atoi (token);
}
tanaffus;
standart:
token = NULL;
}
}
sendCmd (cmd, indeks, qiymat);
_newData = noto'g'ri;
}
}
voidsendCmd (char cmd, bayt indeksi, bayt qiymati) {
Serial.println ("-----");
Serial.println ("Buyruq yuborilmoqda:");
Serial.println ("\ t" + String (cmd) + "" + String (indeks) + "" + String (qiymat));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // qurilmaga uzatish
Wire.write (cmd); // char yuboradi
Wire.write (indeks); // bir bayt yuboradi
Wire.write (qiymat); // bir bayt yuboradi
Wire.endTransmission ();
baytli javob = 0;
boR hadResponse = noto'g'ri;
agar (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS, 1);
while (Wire.available ()) // qul so'ralganidan kamroq yuborishi mumkin
{
hadResponse = rost;
javob = Wire.read ();
}
agar (hadResponse == rost) {
Serial.println ("Javob olinmoqda:");
Serial.println (javob);
} boshqa {
Serial.println ("Javob yo'q, manzil/ulanishni tekshiring");
}
}
}

rawt1m_serial_input_i2c_char_byte_byte_v0.1.ino ni GitHub tomonidan ❤ bilan joylashtirilganini ko'rish

8 -qadam: Keyingi qadamlar

Vaqti -vaqti bilan dasturiy ta'minot/uskunadagi o'zgarishlarni tekshirish uchun tekshiring.

Dasturiy ta'minotni/uskunani talablarga muvofiq o'zgartiring.

Har qanday so'rov/optimallashtirishga sharh bering.

Tavsiya: