Kazalo:

IOT123 - SOLARNI Sledilnik - UPRAVLJAČ: 8 korakov
IOT123 - SOLARNI Sledilnik - UPRAVLJAČ: 8 korakov

Video: IOT123 - SOLARNI Sledilnik - UPRAVLJAČ: 8 korakov

Video: IOT123 - SOLARNI Sledilnik - UPRAVLJAČ: 8 korakov
Video: Wohnmobil PROTEC mit SLIDE-OUTS! Auf der Straße 2,3m, zum Wohnen 3,5m 2024, November
Anonim
Image
Image
IOT123 - SOLARNI Sledilnik - NADZOR
IOT123 - SOLARNI Sledilnik - NADZOR
IOT123 - SOLARNI Sledilnik - NADZOR
IOT123 - SOLARNI Sledilnik - NADZOR

To je razširitev Instructable

IOT123 - SOLARNI Sledilnik - nagib/posoda, okvirni okvir, LDR MOUNTS RIG. Tu se osredotočamo na krmilnik servomotorjev in senzorje položaja sonca. Pomembno je poudariti, da ta zasnova predvideva, da bosta uporabljena 2 MCU -ja: eden (3.3V 8mHz Arduino Pro Mini) za sončni sledilnik in en neodvisen MCU za vaše senzorje/igralce.

To je različica 0.3

Namesto da bi po popolnem zadovoljstvu objavil vse projekte, bom vadil stalno integracijo in nekaj pogosteje ponujal, pri čemer bom spreminjal tisto, kar sem dostavil po potrebi. Za polnilnik baterij bom napisal še eno navodilo, _ ko bo optimizacija programske/strojne opreme krmilnika končana. Ko bom stopil skozi to, bom opozoril, kje so potrebne optimizacije.

Del razloga za ta pristop so povratne informacije strank. Če vidite, da potrebujete ali imate boljši pristop, komentirajte, vendar ne pozabite, da ne morem dostaviti vsega in morda ne v časovnem okviru, ki vam ustreza. Ker se zdijo te razlage manj pomembne, bodo črtane iz tega članka.

Kaj to vključuje:

  1. Za zaznavanje približne lokacije sonca uporabite LDR iz prvotnega navodila.
  2. Servomotorje premaknite proti soncu.
  3. Možnosti za občutljivost gibov.
  4. Možnosti velikosti koraka pri premikanju na sonce.
  5. Možnosti kotnih omejitev, ki se uporabljajo na servomotorjih.
  6. Možnosti za zamude pri premikanju.
  7. I2C vmesnik za nastavitev/pridobivanje vrednosti med MCU -ji.
  8. Globok spanec med gibi.

Kaj to ne vključuje (in bo obravnavano kot časovno dovoljenje):

  1. Napajanje uporabljate le podnevi.
  2. Spomin na položaj zore in tja v mraku.
  3. Odstranitev regulatorja iz MCU.
  4. Onemogočanje LED (-ov) na MCU -ju.
  5. Preusmeritev napajanja prek VCC in ne RAW.
  6. Zagotavljanje rešitev za utripanje brez reguliranega napajanja iz pretvornika USB v serijski TTL.
  7. Nadzor napetosti akumulatorja.

ZGODOVINA

20. december 2017 V0.1 KODA

Začetna različica sledi svetlobnemu viru, vedno vklopljen, brez polnjenja

7. januar 2018 V0.2 KODA

  • SPREMEMBE HARDVERA
    • Dodajte zatiče I2C
    • Dodajte stikalo servo GND
    • Natisnjena nalepka na ohišju krmilne omarice
  • SPREMEMBE PROGRAMSKE OPREME

    • Preberite konfiguracijo iz EEPROM -a
    • Podpora vodila I2C kot suženj drugemu MCU (3,3 V)
    • Nastavite konfiguracijo prek I2C
    • Nastavite Omogočeno prek I2C
    • Pridobite konfiguracijo prek I2C
    • Pridobite lastnosti časa izvajanja prek I2C (trenutno omogočeno in trenutna intenzivnost svetlobe)
    • Odstrani serijsko beleženje (vplivalo je na vrednosti I2C)

19. januar 2018 V0.3 KODA

  • HARDWARE

    Oznaka posodobljena. Stikalo se zdaj uporablja za izbiro načina CONFIG ali TRACK

  • PROGRAMSKA OPREMA
    • I2C se uporablja samo za konfiguracijo
    • Krmilnik počaka 5 sekund, preden inicializira sledenje, kar omogoča premikanje rok
    • Za uporabo konfiguracije I2C mora biti SPDT na CONFIG kot zagon enote
    • Med sledenjem gibanju je enota v načinu globokega spanja za konfiguracijsko vrednost SLEEP MINUTES (privzeto 20 minut).

Korak: Materiali in orodja

Materiali in orodja
Materiali in orodja
Materiali in orodja
Materiali in orodja
Materiali in orodja
Materiali in orodja

Zdaj je na voljo celoten seznam gradiva in virov.

  1. 3D tiskani deli.
  2. Arduino Pro Mini 3.3V 8mHz
  3. 1 od univerzalnega tiskanega vezja z dvostranskim prototipom PCB z dvojno stranjo (prerezati na pol)
  4. 1 izklop moške glave 40P (za rezanje po velikosti).
  5. 1 off 40P ženska glava (za rezanje po velikosti).
  6. 4 off 10K 1/4 W upori.
  7. Priključna žica.
  8. Spajkanje in železo.
  9. 20 samoreznih vijakov iz nerjaveče glave 4G x 6 mm iz nerjavečega jekla.
  10. 4 izklopni samorezni vijaki iz nerjavečega jekla 4G x 6 mm.
  11. 1 izklop 3.7V LiPo baterija in držalo (zaključek v 2P dupont priključkih).
  12. 1 izklop 2P moškega desnega kota glave
  13. 1 izklop SPDT stikalo 3 -polni razmik 2,54 mm
  14. Močno cianoakrilatno lepilo
  15. Konektorji Dupont ženski 1P priključek (1 izključeno modro, 1 izključeno zeleno).

2. korak: Sestavljanje vezja

Sestavljanje vezja
Sestavljanje vezja
Sestavljanje vezja
Sestavljanje vezja
Sestavljanje vezja
Sestavljanje vezja

Vezje trenutno nima vezja delilnika napetosti (voltmetra).

  1. Univerzalno tiskano vezje z obojestranskim tiskanim vezjem 4x6 cm prerežite na pol po dolgi osi.
  2. Moško glavo 40P narežite na koščke:

    1. 2 off 12P
    2. 3 off 3P
    3. 6 off 2P.
  3. Žensko glavo 40P narežite na koščke:

    1. 2 off 12P
    2. 1 off 6P
  4. Spajkanje 2 off 12P ženska glava, kot je prikazano.
  5. Distančnik, odstranjen s 3P moške (dodatne) glave, nalepite na spodnjo stran stikala SPDT s cianoakrilatnim lepilom
  6. Na drugi strani nato spajkajte 6 off 2P, 2 off 3Pmale header in stikalo SPDT, kot je prikazano.
  7. Spajkajte 4 iz 10K uporov (A, B, C, D črno) preko kabla na glavo zatiča GND (#2 črna) in na zatiče glave A0 - A3 (#5, #6, #7, #8) in nato skozi luknjo (rumena), kot je prikazano (3 fotografije + 1 diagram).
  8. Sledite 3.3V iz LDR PINS spajkanja PINS #4, #6, #8, #10 in navoj skozi luknjo do vtiča VCC v ženski glavi (zelena).
  9. Sledite 3.3V na ženski strani glave, kot je prikazano (rdeče) spajkanje na PINS #1, #12, #15.
  10. 3.3V skoznja luknja, spajkana na stranski strani (rdeča) RAW glave PIN #1.
  11. Sledite oranžnemu priključku iz PIN -a #11 skozi luknjo do spajkanja Ženski zatič na drugi strani, kot je prikazano.
  12. Sledi in spajkajte modro priključno žico od #20 do #30 in od #31 do #13 in #16.
  13. Spajkajte žensko glavo PIN #11 na moško PIN številko 11 glave 11 skozi luknjo.
  14. Pripravite 2 dupont konektorja dolžine 30 mm z žensko 1P glavo (1 off modra, 1 off zelena). Trak in kos drugega konca.
  15. Spajkajte modro žico Dupont na #28; spajkajte zeleno žico Dupont na #29.
  16. Na zgornji strani Arduina pritrdite žensko glavo 6P in nato spajkajte.
  17. Na zgornji strani Arduina pritrdite 2P pravokotno žensko glavo int #29 in #30 in nato spajkajte.
  18. Na spodnji strani Arduina pritrdite 2 moška zatiča 12P in 1 off 3P, nato pa spajkajte.
  19. Vstavite moške 12P zatiče Arduino v matične glave PCB 12P.

3. korak: Utripanje MCU

Utripa MCU
Utripa MCU
Utripa MCU
Utripa MCU
Utripa MCU
Utripa MCU

Arduino Pro Mini je priročno utripati s pretvornikom FTDI232 USB v TTL z uporabo ženske glave 6P. Za poravnavo dveh plošč glejte zgornjo fotografijo.

Prepričajte se, da je nastavitev 3,3 V izbrana na vašem FTDI232. Sledite tem navodilom s spodnjo kodo (uporabite povezavo do GIST).

Knjižnico z nizko porabo (priloženo in https://github.com/rocketscream/Low-Power) je treba namestiti.

Ko je Arduino Pro Mini + PCB nameščen v ohišje, ga lahko še vedno utripate, ko so zatiči glave izpostavljeni. Enoto krmilnika samo odklopite od okvirja plošče, tako da odkrijete glavo.

Solarni sledilnik z nagibom s konfiguracijo I2C/EEPROM in ciklom spanja med gibi. Natančnost trajanja cikla spanja se s povečanjem trajanja zmanjšuje, vendar v ta namen zadostuje

/*
* spremenjeno iz kode
* avtor Mathias Leroy
*
* V0.2 SPREMEMBE
** I2C SET GET
** EEPROM SET GET
** ODSTRANI SERIJSKI IZHOD - VPLIVAN I2C
** Omogoči/onemogoči sledenje
** Premaknite storitve do omejitev prek I2C
** PREBERITE TRENUTNO AVG INTENZITIVO PREKO I2C
* V0.3 SPREMEMBE
** PREKLOPITE ZA 2 NAČINA - TRACK (NO I2C) in CONFIGURE (UPORABA I2C)
** SPAVITE V NAČINU TRACK (ZELO NIZKA TOČNOST zaradi 8 DRUGIH DELOV)
** ODLOŽITE/PRILOŽITE STORITVE V SPANJEM/BUDENJU (TRANSISTOR, UPORABLJEN POROČNO)
** ODSTRANI KONFIGURIRANO ZAČETNO POLOŽAJ (NEDOLOŽNO)
** ODSTRANI KONFIGURIRANE SEKUNDE ZBUDITVE (ZMANJŠAJO)
** ODSTRANI NASTAVLJIVO Omogoči/onemogoči (ZMANJŠAJO)
** ODSTRANI KONFIGURIRANI TRACKER Omogočen (UPORABI STIKALO ZA OPREMO)
** ODSTRANITE VELIKO NAPETOST - UPORABLJA LOČENO KOMPONENTO I2C
** DODAJTE SERIJSKI DOGOVOR, KO NE UPORABLJATE I2C
*/
#vključi
#vključi
#vključi
#vključi
#vključi
#defineEEPROM_VERSION1
#defineI2C_MSG_IN_SIZE3
#definePIN_LDR_TL A0
#definePIN_LDR_TR A1
#definePIN_LDR_BR A3
#definePIN_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 // povprečje vseh LDRS
#defineIDX_DUSK_INTENSITY13 // povprečje vseh LDRS
#defineIDX_END_EEPROM_SET14
#defineIDX_CURRENT_INTENSITY15 // povprečje vseh LDRS - uporablja se za izračun IDX_DAWN_INTENSITY ambientalne, neposredne svetlobe
#defineIDX_END_VALUES_GET16
#defineIDX_SIGN_117
#defineIDX_SIGN_218
#defineIDX_SIGN_319
Servo _servoH;
Servo _servoV;
bajt _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;
bajt _i2cResponse = 0;
bool _inConfigMode = false;
voidsetup ()
{
Serial.begin (115200);
getFromEeprom ();
if (inConfigMode ()) {
Serial.println ("Način konfiguracije");
Serial.print ("Naslov I2C:");
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onReceive (receiveEvent);
Wire.onRequest (requestEvent);
} drugo {
Serial.println ("Način sledenja");
zakasnitev (5000); // čas, da umaknete roke, če priključite baterijo itd.
}
}
voidloop ()
{
getLightValues ();
if (! _inConfigMode) {
// ToDo: VKLOPITE Tranzistorno stikalo
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
za (int i = 0; i <20; i ++) {
če (i! = 0) {
getLightValues ();
}
moveServos ();
}
zamuda (500);
_servoH.detach ();
_servoV.detach ();
// ToDo: IZKLOPITE Tranzistorsko stikalo
zamuda (500);
sleepFor ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// --------------------------------- TRENUTNI NAČIN
boolinConfigMode () {
pinMode (PIN_SERVO_H, VHOD);
_inConfigMode = digitalno branje (PIN_SERVO_H) == 1;
return _inConfigMode;
}
// --------------------------------- EEPROM
voidgetFromEeprom () {
če (
EEPROM.preberite (IDX_SIGN_1)! = 'S' ||
EEPROM.preberite (IDX_SIGN_2)! = 'T' ||
EEPROM.preberite (IDX_SIGN_3)! = EEPROM_VERSION
) EEPROM_write_default_configuration ();
EEPROM_prebrana_konfiguracija ();
}
voidEEPROM_write_default_configuration () {
Serial.println ("EEPROM_write_default_configuration");
za (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
EEPROM.update (i, _i2cVals );
}
Posodobitev EEPROM (IDX_SIGN_1, 'S');
Posodobitev EEPROM (IDX_SIGN_2, 'T');
Posodobitev EEPROM (IDX_SIGN_3, EEPROM_VERSION);
}
voidEEPROM_read_configuration () {
Serial.println ("EEPROM_prebrana_konfiguracija");
za (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
_i2cVals = EEPROM.preberite (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// --------------------------------- I2C
voidreceiveEvent (int count) {
če (štetje == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
bajtni indeks = Wire.read ();
bajtna vrednost = Wire.read ();
stikalo (cmd) {
primer 'G':
if (indeks <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [indeks];
}
prekiniti;
primer 'S':
if (indeks <IDX_END_EEPROM_SET) {
_i2cVals [indeks] = vrednost;
EEPROM.update (indeks, _i2cVals [indeks]);
}
prekiniti;
privzeto:
vrnitev;
}
}
}
voidrequestEvent ()
{
Wire.write (_i2cResponse);
}
// --------------------------------- LDR
voidgetLightValues () {
int valueTopLeft = analogRead (PIN_LDR_TL);
int valueTopRight = analogRead (PIN_LDR_TR);
int valueBottomRight = analogRead (PIN_LDR_BR);
int valueBottomLeft = analogno branje (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] = zemljevid (avgIntensity, 0, 1024, 0, 255);
}
// --------------------------------- STORITVE
voidmoveServos () {
Serial.println ("moveServos");
if ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// gremo levo
Serial.println ("moveServos gre levo");
zakasnitev (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH--);
zakasnitev (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH+_i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {
// gremo desno
Serial.println ("moveServos gre levo");
zakasnitev (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
zakasnitev (_servoLoopDelay);
}
}
drugače {
// ne delam nič
Serial.println ("moveServos ne dela nič");
zakasnitev (_slowingDelay);
}
if ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV+_i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// iti gor
Serial.println ("moveServos gre gor");
zakasnitev (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
zakasnitev (_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {
// grem dol
Serial.println ("moveServos down down");
zakasnitev (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
zakasnitev (_servoLoopDelay);
}
}
drugače {
Serial.println ("moveServos ne dela nič");
zakasnitev (_slowingDelay);
}
}
// --------------------------------- SPANJE
voidasleepFor (unsignedint osemsekundsegmentov) {
Serial.println ("sleepFor");
for (nepodpisan spalni števec = osemsekundsegmentov; spalni števec> 0; spalni števec--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

oglejte si rawtilt_pan_tracker_0.3.ino, ki ga gosti ❤ GitHub

4. korak: Sestavljanje ohišja vezja

Sestavljanje ohišja vezja
Sestavljanje ohišja vezja
Sestavljanje ohišja vezja
Sestavljanje ohišja vezja
Sestavljanje ohišja vezja
Sestavljanje ohišja vezja
  1. Prepričajte se, da je Ardiuno Pro Mini vstavljen v glave na tiskanem vezju.
  2. Podstavek krmilne omarice SOLAR TRACKER vstavite v stene krmilne omarice SOLAR TRACKER in jo pritrdite z 2 izvrtinama iz nerjavečega nerjavnega vijaka 4G x 6 mm.
  3. Vstavite Ardiuno Pro Mini + PCB s 6P glavo v režo v ohišju krmilnika SOLAR TRACKER.
  4. Vstavite pokrov krmilne omarice SOLAR TRACKER v stene krmilne omarice SOLAR TRACKER in jo pritrdite z 2 odklopljenimi samoreznimi vijaki iz nerjavečega jekla 4G x 6 mm.
  5. Pritrdite sklop zgoraj na dno okvirja plošče s 4 izklopljenimi samoreznimi vijaki iz nerjavečega jekla 4G x 6 mm.

5. korak: Priključitev vodila ploščadi na krmilnik

Priključitev vodila ploščadi na krmilnik
Priključitev vodila ploščadi na krmilnik
Priključitev vodila ploščadi na krmilnik
Priključitev vodila ploščadi na krmilnik
Priključitev vodila ploščadi na krmilnik
Priključitev vodila ploščadi na krmilnik

Ustrezne povezave, pripravljene iz prejšnjih navodil, so 4 izključene povezave 2P LDR in 2 izključene povezave 3P iz servomotorjev. Kar je začasno, dokler ni polnjenje pripravljeno, je baterija. Uporabite 3.7V LiPo, ki se zaenkrat konča v 2P DuPont povezavi.

  1. Vstavite povezave LDR (brez polarnosti) od zgoraj:

    1. Zgoraj desno
    2. Zgoraj levo
    3. Spodaj desno
    4. Spodaj levo
  2. Servo priključke (s signalno žico na levi strani) vstavite od zgoraj:

    1. Vodoravno
    2. Navpično
  3. POČAKAJTE DO PRIPRAVLJENOSTI ZA TESTA: Vstavite 3.7V DC napajalni kabel +ve na vrh, -ve na dno.

6. korak: Preizkusite krmilnik

Image
Image

Kot smo že omenili, programska oprema ni optimizirana za potek dela Solar Charging. Lahko pa ga preizkusimo in prilagodimo z uporabo naravnih (sončnih) in nenaravnih virov svetlobe.

Če želite preizkusiti sledenje v nadzorovanem okolju, je morda priročno, da nastavite SLEEP MINUTES na nižjo vrednost (glejte naslednji korak).

Korak 7: Konfiguriranje prek I2C z vnosom konzole

To pojasnjuje konfiguracijo krmilnika prek drugega MCU -ja in vnos nastavitev v okno konzole.

  1. Naložite naslednji skript v D1M WIFI BLOCK (ali Wemos D1 Mini).
  2. Odklopite USB iz računalnika
  3. POVEZAVE PIN: -ve (krmilnik) => GND (D1M)+ve (krmilnik) => 3V3 (D1M) SCL (krmilnik) => D1 (D1M)

    SDA (krmilnik) => D2 (D1M)

  4. Stikalo SPDT obrnite na CONFIG
  5. USB priključite na računalnik
  6. Iz Arduino IDE zaženite okno konzole s pravilnimi vrati COM
  7. Prepričajte se, da sta izbrana »Newline« in »9600 baud«
  8. Ukazi se vnesejo v polje za pošiljanje besedila, nato pa tipka Enter
  9. Ukazi so v obliki bajt znakov bajt
  10. Če drugi bajt (tretji segment) ni vključen, skript pošlje 0 (nič)
  11. Bodite previdni pri uporabi serijskega vhoda; preglejte, kaj ste vnesli, preden pritisnete tipko "Enter". Če ste zaklenjeni (na primer spremenite naslov I2C na vrednost, ki ste jo pozabili), boste morali znova utripati vdelano programsko opremo krmilnika.

Podprte različice prvega znaka ukaza so:

  • E (Omogoči servo sledenje), uporabno za ustavitev gibanja med konfiguracijo. To se vnese z: E 0
  • D (Onemogoči sledenje servo) uporabno za zagon samodejnega sledenja, če ne znova zaženete naprave. To se vnese z: D 0
  • G (Pridobi konfiguracijsko vrednost) bere vrednosti iz EEPROM -a in IN -MEMORY: To se vnese z: G (indeks je veljavna bajtna vrednost 0 - 13 in 15)
  • S (Nastavi vrednost EEPROM) nastavi vrednosti na EEPROM, ki so na voljo po ponovnem zagonu. To se vnese z: S (indeks je veljavna bajtna vrednost 0 - 13, vrednost veljavna bajtna vrednost in se razlikuje glede na lastnost)

Koda je resnica za indekse, vendar se za vodilo do veljavnih vrednosti/komentarjev uporablja naslednje:

  • I2C ADDRESS 0 - podrejeni naslov krmilnika, glavni to potrebuje za komunikacijo s krmilnikom (privzeto 10)
  • MINIMALNI VERTIKALNI KOT 1 - kotna navpična servo spodnja meja (privzeto 10, razpon 0 - 180)
  • MAKSIMALNI VERTIKALNI KOT 2 - kotna navpična servo zgornja meja (privzeto 170, razpon 0 - 180)
  • OBČUTLJIVOST VERTICAL LDR 3 - navpični odčitni rob LDR (privzeto 20, razpon 0 - 1024)
  • KORAK VERTIKALNEGA KOTA 4 - kotni navpični servo koraki pri vsaki nastavitvi (privzeto 5, razpon 1 - 20)
  • MINIMALNI VORIZONTALNI KOT 5 - kotna vodoravna spodnja meja servomotorja (privzeto 10, razpon 0 - 180)
  • MAKSIMALNI VORIZONTALNI KOT 6 - kotna vodoravna servo zgornja meja (privzeto 170, razpon 0 - 180)
  • OBČUTLJIVOST HORIZONTAL LDR 7 - Vodoravni odčitni rob LDR (privzeto 20, razpon 0 - 1024)
  • VODIČNI KOTNI KORAK 8 - kotni vodoravni servo koraki pri vsaki nastavitvi (privzeto 5, razpon 1 - 20)
  • SLEEP MINUTE 9 - približen čas spanja med sledenjem (privzeto 20, razpon 1 - 255)
  • VERTIKALNI ZOR KOT 10 - PRIHODNA UPORABA - navpični kot, na katerega se lahko vrnete, ko sonce zaide
  • VODIČNI ZOR KOT 11 - PRIHODNA UPORABA - vodoravni kot, na katerega se lahko vrnete, ko sonce zaide
  • DAWN INTENSITY 12 - FUTURE UPE - najmanjše povprečje vseh LDR, ki sproži začetek dnevnega sledenja soncu
  • INTENSITY DUSK 13 - FUTURE UPE - najmanjše povprečje vseh LDR, ki sproži konec dnevnega sledenja soncu
  • KONEC ZNAKOV VREDNOSTI EEPROMA 14 - VREDNOST NI UPORABLJENA
  • TRENUTNA INTENZITETA 15 - trenutni povprečni odstotek jakosti svetlobe
  • KONEC MARKERJA VARNOSTI V SPOMINU 16 - VREDNOST NI UPORABLJENA.

Zajame serijski vnos (vnos s tipkovnice v oknu konzole) in ga posreduje pomožnemu I2C v obliki char, byte, byte

#vključi
#defineI2C_MSG_IN_SIZE2
#defineI2C_MSG_OUT_SIZE3
#defineI2C_SLAVE_ADDRESS10
boolean _newData = false;
const byte _numChars = 32;
char _receivedChars [_numChars]; // polje za shranjevanje prejetih podatkov
voidsetup () {
Serial.begin (9600);
Wire.begin (D2, D1);
zamuda (5000);
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
statični bajt ndx = 0;
char endMarker = '\ n';
char rc;
medtem ko (Serial.available ()> 0 && _newData == false) {
rc = Serial.read ();
if (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
if (ndx> = _numChars) {
ndx = _numChars - 1;
}
} drugo {
_receivedChars [ndx] = '\ 0'; // prekinimo niz
ndx = 0;
_newData = res;
}
}
}
voidparseSendCommands () {
if (_newData == true) {
constchar delim [2] = "";
char *žeton;
žeton = strtok (_prejetiChars, delim);
char cmd = _receivedChars [0];
bajtni indeks = 0;
bajtna vrednost = 0;
int i = 0;
while (žeton! = NULL) {
//Serial.println(token);
i ++;
switch (i) {
primer 1:
žeton = strtok (NULL, delim);
indeks = atoi (žeton);
prekiniti;
primer 2:
žeton = strtok (NULL, delim);
if (žeton! = NULL) {
vrednost = atoi (žeton);
}
prekiniti;
privzeto:
žeton = NULL;
}
}
sendCmd (cmd, indeks, vrednost);
_newData = napačno;
}
}
voidsendCmd (char cmd, indeks bajtov, vrednost bajtov) {
Serial.println ("-----");
Serial.println ("Pošiljanje ukaza:");
Serial.println ("\ t" + niz (cmd) + "" + niz (indeks) + "" + niz (vrednost));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // prenesite na napravo
Wire.write (cmd); // pošlje znak
Wire.write (indeks); // pošlje en bajt
Wire.write (vrednost); // pošlje en bajt
Wire.endTransmission ();
bajtni odziv = 0;
bool hadResponse = false;
if (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS, 1);
while (Wire.available ()) // podrejen lahko pošlje manj, kot je zahtevano
{
hadResponse = res;
odziv = Wire.read ();
}
if (hadResponse == true) {
Serial.println ("Pridobivanje odgovora:");
Serial.println (odgovor);
} drugo {
Serial.println ("Ni odziva, preverite naslov/povezavo");
}
}
}

oglejte si rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino, ki ga gosti ❤ GitHub

8. korak: Naslednji koraki

Občasno preverite, ali so v programski/strojni opremi spremembe.

Prilagodite programsko/strojno opremo vašim zahtevam.

Komentirajte vse zahteve/optimizacije.

Priporočena: