Indholdsfortegnelse:

IOT123 - SOLAR TRACKER - CONTROLLER: 8 trin
IOT123 - SOLAR TRACKER - CONTROLLER: 8 trin

Video: IOT123 - SOLAR TRACKER - CONTROLLER: 8 trin

Video: IOT123 - SOLAR TRACKER - CONTROLLER: 8 trin
Video: IOT123 - SOLAR TRACKER CONTROLLER TEST 0 3 2024, November
Anonim
Image
Image
IOT123 - SOLAR TRACKER - CONTROLLER
IOT123 - SOLAR TRACKER - CONTROLLER
IOT123 - SOLAR TRACKER - CONTROLLER
IOT123 - SOLAR TRACKER - CONTROLLER

Dette er en forlængelse af Instructable

IOT123 - SOLAR TRACKER - TILT/PAN, PANEL RAM, LDR MOUNTS RIG. Her koncentrerer vi os om servoenes controller og sensorer af solens position. Det er vigtigt at påpege, at dette design forudsætter, at der bruges 2 MCU'er: en (3,3V 8mHz Arduino Pro Mini) til solar trackeren og en uafhængig MCU til dine sensorer/aktører.

Dette er version 0.3

I stedet for at offentliggøre alle projekterne efter fuld tilfredshed, vil jeg øve kontinuerlig integration og levere noget oftere og ændre det, jeg har leveret, efter behov. Jeg vil skrive en anden instruerbar til batteriopladeren, _når_ optimeringen af controllersoftwaren/hardwaren er fuldført. Jeg vil påpege, hvor optimeringerne er nødvendige, når vi går igennem dette.

En del af grunden til denne tilgang er klientfeedback. Hvis du ser et behov eller har en bedre tilgang, bedes du kommentere, men husk, at jeg ikke kan levere alt og muligvis ikke til en tidsramme, der passer dig. Da disse forklaringer synes mindre relevante, vil de blive slettet fra denne artikel.

Hvad dette omfatter:

  1. Brug LDR'erne fra den originale Instructable til at mærke solens omtrentlige placering.
  2. Flyt servoerne mod solen.
  3. Muligheder for bevægelsens følsomhed.
  4. Muligheder for trinstørrelsen, når du flytter til solen.
  5. Muligheder for de vinkelbegrænsninger, der bruges på servoerne.
  6. Muligheder for forsinkelser af bevægelserne.
  7. I2C -interface til indstilling/hentning af værdier mellem MCU'er.
  8. Dyb søvn mellem bevægelser.

Hvad dette ikke inkluderer (og vil blive behandlet, når tiden tillader det):

  1. Brug kun strøm i dagslys.
  2. Husker daggrypositionen og gik der i skumringen.
  3. Fjernelse af regulatoren fra MCU'en.
  4. Deaktivering af LED (er) på MCU'en.
  5. Omdirigerer strømmen via VCC frem for RAW.
  6. Tilbyder løsninger til at blinke uden reguleret strøm fra USB til seriel TTL -konverter.
  7. Batterispændingsmonitor.

HISTORIE

20. dec. 2017 V0.1 KODE

Den oprindelige version sporer lyskilden, altid tændt, ingen opladning

7. jan. 2018 V0.2 KODE

  • HARDWARE ÆNDRINGER

    • Tilføj I2C -ben
    • Tilføj switch til servo GND'er
    • Trykt etiket på controller boks fascia
  • SOFTWARE ÆNDRINGER

    • Læs konfiguration fra EEPROM
    • I2C busstøtte som slave til en anden MCU (3.3V)
    • Indstil konfiguration via I2C
    • Indstil aktiveret via I2C
    • Få konfiguration via I2C
    • Få egenskaber for runtime via I2C (aktuelt aktiveret og aktuel lysintensitet)
    • Fjern seriel logning (det påvirkede I2C -værdier)

19. jan. 2018 V0.3 KODE

  • HARDWARE

    Etiket opdateret. Omskifteren bruges nu til at vælge enten CONFIG- eller TRACK -tilstand

  • SOFTWARE

    • I2C bruges kun til konfiguration
    • Controlleren venter 5 sekunder før initialisering af sporing, giver mulighed for at flytte hænder
    • For at bruge I2C -konfiguration skal SPDT være på CONFIG som enhedsstøvler
    • Mellem sporingsbevægelsen er enheden i dyb dvaletilstand for konfigurationsværdien SLEEP MINUTES (standard 20 minutter).

Trin 1: Materialer og værktøjer

Materialer og værktøjer
Materialer og værktøjer
Materialer og værktøjer
Materialer og værktøjer
Materialer og værktøjer
Materialer og værktøjer

Der er nu en fuld liste over materialer og kilder.

  1. 3D -printede dele.
  2. Arduino Pro Mini 3.3V 8mHz
  3. 1 af 4x6cm dobbeltsideprototype PCB universal printkort (skal skæres i halve)
  4. 1 off 40P hanhoved (skal skæres i størrelse).
  5. 1 off 40P kvindelig header (skal skæres i størrelse).
  6. 4 off 10K 1/4W restistorer.
  7. Tilslutningstråd.
  8. Lodde og jern.
  9. 20 off 4G x 6 mm rustfrie pandehoved selvskærende skruer.
  10. 4 off 4G x 6 mm rustfrit forsænket selvskærende skruer.
  11. 1 slukket 3,7V LiPo -batteri og holder (slutter i 2P dupont -stik).
  12. 1 off 2P hanhøjrehoved
  13. 1 off SPDT switch 3 pin 2,54 mm pitch
  14. Kraftig cyanoacrylatlim
  15. Dupont -stik hun 1P header (1 off blue, 1 off green).

Trin 2: Samling af kredsløbet

Montering af kredsløbet
Montering af kredsløbet
Montering af kredsløbet
Montering af kredsløbet
Montering af kredsløbet
Montering af kredsløbet

Kredsløbet har i øjeblikket ikke Voltage Divider Circuit (voltmeter).

  1. Skær 4x6cm dobbeltsideprototype PCB -universelt printkort i halve på tværs af den lange akse.
  2. Skær 40P hanhovedet i stykker:

    1. 2 fra 12P
    2. 3 fra 3P
    3. 6 fra 2P.
  3. Skær 40P hunhovedet i stykker:

    1. 2 fra 12P
    2. 1 fra 6P
  4. Lodde 2 fra 12 Kvindeoverskrift som vist.
  5. Lim afstandsstykket fjernet fra en 3P han (ekstra) header på undersiden af SPDT -kontakten med cyanoacrylatlim
  6. På den anden side skal du derefter lodde 6 fra 2P, 2 fra 3Pmale header og SPDT -kontakten som vist.
  7. Lodde 4 fra 10K modstande (A, B, C, D sort) via ledning til GND pin header (#2 sort) og til A0 - A3 header pins (#5, #6, #7, #8) derefter gennem hul (gul) som vist (3 fotos + 1 diagram).
  8. Spor 3.3V fra LDR PINS lodning PINS #4, #6, #8, #10 og træk hullet til feamale header VCC pin (grøn).
  9. Spor 3.3V på kvindelig overskriftsside som vist (rød) lodning til PINS #1, #12, #15.
  10. 3.3V gennem hul, loddet på siden (rød) RAW header PIN #1.
  11. Spor orange tilslutning fra PIN #11 gennem hul til lodning Kvindestift på den anden side som vist.
  12. Spor og loddet blåt tilslutningstråd fra #20 til #30 og fra #31 til #13 og #16.
  13. Lodde Kvinde Header PIN #11 til Male Header PIN #11 gennem hul.
  14. Forbered 2 dupont -stik 30 mm langt med 1P kvindelig header (1 off blå, 1 off green). Striml og hæld den anden ende.
  15. Loddemetal blå Dupont wire til #28; loddet grønt Dupont wire til #29.
  16. På toppen af Arduino fastgør 6P hunhovedet derefter loddetin.
  17. På toppen af Arduino fastgør 2P retvinklet kvindelig overskrift int #29 og #30 derefter loddetin.
  18. På undersiden af Arduino fastgør du 2 af 12P og 1 off 3P hanstifter og lodder derefter.
  19. Sæt Arduino han 12P pins i PCB 12P hunhoveder.

Trin 3: Blinker MCU'en

Blinker MCU
Blinker MCU
Blinker MCU
Blinker MCU
Blinker MCU
Blinker MCU

Arduino Pro Mini blinker bekvemt ved hjælp af en FTDI232 USB til TTL -konverter ved hjælp af 6P kvindelig header. Se billedet ovenfor for justering af de 2 brædder.

Sørg for, at 3.3V -indstillingen er valgt på din FTDI232. Følg instruktionerne her ved hjælp af koden herunder (brug link til GIST).

Lowpower-biblioteket (vedhæftet og https://github.com/rocketscream/Low-Power) skal installeres.

Når Arduino Pro Mini + PCB er installeret i kabinettet, kan det stadig blinke, når overskriftsstifterne udsættes. Afbryd bare controllerenheden fra panelrammen, hvor hovedet vises.

Tilt pan solar tracker med I2C/EEPROM konfiguration og søvncyklus mellem bevægelser. Søvncyklussens varighed præcision falder, når varigheden øges, men tilstrækkelig til dette formål

/*
* ændret fra kode
* af Mathias Leroy
*
* V0.2 ÆNDRINGER
** I2C SET GET
** EEPROM SET GET
** FJERN SERIALUTGANG - BERØRET I2C
** Aktiver/deaktiveret sporing
** FLYT SERVOS TIL GRÆNSER VIA I2C
** LÆS AKTUEL AVG INTENSITET VIA I2C
* V0.3 ÆNDRINGER
** SKIFT TIL 2 TILSTAND - TRACK (NO I2C) og CONFIGURE (USES I2C)
** SOV I SPORETILSTAND (MEGET LAV PRÆCISION PÅ 8 ANDRE CHUNKS)
** DETACH/SÆT SERVOS PÅ SLEEP/WAKE (TRANSISTOR BRUGES EVENTUELT)
** FJERN KONFIGURERBAR OPGANGSPOSITION (REDUNDANT)
** FJERN KONFIGURERBARE WAKE SECONDS (REDUNDANT)
** FJERN KONFIGURERBAR AKTIVER/Deaktiver (REDUNDANT)
** FJERN KONFIGURERBAR TRACKER AKTIVERET (BRUG HARDWARESKIFT)
** FJERN SPÆNDNINGSGETTER - VIL BRUGE SEPARAT I2C -KOMPONENT
** TILFØJ SERIELOGGING, NÅR I2C IKKE BRUGES
*/
#omfatte
#omfatte
#omfatte
#omfatte
#omfatte
#defineEEPROM_VERSION1
#defineI2C_MSG_IN_SIZE3
#definePIN_LDR_TL A0
#definePIN_LDR_TR A1
#definePIN_LDR_BR A3
#definePIN_LDR_BL A2
#definerePIN_SERVO_V11
#definerePIN_SERVO_H5
#definereIDX_I2C_ADDR0
#definereIDX_V_ANGLE_MIN1
#definereIDX_V_ANGLE_MAX2
#definereIDX_V_SENSITIVITY3
#definereIDX_V_STEP4
#definereIDX_H_ANGLE_MIN5
#definereIDX_H_ANGLE_MAX6
#defineIDX_H_SENSITIVITY7
#definereIDX_H_STEP8
#definereIDX_SLEEP_MINUTES9
#definereIDX_V_DAWN_ANGLE10
#definereIDX_H_DAWN_ANGLE11
#defineIDX_DAWN_INTENSITY12 // gennemsnit af alle LDRS
#defineIDX_DUSK_INTENSITY13 // gennemsnit af alle LDRS
#definereIDX_END_EEPROM_SET14
#defineIDX_CURRENT_INTENSITY15 // gennemsnit af alle LDRS - bruges til at beregne IDX_DAWN_INTENSITY ambiant ikke -direkte lys
#definereIDX_END_VALUES_GET16
#definereIDX_SIGN_117
#definereIDX_SIGN_218
#definereIDX_SIGN_319
Servo _servoH;
Servo _servoV;
byte _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;
byte _i2cResponse = 0;
bool _inConfigMode = falsk;
voidsetup ()
{
Serial.begin (115200);
getFromEeprom ();
hvis (inConfigMode ()) {
Serial.println ("Config Mode");
Serial.print ("I2C -adresse:");
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onReceive (modtageevent);
Wire.onRequest (requestEvent);
}andet{
Serial.println ("Sporingstilstand");
forsinkelse (5000); // tid til at få hænderne af vejen, når batteriet tilsluttes osv.
}
}
voidloop ()
{
getLightValues ();
hvis (! _inConfigMode) {
// ToDo: TÆND FOR TRANSISTORSKIFT
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
for (int i = 0; i <20; i ++) {
hvis (i! = 0) {
getLightValues ();
}
moveServos ();
}
forsinkelse (500);
_servoH.detach ();
_servoV.detach ();
// ToDo: SLUK TRANSISTORSKIFT
forsinkelse (500);
sleepFor ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// --------------------------------- AKTUEL TILSTAND
boolinConfigMode () {
pinMode (PIN_SERVO_H, INPUT);
_inConfigMode = digitalRead (PIN_SERVO_H) == 1;
return _inConfigMode;
}
// --------------------------------- EEPROM
voidgetFromEeprom () {
hvis(
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");
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_read_configuration");
for (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
_i2cVals = EEPROM.read (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// --------------------------------- I2C
voidreceiveEvent (int count) {
hvis (count == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
byte indeks = Wire.read ();
byte værdi = Wire.read ();
switch (cmd) {
case'G ':
hvis (indeks <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [indeks];
}
pause;
sagens:
hvis (indeks <IDX_END_EEPROM_SET) {
_i2cVals [indeks] = værdi;
EEPROM.update (indeks, _i2cVals [indeks]);
}
pause;
Standard:
Vend tilbage;
}
}
}
voidrequestEvent ()
{
Wire.write (_i2cResponse);
}
// --------------------------------- LDR'er
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] = map (avgIntensity, 0, 1024, 0, 255);
}
// --------------------------------- SERVOS
voidmoveServos () {
Serial.println ("moveServos");
hvis ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// gå til venstre
Serial.println ("moveServos går til venstre");
forsinkelse (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH--);
forsinkelse (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH+_i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {
// går rigtigt
Serial.println ("moveServos går til venstre");
forsinkelse (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
forsinkelse (_servoLoopDelay);
}
}
andet {
// laver ingenting
Serial.println ("moveServos gør ingenting");
forsinkelse (_slowingDelay);
}
hvis ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV+_i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// går op
Serial.println ("moveServos går op");
forsinkelse (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
forsinkelse (_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {
// går ned
Serial.println ("moveServos går ned");
forsinkelse (_slowingDelay);
for (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
forsinkelse (_servoLoopDelay);
}
}
andet {
Serial.println ("moveServos gør ingenting");
forsinkelse (_slowingDelay);
}
}
//---------------------------------SØVN
voidasleepFor (unsignedint eightSecondSegments) {
Serial.println ("sleepFor");
for (unsignedint sleepCounter = eightSecondSegments; sleepCounter> 0; sleepCounter--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

se rawtilt_pan_tracker_0.3.ino hostet af ❤ af GitHub

Trin 4: Montering af kredsløbshuset

Montering af kredsløbshus
Montering af kredsløbshus
Montering af kredsløbshus
Montering af kredsløbshus
Montering af kredsløbshus
Montering af kredsløbshus
  1. Sørg for, at Ardiuno Pro Mini er indsat i overskrifterne på printkortet.
  2. Sæt SOLAR TRACKER -controllerboksens base i SOLAR TRACKER -controllerboksens vægge, og fastgør med 2 off 4G x 6mm forsænkede selvskærende skruer.
  3. Sæt Ardiuno Pro Mini + PCB med 6P Header i hullet i SOLAR TRACKER controller box base.
  4. Sæt låget til SOLAR TRACKER -controllerboksen i SOLAR TRACKER -controllerboksens vægge, og fastgør med 2 off 4G x 6 mm selvforsænkende skruer i rustfrit forsænket.
  5. Fastgør forsamlingen ovenfor til bunden af panelrammen med 4 off 4G x 6 mm forsænket selvskærende skruer.

Trin 5: Tilslutning af Rig Leads til controlleren

Tilslutning af Rig Leads til controlleren
Tilslutning af Rig Leads til controlleren
Tilslutning af Rig Leads til controlleren
Tilslutning af Rig Leads til controlleren
Tilslutning af Rig Leads til controlleren
Tilslutning af Rig Leads til controlleren

De relevante forbindelser, der er klar fra den tidligere instruerbare, er 4 fra 2P LDR -forbindelser og 2 fra 3P -forbindelser fra servoerne. Det, der er midlertidigt, indtil opladningen er klar, er batteriet. Brug en 3,7V LiPo, der afsluttes i en 2P DuPont -forbindelse for nu.

  1. Indsæt LDR -forbindelserne (ingen polaritet) ovenfra:

    1. Øverst til højre
    2. Øverst til venstre
    3. Nederst til højre
    4. Nederst til venstre
  2. Indsæt Servo -forbindelserne (med signalkablet til venstre) ovenfra:

    1. Vandret
    2. Lodret
  3. VENT TIL Klar til test derefter: Indsæt 3,7V DC strømkabel +ve til toppen, -ve til bunden.

Trin 6: Test af controlleren

Image
Image

Som tidligere nævnt er softwaren ikke optimeret til Solar Charging workflow. Det kan dog testes og finjusteres ved hjælp af naturlige (sol) og unaturlige lyskilder.

For at teste sporing i et kontrolleret miljø kan det være praktisk at indstille SLEEP MINUTES til en lavere værdi (se næste trin).

Trin 7: Konfiguration via I2C ved hjælp af konsolindgang

Dette forklarer konfiguration af controlleren via en anden MCU, indtastning af indstillinger i et konsolvindue.

  1. Upload følgende script til en D1M WIFI BLOCK (eller Wemos D1 Mini).
  2. Afbryd USB fra pc'en
  3. PIN-TILSLUTNINGER: -ve (Controller) => GND (D1M)+ve (Controller) => 3V3 (D1M) SCL (Controller) => D1 (D1M)

    SDA (controller) => D2 (D1M)

  4. Drej SPDT -kontakten til CONFIG
  5. Tilslut USB til pc
  6. Start et konsolvindue med den korrekte COM -port fra Arduino IDE
  7. Sørg for, at "Newline" og "9600 baud" er valgt
  8. Kommandoerne bliver indtastet i tekstboksen Send efterfulgt af Enter -tasten
  9. Kommandoerne er i formatet Tegnbyte -byte
  10. Hvis den anden byte (tredje segment) ikke er inkluderet, sendes 0 (nul) af scriptet
  11. Vær forsigtig med at bruge seriel input; gennemgå, hvad du har indtastet, inden du trykker på "Enter" -tasten. Hvis du er låst ude (f.eks. Ændring af I2C -adressen til en værdi, du har glemt), skal du blinke controllerens firmware igen.

De understøttede variationer i kommandoens første tegn er:

  • E (Aktiver servosporing) nyttig til at standse bevægelse under konfiguration. Dette indtastes ved hjælp af: E 0
  • D (Deaktiver servosporing) nyttig til at starte automatisk sporing, hvis enheden ikke genstartes. Dette indtastes ved hjælp af: D 0
  • G (Hent konfigurationsværdi) læser værdier fra EEPROM og IN -MEMORY: Dette indtastes ved hjælp af: G (indeks er gyldige byteværdier 0 - 13 og 15)
  • S (Indstil EEPROM -værdi) indstiller værdier til EEPROM, som er tilgængelige efter genstart. Dette indtastes ved hjælp af: S (indeks er gyldige byteværdier 0 - 13, værdien er gyldige byteværdier og varierer pr. Egenskab)

Koden er sandhedens punkt for indekserne, men følgende bruges til en vejledning til gyldige værdier/kommentarer:

  • I2C ADRESSE 0 - controller -slave -adresse, masteren har brug for dette for at kommunikere med controlleren (standard 10)
  • MINIMUM VERTIKAL VINKEL 1 - lodret vinkel på servo nedre grænse (standard 10, område 0 - 180)
  • MAKSIMAL VERTIKAL VINKEL 2 - vertikal vinkel på servo øvre grænse (standard 170, område 0 - 180)
  • SENSITIVITET VERTICAL LDR 3 - Vertikal LDR -læsemargin (standard 20, område 0 - 1024)
  • VERTIKALVINKEL TRIN 4 - lodrette vinkel servotrin ved hver justering (standard 5, område 1 - 20)
  • MINIMUM HORIZONTAL VINKEL 5 - vinkel horisontal servo nedre grænse (standard 10, område 0 - 180)
  • MAKSIMAL HORIZONTAL VINKEL 6 - vandret horisontal servo øvre grænse (standard 170, område 0 - 180)
  • Følsomhed HORIZONTAL LDR 7 - Horisontal LDR -læsemargin (standard 20, område 0 - 1024)
  • HORISONTAL VINKEL TRIN 8 - vandrette horisontale servotrin ved hver justering (standard 5, område 1-20)
  • SLEEP MINUTES 9 - den omtrentlige søvnperiode mellem tracking (standard 20, område 1 - 255)
  • VERTICAL DAWN ANGLE 10 - FREMTIDIG BRUG - den lodrette vinkel at vende tilbage til, når solen går ned
  • HORIZONTAL DAWN ANGLE 11 - FREMTIDIG BRUG - den vandrette vinkel at vende tilbage til når solen går ned
  • DAWN INTENSITY 12 - FREMTIDIG BRUG - minimumsgennemsnittet for alle LDR'er, der udløser en start på daglig solsporing
  • DUSK INTENSITY 13 - FREMTIDIG BRUG - minimumsgennemsnittet for alle LDR'er, der udløser en afslutning på daglig solsporing
  • AFSLUTNING AF EEPROM VÆRDIER MÆRKER 14 - VÆRDI IKKE BRUGT
  • AKTUEL INTENSITET 15 - den aktuelle gennemsnitlige procentdel af lysintensiteten
  • AFSLUT PÅ HUSMÆRKESVÆRDIER MÆRKER 16 - VÆRDI IKKE BRUGT.

Fanger seriel input (tastaturindgang i konsolvinduet) og videresender det til en I2C -slave i formatet char, byte, byte

#omfatte
#defineI2C_MSG_IN_SIZE2
#defineI2C_MSG_OUT_SIZE3
#defineI2C_SLAVE_ADDRESS10
boolsk _newData = falsk;
const byte _numChars = 32;
char _receivedChars [_numChars]; // en matrix til lagring af de modtagne data
voidsetup () {
Serial.begin (9600);
Wire.begin (D2, D1);
forsinkelse (5000);
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
statisk byte ndx = 0;
char endMarker = '\ n';
char rc;
mens (Serial.available ()> 0 && _newData == false) {
rc = Serial.read ();
hvis (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
hvis (ndx> = _numChars) {
ndx = _numChars - 1;
}
} andet {
_receivedChars [ndx] = '\ 0'; // afslut strengen
ndx = 0;
_newData = true;
}
}
}
voidparseSendCommands () {
hvis (_newData == true) {
constchar delim [2] = "";
char *token;
token = strtok (_receivedChars, delim);
char cmd = _receivedChars [0];
byte indeks = 0;
byte værdi = 0;
int i = 0;
mens (token! = NULL) {
//Serial.println(token);
i ++;
skift (i) {
case1:
token = strtok (NULL, delim);
indeks = atoi (token);
pause;
case2:
token = strtok (NULL, delim);
hvis (token! = NULL) {
værdi = atoi (token);
}
pause;
Standard:
token = NULL;
}
}
sendCmd (cmd, indeks, værdi);
_newData = falsk;
}
}
voidsendCmd (char cmd, byte indeks, byte værdi) {
Serial.println ("-----");
Serial.println ("Sender kommando:");
Serial.println ("\ t" + streng (cmd) + "" + streng (indeks) + "" + streng (værdi));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // overføre til enhed
Wire.write (cmd); // sender en forkælelse
Wire.write (indeks); // sender en byte
Wire.write (værdi); // sender en byte
Wire.endTransmission ();
bytesvar = 0;
bool hadResponse = false;
hvis (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS, 1);
mens (Wire.available ()) // slave kan sende mindre end ønsket
{
hadResponse = true;
svar = Wire.read ();
}
hvis (hadResponse == true) {
Serial.println ("Få svar:");
Serial.println (svar);
}andet{
Serial.println ("Intet svar, tjek adressen/forbindelsen");
}
}
}

se rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino hostet med ❤ af GitHub

Trin 8: Næste trin

Tjek regelmæssigt tilbage for at kontrollere, om der er ændringer i software/hardware.

Rediger softwaren/hardwaren til dine krav.

Kommenter eventuelle anmodninger/optimeringer.

Anbefalede: