Mündəricat:

IOT123 - SOLAR TRACKER - CONTROLLER: 8 Addım
IOT123 - SOLAR TRACKER - CONTROLLER: 8 Addım

Video: IOT123 - SOLAR TRACKER - CONTROLLER: 8 Addım

Video: IOT123 - SOLAR TRACKER - CONTROLLER: 8 Addım
Video: IOT123 - SOLAR TRACKER CONTROLLER TEST 0 3 2024, Iyul
Anonim
Image
Image
IOT123 - SOLAR TRACKER - CONTROLLER
IOT123 - SOLAR TRACKER - CONTROLLER
IOT123 - SOLAR TRACKER - CONTROLLER
IOT123 - SOLAR TRACKER - CONTROLLER

Bu, Təlimatlandırmanın bir uzantısıdır

IOT123 - SOLAR TRACKER - TILT/PANEL, PANEL FRAME, LDR MOUNTS RIG. Burada, servoların nəzarətçisinə və günəşin mövqeyinin sensorlarına diqqət yetiririk. Qeyd etmək vacibdir ki, bu dizayn 2 MCU istifadə edəcək: günəş izləyicisi üçün bir (3.3V 8mHz Arduino Pro Mini) və sensorlar/aktyorlar üçün bir müstəqil MCU.

Bu 0.3 versiyasıdır

Tam məmnun olduqdan sonra bütün layihələri dərc etmək əvəzinə, davamlı inteqrasiya praktikasını həyata keçirəcəyəm və çatdırdığımı ehtiyac duyduğum kimi dəyişdirərək daha tez -tez bir şey çatdıracağam. Batareya şarj cihazı üçün başqa bir təlimat yazacağam, _ nəzarətçi proqramının/avadanlığının optimallaşdırılması başa çatdıqda. Bu yolu keçərkən optimallaşdırmanın harada lazım olduğunu göstərəcəyəm.

Bu yanaşmanın səbəblərindən biri də müştəri rəyidir. Bir ehtiyac görürsünüzsə və ya daha yaxşı bir yanaşma varsa, zəhmət olmasa şərh yazın, amma unutmayın ki, mən hər şeyi çatdıra bilmərəm və bəlkə də sizə uyğun bir zaman aralığında deyil. Bu izahlar daha az əhəmiyyətli göründüyü üçün bu məqalədən silinəcəklər.

Bura nələr daxildir:

  1. Günəşlərin təxmini yerini hiss etmək üçün orijinal Təlimatlandırılmış LDR -lərdən istifadə edin.
  2. Servoları günəşə tərəf hərəkət etdirin.
  3. Hərəkətlərin həssaslığı üçün seçimlər.
  4. Günəşə hərəkət edərkən addım ölçüsü üçün seçimlər.
  5. Servoda istifadə olunan açısal məhdudiyyətlər üçün seçimlər.
  6. Hərəkətlərin gecikməsi üçün seçimlər.
  7. MCU -lar arasında dəyərlər təyin etmək/əldə etmək üçün I2C interfeysi.
  8. Hərəkətlər arasında dərin yuxu.

Bura daxil olmayanlar (və vaxt icazə verildikdə həll olunacaq):

  1. Güc işığı yalnız gündüz saatlarında.
  2. Şəfəq mövqeyini xatırlamaq və alacakaranlıq bağlandıqda ora getmək.
  3. MCU -dan tənzimləyicinin çıxarılması.
  4. MCU -dakı LED -lərin söndürülməsi.
  5. Gücün RAW əvəzinə VCC vasitəsilə dəyişdirilməsi.
  6. USB -dən Serial TTL çeviricisinə tənzimlənməmiş güc olmadan yanıb -sönmək üçün həll yolları təmin etmək.
  7. Batareya gərginliyi monitoru.

TARİX

20 Dekabr 2017 V0.1 KODU

İlkin versiya işıq mənbəyini izləyir, həmişə açıqdır, heç bir şarj yoxdur

7 Yanvar 2018 V0.2 KODU

  • DONANIM DƏYİŞİKLİKLƏRİ

    • I2C sancaqlar əlavə edin
    • Servo GND -lərə keçid əlavə edin
    • Nəzarət qutusu panelinin üzərində çap olunmuş etiket
  • YAZILIM DƏYİŞİKLİKLƏRİ

    • EEPROM -dan konfiqurasiyanı oxuyun
    • I2C avtobus dəstəyi başqa bir MCU -nun köləsi olaraq (3.3V)
    • I2C vasitəsilə konfiqurasiyanı təyin edin
    • I2C vasitəsi ilə Enabled seçin
    • I2C vasitəsilə konfiqurasiya əldə edin
    • İş vaxtı xüsusiyyətlərini I2C (hal -hazırda aktiv və cari işıq intensivliyi) vasitəsilə əldə edin
    • Serial qeydləri silin (I2C dəyərlərinə təsir etdi)

19 Yanvar 2018 V0.3 KODU

  • DONANIM

    Etiket yeniləndi. Keçid artıq CONFIG və ya TRACK rejimini seçmək üçün istifadə olunur

  • PROQRAM TƏMİNATI

    • I2C yalnız konfiqurasiya üçün istifadə olunur
    • Nəzarətçi izləməni başlamazdan əvvəl 5 saniyə gözləyir, əlləri hərəkət etdirməyə imkan verir
    • I2C konfiqurasiyasından istifadə etmək üçün SPDT vahid çəkmələri kimi CONFIG -də olmalıdır
    • İzləmə hərəkəti arasında, cihaz yuxu dəqiqələrinin konfiqurasiya dəyəri üçün dərin yuxu rejimindədir (standart 20 dəqiqə).

Addım 1: Materiallar və Alətlər

Alətlər və materiallar
Alətlər və materiallar
Alətlər və materiallar
Alətlər və materiallar
Alətlər və materiallar
Alətlər və materiallar

İndi tam bir material və mənbələr siyahısı var.

  1. 3D çaplı hissələr.
  2. Arduino Pro Mini 3.3V 8 mHz
  3. 4x6 sm ölçülü cüt tərəfli prototip PCB universal çaplı lövhə (yarıya bölünəcək)
  4. 1 ədəd 40P kişi başlığı (ölçüdə kəsiləcək).
  5. 1 ədəd 40P qadın başlıq (ölçüdə kəsiləcək).
  6. 4 off 10K 1/4W restistorlar.
  7. Bağlama teli.
  8. Lehim və Dəmir.
  9. 20 ədəd 4G x 6 mm paslanmayan tava başlı özünü vurma vintləri.
  10. 4 ədəd 4G x 6 mm paslanmayan havşa özünü vurma vintləri.
  11. 1 off 3.7V LiPo batareya və tutucu (2P dupont bağlayıcılarında sona çatır).
  12. 1 off 2P kişi sağ açılı başlıq
  13. 1 ədəd SPDT açarı 3 pinli 2.54 mm aralıq
  14. Güclü siyanoakrilat yapışqan
  15. Dupont bağlayıcıları qadın 1P başlıq (1 mavi, 1 yaşıl off).

Addım 2: Dövrün montajı

Dövrə yığılması
Dövrə yığılması
Dövrə yığılması
Dövrə yığılması
Dövrə yığılması
Dövrə yığılması

Hal -hazırda dövrədə Gərginlik Bölücü Dövr (voltmetr) yoxdur.

  1. 4x6 sm ölçülü iki tərəfli prototip PCB universal çaplı lövhəni uzun ox boyunca yarıya bölün.
  2. 40P kişi başlığını parçalara ayırın:

    1. 12 -də 2 endirim
    2. 3də 3P
    3. 2 -dən 6 -ya endirim.
  3. 40P qadın başlığını parçalara ayırın:

    1. Saat 12 -də 2 endirim
    2. 1 dəfə 6P
  4. Lehim 2 endirildi 12 Qadın başlığı göstərildiyi kimi.
  5. 3P kişi (əlavə) başlıqdan çıxarılan boşluğu SPDT keçidinin altına siyanoakrilat yapışqan ilə yapışdırın.
  6. Digər tərəfdən, sonra 6 L 2 2P, 2 Off 3Pmale başlığı və göstərildiyi kimi SPDT keçidini lehimləyin.
  7. GND pin başlığına (#2 qara) və A0 - A3 başlıq sancaqlarına (#5, #6, #7, #8), sonra delikdən (sarı) göstərildiyi kimi (3 şəkil + 1 diaqram).
  8. LDR PINS lehimləmə PİNSİ #4, #6, #8, #10 -dan 3.3V izləyin və başlıqdakı VCC pinindən (yaşıl) keçin.
  9. Pins #1, #12, #15 -ə göstərildiyi kimi (qırmızı) qadın başlıq tərəfində 3.3V izi qoyun.
  10. 3.3V çuxurdan yan tərəfə (qırmızı) RAW başlıq PIN #1.
  11. Narıncı bağlamanı 11 nömrəli PİN -dən delikdən, digər tərəfdəki dişi pinlə göstərildiyi kimi izləyin.
  12. #20 -dən #30 -a və 31 -dən #13 -ə və 16 -ya qədər mavi bağlama telini izləyin və lehimləyin.
  13. Lehim Dişi Başlıq PIN kodu #11 Kişi Başlıq PİN #11 nömrəli delikdən.
  14. Dişi 1P başlığı ilə 30 mm uzunluğunda 2 dupont bağlayıcı hazırlayın (1 mavi, 1 yaşıl off). Digər ucunu zolaq və qalay ilə bağlayın.
  15. Lehim mavi Dupont teli #28; lehim yaşıl Dupont teli #29.
  16. Arduinonun üst tərəfində 6P dişi başlığı düzəldin və sonra lehimləyin.
  17. Arduinonun üst tərəfində 2 #dik açılı qadın başlığını int #29 və #30 sonra lehimləyin.
  18. Arduinonun alt tərəfində 12P -dən 2 -ni və 3 -dən 3 -ə qədər kişi sancaqlarını düzəldin, sonra lehimləyin.
  19. Arduino kişi 12P pinlərini PCB 12P dişi başlıqlarına daxil edin.

Addım 3: MCU -nun yanıb -sönməsi

MCU yanıb -sönür
MCU yanıb -sönür
MCU yanıb -sönür
MCU yanıb -sönür
MCU yanıb -sönür
MCU yanıb -sönür

Arduino Pro Mini, 6P dişi başlıqdan istifadə edərək FTDI232 USB -dən TTL çeviricisindən istifadə etməklə rahatlıqla işıqlandırılır. 2 lövhənin hizalanması üçün yuxarıdakı fotoya baxın.

3.3V parametrinin FTDI232 cihazınızda seçildiyindən əmin olun. Aşağıdakı kodu istifadə edərək buradakı təlimatları izləyin (GIST bağlantısını istifadə edin).

Aşağı güc kitabxanasının (əlavə və https://github.com/rocketscream/Low-Power) quraşdırılması lazımdır.

Arduino Pro Mini + PCB korpusa quraşdırıldıqda, başlıq sancaqları açıldıqda yenə də çırpıla bilər. Başlığı açan Panel Çərçivəsindən Nəzarət Birimini ayırın.

I2C/EEPROM konfiqurasiyasına və hərəkətlər arasında yuxu dövrünə malik əyilmə pan günəş izləyicisi. Yuxu dövrü müddəti dəqiqliyi müddəti artdıqca azalır, lakin bu məqsəd üçün kifayətdir

/*
* koddan dəyişdirildi
* Mathias Leroy tərəfindən
*
* V0.2 Dəyişikliklər
** I2C AYARLAYIN
** EEPROM AYARI OLUN
** SERİ ÇIXIŞINI ÇIKARIN - İSTİFADƏ I2C
** İZLƏMƏNİ ƏLAVƏ EDİN/DEVRE EDİN
** Servisləri I2C vasitəsi ilə məhdudlaşdırın
** I2C VARİNDƏ CARİNDƏN AVG YOĞUNLUĞUNU oxuyun
* V0.3 Dəyişikliklər
** 2 MODA ÜÇÜN AÇIQ - İZLƏ (I2C YOX) və KONFİGÜRASİYA (I2C İSTİFADƏ EDİR)
** İZLƏMƏ MODUNDA YATAQ (8 İKİNCİ BÖLÜM ÜÇÜN ÇOX DÜŞÜK Dəqiqlik)
** YATDI/AYIQDAN SONRA ÇIKARMA/ATAŞLAMA XİDMƏTLƏRİ (TRANSİSTOR HƏMİŞƏ İSTİFADƏ EDİLİR)
** YAPILANDIRILABİLİR BAŞLI MÖVQEYİ ÇIKARIN (REDUNDANT)
** YAPILANDIRILABİLƏCƏK AYANIŞ İKİNCİLƏRİNİ ÇIXARIN (REDUNDANT)
** KONFİGÜRASİYA ETMƏLİ/ƏSASLAYIN (REDUNDANT)
** ETKİN EDİLDİĞİ KONFİGÜRASİYALI İZLƏYİCİ ÇIXARIN (DONANIM ŞALTARINI İSTİFADƏ EDİN)
** GERİLİM GETTERİNİ ÇIKARIN - AYRI I2C KOMPONENTİ İSTİFADƏ EDƏCƏK
** I2C İSTİFADƏ ETMƏYƏN SERIAL LOGGING ƏLAVƏ EDİN
*/
#daxil edin
#daxil edin
#daxil edin
#daxil edin
#daxil edin
#defineEEPROM_VERSION1
#defineI2C_MSG_IN_SIZE3
#dePine_LDR_TL A0
#dePine_LDR_TR A1
#definePIN_LDR_BR A3
#dePine_LDR_BL A2
#definePIN_SERVO_V11
#definePIN_SERVO_H5
#defineIDX_I2C_ADDR0
#defineIDX_V_ANGLE_MIN1
#defineIDX_V_ANGLE_MAX2
#defineIDX_V_SENSITIVITY3
#defineIDX_V_STEP4
#defineIDX_H_ANGLE_MIN5
#defineIDX_H_ANGLE_MAX6
#defineIDX_H_SENSITIVITY7
#defineIDX_H_STEP8
#defineIDX_SLEEP_MINUTES9
#defineIDX_V_DAWN_ANGLE10
#defineIDX_H_DAWN_ANGLE11
#defineIDX_DAWN_INTENSITY12 // bütün LDRS ortalaması
#defineIDX_DUSK_INTENSITY13 // bütün LDRS ortalaması
#defineIDX_END_EEPROM_SET14
#defineIDX_CURRENT_INTENSITY15 // bütün LDRS ortalaması - IDX_DAWN_INTENSITY havalı birbaşa olmayan işığın hesablanması üçün istifadə olunur
#defineIDX_END_VALUES_GET16
#defineIDX_SIGN_117
#defineIDX_SIGN_218
#defineIDX_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 = yalan;
voidsetup ()
{
Serial.begin (115200);
getFromEeprom ();
əgər (inConfigMode ()) {
Serial.println ("Konfiqurasiya rejimi");
Serial.print ("I2C Ünvan:");
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onReceive (receiveEvent);
Wire.onRequest (requestEvent);
} başqa {
Serial.println ("İzləmə rejimi");
gecikmə (5000); // batareyanı bağlayarkən əlləri yoldan çıxarmaq vaxtı və s.
}
}
boşluq ()
{
getLightValues ();
əgər (! _inConfigMode) {
// ToDo: TRANSISTOR SWITCH'I Yandırın
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
üçün (int i = 0; i <20; i ++) {
əgər (i! = 0) {
getLightValues ();
}
moveServos ();
}
gecikmə (500);
_servoH.detach ();
_servoV.detach ();
// Ediləcək işlər: TRANSISTOR SWITCH -i söndürün
gecikmə (500);
yuxudaFor ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// -------------------------------- CARİ MODU
boolinConfigMode () {
pinMode (PIN_SERVO_H, GİRİŞ);
_inConfigMode = digitalRead (PIN_SERVO_H) == 1;
qaytar _inConfigMode;
}
// -------------------------------- EEPROM
voidgetFromEeprom () {
əgər (
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");
üçün (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");
üçün (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
_i2cVals = EEPROM.read (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// -------------------------------- I2C
voidreceiveEvent (int sayı) {
əgər (say == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
bayt indeksi = Wire.read ();
bayt dəyəri = Wire.read ();
keçid (cmd) {
dava 'G':
əgər (indeks <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [indeks];
}
fasilə;
dava 's:
əgər (indeks <IDX_END_EEPROM_SET) {
_i2cVals [index] = dəyər;
EEPROM.update (indeks, _i2cVals [indeks]);
}
fasilə;
defolt:
qayıtmaq;
}
}
}
voidrequestEvent ()
{
Wire.write (_i2cResponse);
}
// -------------------------------- LDR-lər
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] = xəritə (orta sıxlıq, 0, 1024, 0, 255);
}
// -------------------------------- XİDMƏTLƏR
voidmoveServos () {
Serial.println ("moveServos");
əgər ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// sola gedir
Serial.println ("moveServos sola gedir");
gecikmə (_slowingDelay);
üçün (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH--);
gecikmə (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH+_i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {
// doğru gedir
Serial.println ("moveServos sola gedir");
gecikmə (_slowingDelay);
üçün (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
gecikmə (_servoLoopDelay);
}
}
başqa {
// heç nə etmir
Serial.println ("moveServos heç nə etmir");
gecikmə (_slowingDelay);
}
əgər ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV+_i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// yuxarı qalxır
Serial.println ("moveServos yuxarı gedir");
gecikmə (_slowingDelay);
üçün (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
gecikmə (_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {
// enmək
Serial.println ("moveServos aşağı gedir");
gecikmə (_slowingDelay);
üçün (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
gecikmə (_servoLoopDelay);
}
}
başqa {
Serial.println ("moveServos heç nə etmir");
gecikmə (_slowingDelay);
}
}
// --------------------------------- YUXU
voidasleepFor (imzasız səkkizSekondSegment) {
Serial.println ("yuxudaFor");
üçün (imzasız sleepCounter = səkkizSekundSegmentləri; sleepCounter> 0; sleepCounter--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

GitHub tərəfindən ❤ ilə ev sahibliyi edilən rawtilt_pan_tracker_0.3.ino

Addım 4: Dövrə Korpusunun Montajı

Dövrə Korpusunun Montajı
Dövrə Korpusunun Montajı
Dövrə Korpusunun Montajı
Dövrə Korpusunun Montajı
Dövrə Korpusunun Montajı
Dövrə Korpusunun Montajı
  1. Ardiuno Pro Mini -nin PCB başlıqlarına daxil olduğundan əmin olun.
  2. SOLAR TRACKER nəzarətçi qutusu əsasını SOLAR TRACKER nəzarətçi qutusu divarlarına daxil edin və 2 ədəd 4G x 6 mm paslanmayan havşa özünü vurma vintləri ilə yapışdırın.
  3. Ardiuno Pro Mini + PCB -ni 6P başlığı olan SOLAR TRACKER nəzarətçi qutusunun əsasındakı boşluğa daxil edin.
  4. SOLAR TRACKER nəzarətçi qutusu qapağını SOLAR TRACKER nəzarətçi qutusu divarlarına daxil edin və 2 ədəd 4G x 6mm paslanmayan havşa özünü vurma vintləri ilə yapışdırın.
  5. Yuxarıdakı montajı, 4G x 6mm 4 ədəd paslanmayan havşalı özünü vurma vintləri ilə Panel Çərçivəsinin əsasına yapışdırın.

Addım 5: Qurğuların Nəzarətçiyə Bağlanması

Qurğunun Nəzarətçiyə Bağlanması
Qurğunun Nəzarətçiyə Bağlanması
Qurğunun Nəzarətçiyə Bağlanması
Qurğunun Nəzarətçiyə Bağlanması
Qurğunun Nəzarətçiyə Bağlanması
Qurğunun Nəzarətçiyə Bağlanması

Əvvəlki Təlimatlardan hazırlanan müvafiq bağlantılar, servodan 4 off 2P LDR bağlantısı və 2 off 3P bağlantısıdır. Yenidən doldurulana qədər müvəqqəti olan şey batareyadır. Hələlik 2P DuPont bağlantısı ilə bitən 3.7V LiPo istifadə edin.

  1. LDR bağlantılarını (polarite yoxdur) yuxarıdan daxil edin:

    1. Yuxarı Sağ
    2. Üst Sol
    3. Aşağı Sağ
    4. Sol Alt
  2. Servo bağlantılarını (siqnal teli sola) yuxarıdan daxil edin:

    1. Üfüqi
    2. Şaquli
  3. SONRA SINAŞA HAZIR OLUN: 3.7V DC Gücü +və yuxarı yuxarı -ve aşağı salın.

Addım 6: Nəzarətçini sınayın

Image
Image

Daha əvvəl də qeyd edildiyi kimi, proqram Günəş Doldurma iş axını üçün optimallaşdırılmamışdır. Təbii (günəş) və qeyri -təbii işıq mənbələrindən istifadə edərək sınaqdan keçirilə və düzəldilə bilər.

Nəzarət olunan bir mühitdə izləməni sınamaq üçün SLEEP DAKİKALARINI daha aşağı bir dəyərə qoymaq rahat ola bilər (növbəti addıma baxın).

Addım 7: Konsol Girişindən istifadə edərək I2C ilə Konfiqurasiya

Bu, nəzarətçini ikinci bir MCU vasitəsilə konfiqurasiya etməyi, parametrləri konsol pəncərəsinə daxil etməyi izah edir.

  1. Aşağıdakı skripti D1M WIFI BLOCK (və ya Wemos D1 Mini) üzərinə yükləyin.
  2. USB -ni PC -dən ayırın
  3. PIN BAĞLANTILARI: -ve (Controller) => GND (D1M)+ve (Controller) => 3V3 (D1M) SCL (Controller) => D1 (D1M)

    SDA (Nəzarətçi) => D2 (D1M)

  4. SPDT düyməsini CONFIG -ə çevirin
  5. USB -ni PC -yə qoşun
  6. Arduino IDE -dən düzgün COM Portu olan bir konsol pəncərəsi başlayın
  7. "Yeni xətt" və "9600 baud" seçilmiş olduğundan əmin olun
  8. Əmrlər Göndərmə Mətn qutusuna daxil edilir və sonra Enter düyməsini basır
  9. Əmrlər Character byte byte formatındadır
  10. İkinci bayt (üçüncü seqment) daxil deyilsə, skript tərəfindən 0 (sıfır) göndərilir
  11. Serial girişdən istifadə edərkən diqqətli olun; "Giriş" düyməsini basmadan əvvəl daxil etdiyinizi nəzərdən keçirin. Əgər kilidlənmisinizsə (məsələn, I2C ünvanını unudulmuş bir dəyərə dəyişməklə), nəzarətçi firmware proqramını yenidən yandırmalısınız.

Komandanın ilk xarakterində dəstəklənən dəyişikliklər bunlardır:

  • E (servo izləməni aktivləşdir) konfiqurasiya zamanı hərəkəti dayandırmaq üçün faydalıdır. Bu giriş istifadə olunur: E 0
  • D (servo izləməni deaktiv edin) cihazı yenidən başlatmadıqda avtomatik izləməyə başlamaq üçün faydalıdır. Bu giriş: D 0
  • G (Konfiqurasiya dəyərini əldə et) EEPROM və IN -MEMORY -dən dəyərləri oxuyur: Bu girişdən istifadə olunur: G (indeks 0-13 və 15 -də etibarlı bayt dəyərləridir)
  • S (EEPROM dəyərini təyin et) yenidən başladıqdan sonra mövcud olan dəyərləri EEPROM olaraq təyin edir. Bu istifadə olunan girişdir: S (indeks etibarlı bayt dəyərləri 0 - 13, dəyər etibarlı bayt dəyərlərdir və xüsusiyyətlərə görə dəyişir)

Kod indekslər üçün həqiqət nöqtəsidir, lakin etibarlı dəyərlər/şərhlər üçün bələdçi olaraq aşağıdakılar istifadə olunur:

  • I2C ADDRESS 0 - nəzarətçi qul ünvanı, nəzarətçinin nəzarətçi ilə əlaqə qurması üçün buna ehtiyacı var (standart 10)
  • Minimum şaquli açı 1 - bucaq şaquli servo aşağı həddi (standart 10, aralıq 0 - 180)
  • MAXIMUM VERTICAL ANCLE 2 - bucaq şaquli servo yuxarı həddi (standart 170, aralıq 0 - 180)
  • SENSITIVITY VERTICAL LDR 3 - Şaquli LDR oxu marjası (standart 20, aralıq 0-1024)
  • ŞƏKİL AÇI ADIM 4 - hər bir tənzimləmədə açılı şaquli servo addımlar (standart 5, aralıq 1-20)
  • Minimum üfüqi açı 5 - bucaqlı üfüqi servo alt həddi (standart 10, aralıq 0 - 180)
  • Maksimum üfüqi açı 6 - bucaqlı üfüqi servo yuxarı həddi (standart 170, aralıq 0 - 180)
  • Həssaslıq HORIZONTAL LDR 7 - Horizontal LDR oxu marjası (standart 20, aralıq 0 - 1024)
  • HORIZONTAL AÇI ADIM 8 - hər bir tənzimləmədə bucaqlı üfüqi servo addımlar (standart 5, aralıq 1-20)
  • SLEEP DAKİKALAR 9 - izləmə arasındakı təxmini yuxu müddəti (standart 20, aralıq 1 - 255)
  • ŞAHİ AÇI 10 - GƏLƏCƏK İSTİFADƏ - Günəş batanda geri dönmək üçün şaquli bucaq
  • HORIZONTAL DAWN ANCLE 11 - GƏLƏCƏK İSTİFADƏ - Günəş batanda geri dönmək üçün üfüqi bucaq
  • DAWN INTENSITY 12 - GƏLƏCƏK İSTİFADƏ - gündəlik günəş izləməsinin başlanmasına səbəb olan bütün LDR -lərin minimum ortalaması
  • DUSK INTENSITY 13 - GƏLƏCƏK İSTİFADƏ - gündəlik günəş izləməsinin sona çatmasına səbəb olan bütün LDR -lərin minimum ortalaması
  • EEPROM DƏYƏRLƏRİNİN SONU MARKER 14 - DƏYƏRİ İSTİFADƏ EDİLMİR
  • CARİ YOĞUNLUQ 15 - işıq intensivliyinin cari orta faizi
  • YADDAŞ DƏYƏRLƏRİNİN SONU MARKER 16 - DƏYƏRİ İSTİFADƏ EDİLMİR.

Serial girişi (konsol pəncərəsindəki klaviatura girişi) ələ keçirir və char, bayt, bayt formatında bir I2C quluna ötürür

#daxil edin
#defineI2C_MSG_IN_SIZE2
#defineI2C_MSG_OUT_SIZE3
#defineI2C_SLAVE_ADDRESS10
boolean _newData = yanlış;
const bayt _numChars = 32;
char _receivedChars [_numChars]; // alınan məlumatları saxlamaq üçün bir sıra
voidsetup () {
Serial.begin (9600);
Tel.begin (D2, D1);
gecikmə (5000);
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
statik bayt ndx = 0;
char endMarker = '\ n';
char rc;
while (Serial.available ()> 0 && _newData == false) {
rc = Serial.read ();
əgər (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
əgər (ndx> = _numChars) {
ndx = _numChars - 1;
}
} başqa {
_receivedChars [ndx] = '\ 0'; // simli dayandırın
ndx = 0;
_newData = doğru;
}
}
}
voidparseSendCommands () {
əgər (_newData == doğru) {
constchar delim [2] = "";
char *token;
token = strtok (_receivedChars, delim);
char cmd = _receivedChars [0];
bayt indeksi = 0;
bayt dəyəri = 0;
int i = 0;
while (token! = NULL) {
//Serial.println(token);
i ++;
keçid (i) {
hal 1:
token = strtok (NULL, delim);
indeks = atoi (token);
fasilə;
hal 2:
token = strtok (NULL, delim);
if (token! = NULL) {
dəyər = atoi (token);
}
fasilə;
defolt:
token = NULL;
}
}
sendCmd (cmd, indeks, dəyər);
_newData = yanlış;
}
}
voidsendCmd (char cmd, bayt indeksi, bayt dəyəri) {
Serial.println ("-----");
Serial.println ("Komanda göndərilir:");
Serial.println ("\ t" + String (cmd) + "" + String (index) + "" + String (dəyər));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // cihaza ötürmək
Wire.write (cmd); // simvol göndərir
Wire.write (indeks); // bir bayt göndərir
Wire.write (dəyər); // bir bayt göndərir
Wire.endTransmission ();
bayt cavabı = 0;
bool hadResponse = yalan;
əgər (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS, 1);
while (Wire.available ()) // kölə tələb olunandan az göndərə bilər
{
hadResponse = doğru;
cavab = Wire.read ();
}
əgər (hadResponse == doğru) {
Serial.println ("Cavab alınır:");
Serial.println (cavab);
} başqa {
Serial.println ("Cavab yoxdur, ünvanı/əlaqəni yoxlayın");
}
}
}

GitHub tərəfindən ❤ ilə ev sahibliyi edilən rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino bax

Addım 8: Növbəti addımlar

Proqram/hardware dəyişikliklərini yoxlamaq üçün vaxtaşırı yoxlayın.

Proqramı/aparatı tələblərinizə uyğun olaraq dəyişdirin.

İstənilən sorğu/optimallaşdırma ilə bağlı şərh yazın.

Tövsiyə: