Sadržaj:

IOT123 - SOLARNI TRAKER - UPRAVLJAČ: 8 koraka
IOT123 - SOLARNI TRAKER - UPRAVLJAČ: 8 koraka

Video: IOT123 - SOLARNI TRAKER - UPRAVLJAČ: 8 koraka

Video: IOT123 - SOLARNI TRAKER - UPRAVLJAČ: 8 koraka
Video: SHARK НАПАДЕНИЯ РАФТ! Ребенок Шон Едят и Застрял в Посреди океана! (FGTEEV геймплей) 2024, Srpanj
Anonim
Image
Image
IOT123 - SOLARNI TRACKER - UPRAVLJAČ
IOT123 - SOLARNI TRACKER - UPRAVLJAČ
IOT123 - SOLARNI TRAKER - UPRAVLJAČ
IOT123 - SOLARNI TRAKER - UPRAVLJAČ

Ovo je proširenje Instructable

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 neovisni MCU za vaše senzore/aktere.

Ovo je verzija 0.3

Umjesto da objavljujem sve projekte nakon potpunog zadovoljstva, prakticirat ću kontinuiranu integraciju i isporučivati nešto češće, mijenjajući ono što sam isporučio prema potrebi. Napisat ć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. Dečki, vidite li 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.

Što to uključuje:

  1. Upotrijebite LDR -ove iz izvornog Instructablea da osjetite približnu lokaciju sunca.
  2. Pomaknite servomotore prema suncu.
  3. Mogućnosti 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 dopušta):

  1. Napajanje se koristi samo tijekom dnevnih sati.
  2. Prisjeć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 RAW -a.
  6. Pružanje zaobilaznih rješenja za bljeskanje bez reguliranog napajanja s USB -a na serijski TTL pretvarač.
  7. Monitor napona baterije.

POVIJEST

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č servo GND -ovima
    • Tiskana naljepnica na poklopcu kutije upravljača
  • PROMJENE SOFTVERA
    • Pročitajte konfiguraciju s EEPROM -a
    • Podrška sabirnice I2C kao rob drugog MCU -a (3,3 V)
    • Postavite konfiguraciju putem I2C
    • Postavite Omogućeno putem I2C
    • Nabavite konfiguraciju putem I2C
    • Nabavite svojstva vremena izvođenja putem I2C (trenutno omogućeno i trenutni intenzitet svjetlosti)
    • Ukloni serijsko bilježenje (utjecalo je na I2C vrijednosti)

19. siječnja 2018. V0.3 KOD

  • HARDVER

    Oznaka je 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, što omogućuje 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 potpuni popis materijala i izvora.

  1. 3D ispisani dijelovi.
  2. Arduino Pro Mini 3.3V 8mHz
  3. 1 od univerzalne tiskane ploče s 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 40P žensko zaglavlje (za rezanje po veličini).
  6. 4 off 10K 1/4W otpornika.
  7. Spojna žica.
  8. Lemljenje i željezo.
  9. 20 off samoreznih vijaka od nehrđajuće glave 4G x 6mm.
  10. 4 isključena samorezna vijka od nehrđ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 -polni razmak 2,54 mm
  14. Jak ljepilo s cijanoakrilatom
  15. Dupont konektori ženski 1P zaglavlje (1 isključeno plavo, 1 isključeno zeleno).

Korak 2: Sastavljanje kruga

Sastavljanje kruga
Sastavljanje kruga
Sastavljanje kruga
Sastavljanje kruga
Sastavljanje kruga
Sastavljanje kruga

Krug trenutno nema krug razdjelnika napona (voltmetar).

  1. Prerežite univerzalnu tiskanu pločicu 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 popusta na 3P
    3. 6 isključeno 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 sklopke ljepilom od cijanoakrilata
  6. Na drugu stranu zatim lemite 6 isključeno 2P, 2 isključeno 3 ž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) zatim kroz rupu (žuta) 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) lemljenjem prema PINS #1, #12, #15.
  10. 3.3V kroz otvor lemljen sa strane (crveno) RAW zaglavlje PIN #1.
  11. Nacrtajte narančasti priključak od PIN -a 11 kroz otvor do lemljenja Ženski zatik s druge strane kao što je prikazano.
  12. Trag za spajanje i lemljenje plave žice za spajanje od #20 do #30 i od #31 do #13 i #16.
  13. Lemljenje ženskog PIN -a zaglavlja #11 na PIN -a muškog zaglavlja #11 kroz otvor.
  14. Pripremite 2 dupont priključka duljine 30 mm sa ženskim 1P zaglavljem (1 isključeno plavo, 1 isključeno zeleno). Očistite i kosite drugi kraj.
  15. Lemiti plavu žicu Dupont na #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 popravite 2P žensko zaglavlje pod pravim kutom int #29 i #30, a zatim lemite.
  18. Na donjoj strani Arduina učvrstite 2 od 12P i 1 off 3P muške igle, 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.

Provjerite je li na vašem FTDI232 odabrana postavka 3,3 V. Slijedite upute ovdje koristeći donji kod (koristite vezu do GIST -a).

Biblioteka niske 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 tragač 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 PUTEM I2C
** PROČITAJTE TRENUTNI AVG INTENZITET KROZ I2C
* V0.3 IZMJENE
** PREKIDAČ ZA 2 NAČINA - TRACK (NO I2C) i CONFIGURE (USES I2C)
** SPAVAJTE U NAČINU TRAKOVANJA (VRLO NISKA TOČNOST ZBOG 8 DRUGIH SKLOPA)
** ODVAJATI/PRIKLJUČITI USLUGE U SANU/BUĐENJU (TRANZISTOR SE KORISTI DOGOVORNO)
** UKLONITE KONFIGURIRAJUĆI POČETNI POLOŽAJ (ZATVORNO)
** UKLONITE KONFIGURIRANE SEKUNDE BUDENJA (ZATVORNO)
** UKLONITE KONFIGURIRAJNE ENABLE/DISABLE (ZATVORENO)
** UKLJUČENO UKLONI KONFIGURIRANI TRACKER (KORISTITE HARDVERSKI PREKIDAČ)
** UKLONITE GOLI NAPON - KORISTIT ĆE ODVOJENU I2C KOMPONENTU
** DODAJTE SERIJSKO PRIJAVLJIVANJE KADA NE KORISTITE I2C
*/
#uključi
#uključi
#uključi
#uključi
#uključ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 // 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čun IDX_DAWN_INTENSITY ambijentalnog, neizravnog 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 _sporingDelay = 0;
int _ugaonikH = 90;
int _ugaoV = 90;
int _averageTop = 0;
int _averageRight = 0;
int _averageBottom = 0;
int _averageLeft = 0;
bajt _i2cResponse = 0;
bool _inConfigMode = netočno;
voidsetup ()
{
Serial.begin (115200);
getFromEeprom ();
if (inConfigMode ()) {{100} {101}
Serial.println ("Način konfiguracije");
Serial.print ("I2C adresa:");
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onReceive (receiveEvent);
Wire.onRequest (requestEvent);
}drugo{
Serial.println ("Način praćenja");
delay (5000); // vrijeme da se sklonite ako spojite bateriju itd.
}
}
voidloop ()
{
getLightValues ();
if (! _inConfigMode) {{100} {101}
// ToDo: UKLJUČITE Tranzistorski prekidač
_servoH.prilog (PIN_SERVO_H);
_servoV.prilog (PIN_SERVO_V);
za (int i = 0; i <20; i ++) {
ako (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_VERZIJA
) EEPROM_write_default_configuration ();
EEPROM_čitana_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 );
}
EEPROM.ažuriranje (IDX_SIGN_1, 'S');
EEPROM.ažuriranje (IDX_SIGN_2, 'T');
EEPROM.ažuriranje (IDX_SIGN_3, EEPROM_VERSION);
}
voidEEPROM_read_configuration () {
Serial.println ("EEPROM_čitana_konfiguracija");
za (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
_i2cVals = EEPROM.čitaj (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// --------------------------------- I2C
voidreceiveEvent (int count) {
ako (broj == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
indeks bajtova = Wire.read ();
vrijednost bajta = Wire.read ();
prekidač (cmd) {
slučaj 'G':
if (indeks <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [indeks];
}
pauza;
slučaj 'S':
if (indeks <IDX_END_EEPROM_SET) {
_i2cVals [indeks] = vrijednost;
EEPROM.update (indeks, _i2cVals [indeks]);
}
pauza;
zadano:
povratak;
}
}
}
voidrequestEvent ()
{
Wire.write (_i2cResponse);
}
// --------------------------------- LDR-ovi
voidgetLightValues () {
int valueTopLeft = analogno čitanje (PIN_LDR_TL);
int valueTopRight = analogRead (PIN_LDR_TR);
int valueBottomRight = analogRead (PIN_LDR_BR);
int valueBottomLeft = analogno čitanje (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] = karta (prosj. Intenzitet, 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);
za (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH--);
kašnjenje (_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);
za (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
kašnjenje (_servoLoopDelay);
}
}
drugo {
// 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]) {
// ići gore
Serial.println ("moveServos ide gore");
delay (_slowingDelay);
za (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
kašnjenje (_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);
za (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
kašnjenje (_servoLoopDelay);
}
}
drugo {
Serial.println ("moveServos ne radi ništa");
delay (_slowingDelay);
}
}
//---------------------------------SPAVATI
voidasleepFor (unsignedint osamsekundiSegmenti) {
Serial.println ("sleepFor");
za (nepotpisani 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: Sastavljanje kućišta kruga

Sastavljanje kućišta kruga
Sastavljanje kućišta kruga
Sastavljanje kućišta kruga
Sastavljanje kućišta kruga
Sastavljanje kućišta kruga
Sastavljanje kućišta kruga
  1. Provjerite je li Ardiuno Pro Mini umetnut u zaglavlja na PCB -u.
  2. Umetnite podnožje upravljačke kutije SOLAR TRACKER u zidove upravljačke kutije SOLAR TRACKER i pričvrstite s 2 isključena samorezna vijka od nehrđajućeg čelika 4G x 6 mm.
  3. Umetnite Ardiuno Pro Mini + PCB sa 6P Header prorezom u prazninu u bazi kontrolera SOLAR TRACKER.
  4. Umetnite poklopac kutije upravljača SOLAR TRACKER u zidove kutije upravljača SOLAR TRACKER i pričvrstite s 2 isključena samorezna vijka od nehrđajućeg čelika 4G x 6 mm.
  5. Pričvrstite sklop iznad na podnožje okvira s 4 isključena samorezna vijka od nehrđajućeg čelika 4G x 6 mm.

Korak 5: Spajanje vodilica uređaja na upravljač

Priključivanje vodilica uređaja na upravljač
Priključivanje vodilica uređaja na upravljač
Spajanje vodilica uređaja na upravljač
Spajanje vodilica uređaja na upravljač
Spajanje vodilica uređaja na upravljač
Spajanje vodilica uređaja na upravljač

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

  1. Umetnite LDR veze (bez polariteta) odozgo:

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

    1. Vodoravno
    2. Okomito
  3. PRIČEKAJTE DO SPREMNOSTI ZA TADA: Umetnite naponski kabel od 3,7 V DC +ve do vrha, -ve do dna.

Korak 6: Testiranje kontrolera

Image
Image

Kao što je već rečeno, softver nije optimiziran za tijek rada solarnog punjenja. Može se testirati i prilagoditi korištenjem prirodnih (sunce) i neprirodnih izvora svjetlosti.

Za testiranje praćenja u kontroliranom okruženju može biti prikladno postaviti MINUTE SLEEPA na nižu vrijednost (vidi 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. Prenesite sljedeću skriptu na D1M WIFI BLOCK (ili Wemos D1 Mini).
  2. Odspojite USB s računala
  3. PRIKLJUČCI PIN-a: -ve (Kontroler) => GND (D1M)+ve (Kontroler) => 3V3 (D1M) SCL (Kontroler) => D1 (D1M)

    SDA (kontroler) => D2 (D1M)

  4. Okrenite SPDT prekidač na CONFIG
  5. Spojite USB na računalo
  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 nakon čega 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 ponovno bljesnuti 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 (Dobivanje konfiguracijske vrijednosti) č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 valjana 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 gornja granica okomitog servo servoa (zadano 170, raspon 0 - 180)
  • OSJETLJIVOST VERTICAL LDR 3 - Vertikalna margina čitanja LDR -a (zadano 20, raspon 0 - 1024)
  • KORAK VERTIKALNOG KUTA 4 - kutni okomiti servo koraci pri svakom podešavanju (zadano 5, raspon 1 - 20)
  • MINIMALNI VORIZONTALNI KUT 5 - kutni vodoravni donji limit servo servera (zadano 10, raspon 0 - 180)
  • MAKSIMALNI HORIZONTALNI KUT 6 - gornja gornja granica vodoravnog servo servera (zadano 170, raspon 0 - 180)
  • OSJETLJIVOST HORIZONTALNI LDR 7 - Vodoravna margina čitanja 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 UPORABA - okomiti kut za povratak na zalazak sunca
  • HORIZONTALNA ZORA KUT 11 - BUDUĆA UPOTREBA - vodoravni kut za povratak na zalazak sunca
  • DAWN INTENSITY 12 - BUDUĆA KORIŠTENJA - minimalni prosjek svih LDR -ova koji pokreće početak dnevnog praćenja sunca
  • INTENZITET SUMRAKA 13 - BUDUĆA KORIŠTENJA - minimalni prosjek svih LDR -ova koji pokreće prekid dnevnog praćenja sunca
  • KRAJ EEPROM VRIJEDNOSTI MARKER 14 - VRIJEDNOST SE NE KORISTI
  • TRENUTNI INTENZITET 15 - trenutni prosječni postotak intenziteta svjetla
  • ZAVRŠETAK MARKERA VRIJEDNOSTI U PAMĆENJU 16 - VRIJEDNOST SE NE KORISTI.

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

#uključi
#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);
Žica.početi (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 = Serijski.čitaj ();
if (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
if (ndx> = _numChars) {{100} {101}
ndx = _numChars - 1;
}
} else {
_receivedChars [ndx] = '\ 0'; // završava niz
ndx = 0;
_newData = istina;
}
}
}
voidparseSendCommands () {
if (_newData == true) {
constchar delim [2] = "";
char *token;
token = strtok (_receivedChars, delim);
char cmd = _receivedChars [0];
indeks bajtova = 0;
vrijednost bajta = 0;
int i = 0;
while (token! = NULL) {
//Serial.println(token);
i ++;
switch (i) {
slučaj 1:
token = strtok (NULL, delim);
indeks = atoi (žeton);
pauza;
slučaj 2:
token = strtok (NULL, delim);
if (token! = NULL) {
vrijednost = atoi (žeton);
}
pauza;
zadano:
token = NULL;
}
}
sendCmd (cmd, indeks, vrijednost);
_newData = lažno;
}
}
voidsendCmd (char cmd, indeks bajta, vrijednost bajta) {
Serial.println ("-----");
Serial.println ("Slanje naredbe:");
Serial.println ("\ t" + niz (cmd) + "" + niz (indeks) + "" + niz (vrijednost));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // prijenos na uređaj
Wire.write (cmd); // šalje char
Wire.write (indeks); // š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 ()) // rob može poslati manje od zahtjeva
{
hadResponse = true;
odgovor = Wire.read ();
}
if (hadResponse == true) {
Serial.println ("Dobivanje odgovora:");
Serial.println (odgovor);
}drugo{
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 izmjena softvera/hardvera.

Izmijenite softver/hardver prema svojim zahtjevima.

Komentirajte sve zahtjeve/optimizacije.

Preporučeni: