Sadržaj:

IOT123 - SOLARNI TRAKER - KONTROLER: 8 koraka
IOT123 - SOLARNI TRAKER - KONTROLER: 8 koraka

Video: IOT123 - SOLARNI TRAKER - KONTROLER: 8 koraka

Video: IOT123 - SOLARNI TRAKER - KONTROLER: 8 koraka
Video: Подключаем гироскоп GY-521 к Ардуино! 2024, Juli
Anonim
Image
Image
IOT123 - SOLARNI TRAKER - UPRAVLJAČ
IOT123 - SOLARNI TRAKER - UPRAVLJAČ
IOT123 - SOLARNI TRAKER - UPRAVLJAČ
IOT123 - SOLARNI TRAKER - UPRAVLJAČ

Ovo je proširenje Instructable -a

IOT123 - SOLARNI TRACKER - TILT/PAN, OKVIR PANELE, LDR MOUNTS RIG. Ovdje se koncentriramo na kontroler servomotora i senzore položaja sunca. Važno je naglasiti da ovaj dizajn pretpostavlja da će se koristiti 2 MCU -a: jedan (3.3V 8mHz Arduino Pro Mini) za solarni tracker i jedan nezavisni MCU za vaše senzore/aktere.

Ovo je verzija 0.3

Umjesto da objavljujem sve projekte nakon potpunog zadovoljstva, vježbat ću kontinuiranu integraciju i češće isporučivati nešto, mijenjajući ono što sam isporučio prema potrebi. Napisaću još jedno uputstvo za punjač baterija, _kad_ je optimizacija softvera/hardvera kontrolera završena. Istaknut ću gdje su potrebne optimizacije dok koračamo kroz ovo.

Dio razloga za ovaj pristup su povratne informacije klijenata. Ako vidite potrebu ili imate bolji pristup, komentirajte, ali imajte na umu da ne mogu sve isporučiti, a možda ni u vremenskom okviru koji vam odgovara. Kako se ova objašnjenja čine manje relevantnima, bit će izbrisana iz ovog članka.

Šta ovo uključuje:

  1. Koristite LDR -ove iz originalnog Instructable -a da osjetite približnu lokaciju sunca.
  2. Pomaknite servo pogone prema suncu.
  3. Opcije za osjetljivost pokreta.
  4. Opcije za veličinu koraka pri kretanju prema suncu.
  5. Opcije za kutna ograničenja koja se koriste na servo pogonima.
  6. Mogućnosti odgode kretanja.
  7. I2C sučelje za postavljanje/dobivanje vrijednosti između MCU -ova.
  8. Duboki san između pokreta.

Ono što ovo ne uključuje (a bit će riješeno kao vrijeme dozvoljava):

  1. Napajanje se koristi samo tokom dnevnih sati.
  2. Sjećajući se zore i odlaska tamo u sumrak.
  3. Uklanjanje regulatora iz MCU -a.
  4. Onemogućavanje LED (ova) na MCU -u.
  5. Preusmjeravanje napajanja putem VCC -a, a ne putem RAW -a.
  6. Pružanje zaobilaznih rješenja za bljeskanje bez reguliranog napajanja s USB -a na serijski TTL pretvarač.
  7. Monitor napona baterije.

ISTORIJA

20. prosinca 2017. V0.1 KOD

Početna verzija prati izvor svjetla, uvijek uključen, bez punjenja

7. siječnja 2018. V0.2 KOD

  • PROMJENE HARDVERA
    • Dodajte I2C igle
    • Dodajte prekidač na servo GND
    • Štampana naljepnica na poklopcu kutije upravljača
  • PROMJENE SOFTVERA
    • Pročitajte konfiguraciju iz EEPROM -a
    • Podrška sabirnice I2C kao rob drugog MCU -a (3,3 V)
    • Postavite konfiguraciju putem I2C
    • Postavka Omogućeno putem I2C
    • Nabavite konfiguraciju putem I2C
    • Nabavite svojstva za vrijeme izvođenja putem I2C (trenutno omogućeno i trenutni intenzitet svjetlosti)
    • Uklonite serijsko bilježenje (utjecalo je na I2C vrijednosti)

19. siječnja 2018. V0.3 KOD

  • HARDVER

    Oznaka ažurirana. Prekidač se sada koristi za odabir načina CONFIG ili TRACK

  • SOFTVER

    • I2C se koristi samo za konfiguraciju
    • Kontroler čeka 5 sekundi prije pokretanja praćenja, omogućava pomicanje ruku
    • Za korištenje I2C konfiguracije, SPDT mora biti na CONFIG -u kao jedinica za podizanje
    • Između praćenja kretanja, jedinica je u načinu dubokog sna za konfiguracijsku vrijednost SLEEP MINUTES (zadano 20 minuta).

Korak 1: Materijali i alati

Materijali i alati
Materijali i alati
Materijali i alati
Materijali i alati
Materijali i alati
Materijali i alati

Sada postoji potpuna lista predloga materijala i izvora.

  1. 3D štampani delovi.
  2. Arduino Pro Mini 3.3V 8mHz
  3. 1 od univerzalne štampane ploče sa dvostrukim bočnim prototipom PCB -a dimenzija 4x6 cm (prerezati na pola)
  4. 1 off 40P muško zaglavlje (za rezanje po veličini).
  5. 1 off žensko zaglavlje od 40P (za rezanje po veličini).
  6. 4 off 10K 1/4W otpornika.
  7. Spojna žica.
  8. Lemljenje i gvožđe.
  9. 20 off samoreznih vijaka od nehrđajuće glave 4G x 6mm.
  10. 4 isključena samorezna vijka od nerđajućeg čelika 4G x 6 mm.
  11. 1 isključeno 3.7V LiPo baterija i držač (završava se 2P dupont konektorima).
  12. 1 isključeno 2P muško pravokutno zaglavlje
  13. 1 isključeno SPDT prekidač 3 -pinski korak 2,54 mm
  14. Jaki cijanoakrilatni ljepilo
  15. Dupont konektori ženski 1P zaglavlje (1 isključeno plavo, 1 isključeno zeleno).

Korak 2: Sastavljanje kruga

Sklapanje kola
Sklapanje kola
Sklapanje kola
Sklapanje kola
Sklapanje kola
Sklapanje kola

Krug trenutno nema krug razdjelnika napona (voltmetar).

  1. Prerežite univerzalnu tiskanu ploču s dvostrukim protokolom PCB -a dimenzija 4x6 cm po dugačkoj osi.
  2. Izrežite muško zaglavlje 40P na komade:

    1. 2 isključeno 12P
    2. 3 isključeno 3P
    3. 6 off 2P.
  3. Izrežite žensko zaglavlje 40P na komade:

    1. 2 isključeno 12P
    2. 1 off 6P
  4. Lemljenje 2 isključeno 12P žensko zaglavlje kao što je prikazano.
  5. Zalijepite odstojnik uklonjen sa 3P muškog (dodatnog) zaglavlja na donju stranu SPDT prekidača cijanoakrilatnim ljepilom
  6. Na drugu stranu zatim lemite 6 isključeno 2P, 2 isključeno 3P žensko zaglavlje i SPDT prekidač kao što je prikazano.
  7. Lemite 4 off 10K otpornika (A, B, C, D crno) preko kabela na GND pin header (#2 crno) i na A0 - A3 pinove zaglavlja (#5, #6, #7, #8) pa kroz rupu (žuto) kao što je prikazano (3 fotografije + 1 dijagram).
  8. Pratite 3.3V iz LDR PINS lemljenja PINS #4, #6, #8, #10 i provucite kroz otvor do VCC pina ženskog zaglavlja (zeleno).
  9. Pratite 3.3V na strani ženskog zaglavlja kao što je prikazano (crveno) lemljenje prema PINS #1, #12, #15.
  10. 3.3V kroz otvor lemljen sa strane (crveno) RAW zaglavlje PIN #1.
  11. Nacrtajte narandžasti priključak od PIN -a 11 kroz otvor do lemljenja Ženski zatik na drugoj strani kao što je prikazano.
  12. Praćenje i lemljenje plave žice za spajanje od #20 do #30 i od #31 do #13 i #16.
  13. PIN za lemljenje ženskog zaglavlja PIN #11 na PIN zaglavlja muškog zaglavlja #11 kroz otvor.
  14. Pripremite 2 dupont konektora dužine 30 mm sa ženskim 1P zaglavljem (1 isključeno plavo, 1 isključeno zeleno). Ogolite i kosite drugi kraj.
  15. Lemljena plava Dupont žica do #28; lemite zelenu žicu Dupont na #29.
  16. Na gornjoj strani Arduina pričvrstite žensko zaglavlje 6P, a zatim lemite.
  17. Na gornjoj strani Arduina pričvrstite 2P žensko zaglavlje pod pravim kutom int #29 i #30, a zatim lemite.
  18. Na donjoj strani Arduina pričvrstite 2 od 12P i 1 isključeni 3P muški zatik, a zatim lemite.
  19. Umetnite Arduino muške 12P pinove u PCB 12P ženske zaglavlje.

Korak 3: Treptanje MCU -a

Treperi MCU
Treperi MCU
Treperi MCU
Treperi MCU
Treperi MCU
Treperi MCU

Arduino Pro Mini prikladno je bljeskati pomoću FTDI232 USB u TTL pretvarača pomoću ženskog zaglavlja 6P. Za poravnanje 2 ploče pogledajte gornju fotografiju.

Uvjerite se da je postavka 3.3V odabrana na vašem FTDI232. Slijedite upute ovdje koristeći donji kod (koristite vezu do GIST -a).

Biblioteka male snage (u prilogu i https://github.com/rocketscream/Low-Power) treba biti instalirana.

Nakon što je Arduino Pro Mini + PCB instaliran u kućište, još uvijek se može bljeskati dok su zaglavlja izložena. Samo odspojite upravljačku jedinicu od okvira ploče otkrivajući zaglavlje.

Solarni tracker sa nagibom sa konfiguracijom I2C/EEPROM i ciklusom spavanja između pokreta. Preciznost trajanja ciklusa spavanja smanjuje se s povećanjem trajanja, ali dovoljna za tu svrhu

/*
* izmijenjeno iz koda
* napisao Mathias Leroy
*
* V0.2 IZMJENE
** I2C SET GET
** EEPROM SET GET
** UKLONITE SERIJSKI IZLAZ - UTICAJEN I2C
** Omogući/onemogući praćenje
** PREMJESTITE USLUGE NA OGRANIČENJA PREKO I2C
** PROČITAJTE TEKUĆI AVG INTENZITET KROZ I2C
* V0.3 IZMJENE
** PREKIDAČ ZA 2 NAČINA - TRAK (NE I2C) i KONFIGURACIJA (KORISTI I2C)
** SPAVAJTE U NAČINU TRAKOVANJA (VRLO NISKA TAČNOST ZBOG 8 DRUGIH DELOVA)
** ODVAJATI/PRIKLJUČITI USLUGE U SPAVANJU/BUĐENJU (TRANSISTOR SE KORISTI DOGOVORNO)
** UKLONITE KONFIGURIRAJUĆI POČETNI POLOŽAJ (ZATVORNO)
** UKLONITE KONFIGURIRANE SEKUNDE BUDENJA (ZATVORNO)
** UKLONITE KONFIGURIRAJNE ENABLE/DISABLE (ZATVORNO)
** UKLJUČENO UKLANJANJE KONFIGURIRANOG TRAKERA (KORISTITE HARDVERSKI PREKIDAČ)
** UKLONITE GOLI NAPON - KORISTIT ĆE ODVOJENU I2C KOMPONENTU
** DODAJTE SERIJSKO ZAPISANJE KADA NE KORISTITE I2C
*/
#include
#include
#include
#include
#include
#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 // prosjek svih LDRS -a
#defineIDX_DUSK_INTENSITY13 // prosjek svih LDRS -a
#defineIDX_END_EEPROM_SET14
#defineIDX_CURRENT_INTENSITY15 // prosjek svih LDRS - koristi se za izračunavanje IDX_DAWN_INTENSITY ambijentalnog ne -direktnog svjetla
#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 ("Konfiguracijski način rada");
Serial.print ("I2C adresa:");
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onReceive (receiveEvent);
Wire.onRequest (requestEvent);
} else {
Serial.println ("Način praćenja");
delay (5000); // vrijeme za izvlačenje ruku ako spojite bateriju itd.
}
}
voidloop ()
{
getLightValues ();
if (! _inConfigMode) {
// ToDo: UKLJUČITE Tranzistorski prekidač
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
za (int i = 0; i <20; i ++) {
if (i! = 0) {
getLightValues ();
}
moveServos ();
}
kašnjenje (500);
_servoH.detach ();
_servoV.detach ();
// ToDo: ISKLJUČITE TRANSISTORSKI PREKIDAČ
kašnjenje (500);
sleepFor ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// --------------------------------- TRENUTNI NAČIN
boolinConfigMode () {
pinMode (PIN_SERVO_H, ULAZ);
_inConfigMode = digitalRead (PIN_SERVO_H) == 1;
return _inConfigMode;
}
// --------------------------------- EEPROM
voidgetFromEeprom () {
ako (
EEPROM.čitano (IDX_SIGN_1)! = 'S' ||
EEPROM.čitano (IDX_SIGN_2)! = 'T' ||
EEPROM.čitano (IDX_SIGN_3)! = EEPROM_VERSION
) EEPROM_write_default_configuration ();
EEPROM_čitana_konfiguracija ();
}
voidEEPROM_write_default_configuration () {
Serial.println ("EEPROM_write_default_configuration");
for (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_čitana_konfiguracija");
for (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
_i2cVals = EEPROM.čitano (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// --------------------------------- I2C
voidreceiveEvent (int count) {
ako (broj == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
indeks bajtova = Wire.read ();
bajtna vrijednost = Wire.read ();
prekidač (cmd) {
case'G ':
if (indeks <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [indeks];
}
break;
slučaj 'S':
if (indeks <IDX_END_EEPROM_SET) {
_i2cVals [indeks] = vrijednost;
EEPROM.update (indeks, _i2cVals [indeks]);
}
break;
zadano:
return;
}
}
}
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 = 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] = mapa (avgIntensity, 0, 1024, 0, 255);
}
// --------------------------------- SERVOS
voidmoveServos () {
Serial.println ("moveServos");
if ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// ide lijevo
Serial.println ("moveServos ide lijevo");
delay (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH--);
delay (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH+_i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {
// ide desno
Serial.println ("moveServos ide lijevo");
delay (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
delay (_servoLoopDelay);
}
}
else {
// ne radeći ništa
Serial.println ("moveServos ne radi ništa");
delay (_slowingDelay);
}
if ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV+_i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// idem gore
Serial.println ("moveServos ide gore");
delay (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
delay (_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {
// ide dolje
Serial.println ("moveServos ide dolje");
delay (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
delay (_servoLoopDelay);
}
}
else {
Serial.println ("moveServos ne radi ništa");
delay (_slowingDelay);
}
}
// --------------------------------- SAN
voidasleepFor (unsignedint osemsekundiSegmenti) {
Serial.println ("sleepFor");
za (bez znaka sleepCounter = sevenSecondSegments; sleepCounter> 0; sleepCounter--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

pogledajte rawtilt_pan_tracker_0.3.ino hostirano sa ❤ od strane GitHub -a

Korak 4: Sklapanje kućišta kruga

Sklapanje kućišta sklopa
Sklapanje kućišta sklopa
Sklapanje kućišta sklopa
Sklapanje kućišta sklopa
Sklapanje kućišta sklopa
Sklapanje kućišta sklopa
  1. Uvjerite se da je Ardiuno Pro Mini umetnut u zaglavlja na PCB -u.
  2. Umetnite bazu kontrolera SOLAR TRACKER -a u zidove kutije kontrolera SOLAR TRACKER -a i pričvrstite sa 2 isključena samorezna vijka od nerđajućeg čelika 4G x 6 mm.
  3. Umetnite Ardiuno Pro Mini + PCB sa 6P Header prorezom u prazninu na bazi kontrolera SOLAR TRACKER.
  4. Umetnite poklopac kutije kontrolera SOLAR TRACKER -a u zidove kutije kontrolera SOLAR TRACKER -a i pričvrstite sa 2 isključena samorezna vijka od nerđajućeg čelika 4G x 6 mm.
  5. Pričvrstite sklop gore na podnožje okvira s 4 isključena samorezna vijka od nerđajućeg čelika 4G x 6 mm.

Korak 5: Priključivanje vodilica opreme na kontroler

Priključivanje vodilica uređaja na kontroler
Priključivanje vodilica uređaja na kontroler
Priključivanje vodilica opreme na kontroler
Priključivanje vodilica opreme na kontroler
Priključivanje vodilica uređaja na kontroler
Priključivanje vodilica uređaja na kontroler

Odgovarajuće veze spremne iz prethodnog Instructable -a su 4 isključene 2P LDR veze i 2 isključene 3P veze sa servo pogona. Ono što je privremeno dok punjenje nije spremno je baterija. Za sada upotrijebite 3,7V LiPo koji završava 2P DuPont vezom.

  1. Umetnite LDR veze (bez polariteta) odozgo:

    1. Gore desno
    2. Na vrhu lijevo
    3. Dolje desno
    4. Dolje lijevo
  2. Umetnite servo veze (sa signalnom žicom lijevo) odozgo:

    1. Horizontalno
    2. Vertikalno
  3. SAČEKAJTE DO SPREMNOSTI ZA TEST: Umetnite 3.7V DC naponski kabel +ve do vrha, -ve do dna.

Korak 6: Testiranje kontrolera

Image
Image

Kao što je ranije rečeno, softver nije optimiziran za tok rada solarnog punjenja. Međutim, može se testirati i podesiti korištenjem prirodnih (sunce) i neprirodnih izvora svjetlosti.

Za testiranje praćenja u kontroliranom okruženju može biti zgodno postaviti SLEEP MINUTES na nižu vrijednost (pogledajte sljedeći korak).

Korak 7: Konfiguriranje putem I2C pomoću unosa na konzoli

Ovo objašnjava konfiguraciju kontrolera putem drugog MCU -a, unošenjem postavki u prozor konzole.

  1. Otpremite sljedeću skriptu na D1M WIFI BLOCK (ili Wemos D1 Mini).
  2. Isključite USB iz računara
  3. PIN VEZE: -ve (kontroler) => GND (D1M)+ve (kontroler) => 3V3 (D1M) SCL (kontroler) => D1 (D1M)

    SDA (kontroler) => D2 (D1M)

  4. Okrenite SPDT prekidač na CONFIG
  5. Priključite USB na računar
  6. Iz Arduino IDE -a pokrenite prozor konzole s ispravnim COM portom
  7. Provjerite jesu li odabrani "Newline" i "9600 baud"
  8. Naredbe se unose u okvir za slanje teksta, a zatim slijedi tipka Enter
  9. Naredbe su u formatu Character byte byte
  10. Ako drugi bajt (treći segment) nije uključen, skripta šalje 0 (nula)
  11. Budite oprezni pri korištenju serijskog unosa; pregledajte ono što ste unijeli prije nego pritisnete tipku "Enter". Ako ste zaključani (na primjer, promijenite I2C adresu na vrijednost koju ste zaboravili), morat ćete ponovo prebaciti firmver kontrolera.

Podržane varijacije u prvom znaku naredbe su:

  • E (Omogući servo praćenje) korisno za zaustavljanje kretanja tijekom konfiguracije. Ovo se unosi pomoću: E 0
  • D (Onemogući servo praćenje) korisno za pokretanje automatskog praćenja ako ne ponovno pokrenete uređaj. Ovo se unosi pomoću: D 0
  • G (Preuzmi konfiguracijsku vrijednost) čita vrijednosti iz EEPROM -a i IN -MEMORY: Ovo se unosi pomoću: G (indeks je važeća vrijednost bajta 0 - 13 i 15)
  • S (Postavi vrijednost EEPROM -a) postavlja vrijednosti na EEPROM koje su dostupne nakon ponovnog pokretanja. Ovo se unosi pomoću: S (indeks je važeća vrijednost bajta 0 - 13, vrijednost je važeća vrijednost bajta i varira po svojstvu)

Kôd je istinita točka za indekse, ali sljedeće se koristi kao vodič za valjane vrijednosti/komentare:

  • I2C ADRESA 0 - adresa pomoćnog regulatora, glavnom je potrebno ovo za komunikaciju s kontrolerom (zadano 10)
  • MINIMALNI VERTIKALNI KUT 1 - donja granica okomitog servo servo servera (zadano 10, raspon 0 - 180)
  • MAKSIMALNI VERTIKALNI KUT 2 - gornja vertikalna granica servo kutnog ugla (zadano 170, raspon 0 - 180)
  • OSJETLJIVOST VERTICAL LDR 3 - Vertikalna margina očitavanja LDR (zadano 20, raspon 0 - 1024)
  • KORAK VERTIKALNOG KUTA 4 - kutni okomiti servo koraci pri svakom podešavanju (zadano 5, raspon 1 - 20)
  • MINIMALNI HORIZONTALNI KUT 5 - donja granica vodoravnog servo servoupravljača (zadano 10, raspon 0 - 180)
  • MAKSIMALNI HORIZONTALNI KUT 6 - gornja vodoravna gornja granica servo servera (zadano 170, raspon 0 - 180)
  • OSJETLJIVOST HORIZONTALNI LDR 7 - Horizontalna margina očitavanja LDR -a (zadano 20, raspon 0 - 1024)
  • HORIZONTALNI KUTNI KORAK 8 - kutni vodoravni servo koraci pri svakom podešavanju (zadano 5, raspon 1 - 20)
  • MINUTE SNA 9 - približni period spavanja između praćenja (zadano 20, raspon 1 - 255)
  • VERTIKALNA ZORA KUT 10 - BUDUĆA UPOTREBA - vertikalni kut za povratak kada sunce zađe
  • HORIZONTALNA ZORA KUT 11 - BUDUĆA UPOTREBA - vodoravni kut za povratak na zalazak sunca
  • ZORNI INTENZITET 12 - BUDUĆA KORIŠTENJA - minimalni prosjek svih LDR -ova koji pokreće početak svakodnevnog praćenja sunca
  • INTENZITET DUSK 13 - BUDUĆA KORIŠTENJA - minimalni prosjek svih LDR -ova koji pokreće prekid dnevnog praćenja sunca
  • KRAJ MARKERA EEPROM VREDNOSTI 14 - VREDNOST SE NE KORISTI
  • TRENUTNI INTENZITET 15 - trenutni prosječni postotak intenziteta svjetlosti
  • ZAVRŠETAK MARKERA VRIJEDNOSTI U PAMĆENJU 16 - VRIJEDNOST SE NE KORISTI.

Snima serijski ulaz (unos sa tastature u prozoru konzole) i prosljeđuje ga na I2C slave u formatu char, byte, byte

#include
#defineI2C_MSG_IN_SIZE2
#defineI2C_MSG_OUT_SIZE3
#defineI2C_SLAVE_ADDRESS10
boolean _newData = false;
const bajt _numChars = 32;
char _receivedChars [_numChars]; // niz za spremanje primljenih podataka
voidsetup () {
Serial.begin (9600);
Wire.begin (D2, D1);
kašnjenje (5000);
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
statički bajt ndx = 0;
char endMarker = '\ n';
char rc;
while (Serial.available ()> 0 && _newData == false) {
rc = Serial.read ();
if (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
if (ndx> = _numChars) {
ndx = _numChars - 1;
}
} else {
_receivedChars [ndx] = '\ 0'; // završava niz
ndx = 0;
_newData = true;
}
}
}
voidparseSendCommands () {
if (_newData == true) {
constchar delim [2] = "";
char *token;
token = strtok (_receivedChars, delim);
char cmd = _receivedChars [0];
bajt indeks = 0;
vrijednost bajta = 0;
int i = 0;
while (token! = NULL) {
//Serial.println(token);
i ++;
prekidač (i) {
slučaj1:
token = strtok (NULL, delim);
indeks = atoi (token);
break;
slučaj 2:
token = strtok (NULL, delim);
if (token! = NULL) {
vrijednost = atoi (token);
}
break;
zadano:
token = NULL;
}
}
sendCmd (cmd, indeks, vrijednost);
_newData = false;
}
}
voidsendCmd (char cmd, indeks bajta, vrijednost bajta) {
Serial.println ("-----");
Serial.println ("Slanje naredbe:");
Serial.println ("\ t" + String (cmd) + "" + String (indeks) + "" + String (vrijednost));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // prenosi na uređaj
Wire.write (cmd); // šalje znak
Wire.write (index); // šalje jedan bajt
Wire.write (vrijednost); // šalje jedan bajt
Wire.endTransmission ();
odgovor bajta = 0;
bool hadResponse = false;
if (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS, 1);
while (Wire.available ()) // slave može poslati manje od traženog
{
hadResponse = true;
response = Wire.read ();
}
if (hadResponse == true) {
Serial.println ("Dobivanje odgovora:");
Serial.println (odgovor);
} else {
Serial.println ("Nema odgovora, provjerite adresu/vezu");
}
}
}

pogledaj rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino hostirano sa ❤ od GitHub -a

Korak 8: Sljedeći koraci

Povremeno se provjeravajte radi provjere promjena u softveru/hardveru.

Prilagodite softver/hardver svojim zahtjevima.

Komentirajte sve zahtjeve/optimizacije.

Preporučuje se: