Spisu treści:
- Autor John Day [email protected].
- Public 2024-01-30 11:32.
- Ostatnio zmodyfikowany 2025-01-23 15:03.
To jest rozszerzenie Instructable
IOT123 - SOLAR TRACKER - TILT/PAN, PANEL RAMA, LDR MOUNTS RIG. Tutaj skupiamy się na sterowniku serwomechanizmów i czujnikach położenia słońca. Ważne jest, aby podkreślić, że ten projekt zakłada zastosowanie 2 MCU: jeden (3.3V 8mHz Arduino Pro Mini) dla trackera słonecznego i jeden niezależny MCU dla twoich czujników/aktorów.
To jest wersja 0.3
Zamiast publikować wszystkie projekty po pełnej satysfakcji, będę ćwiczyć ciągłą integrację i dostarczać coś częściej, modyfikując to, co dostarczyłem, zgodnie z potrzebami. Napiszę kolejną instrukcję dla ładowarki akumulatora, _kiedy_ optymalizacja oprogramowania/sprzętu kontrolera zostanie zakończona. Wskażę, gdzie potrzebne są optymalizacje, gdy będziemy przez to przechodzić.
Jednym z powodów takiego podejścia są opinie klientów. Jeśli widzicie potrzebę lub macie lepsze podejście, proszę o komentarz, ale pamiętajcie, że nie mogę dostarczyć wszystkiego i prawdopodobnie nie w odpowiednim dla was terminie. Ponieważ te wyjaśnienia wydają się mniej istotne, zostaną usunięte z tego artykułu.
Co to obejmuje:
- Użyj LDR z oryginalnego Instructable, aby wyczuć przybliżoną lokalizację słońc.
- Przesuń serwa w stronę słońca.
- Opcje czułości ruchów.
- Opcje rozmiaru kroku podczas wychodzenia na słońce.
- Opcje ograniczeń kątowych używanych w serwomechanizmach.
- Opcje opóźnień ruchów.
- Interfejs I2C do ustawiania/pobierania wartości między MCU.
- Głęboki sen między ruchami.
Czego to nie obejmuje (i zostanie rozwiązane w miarę możliwości czasu):
- Korzystanie z zasilania tylko w ciągu dnia.
- Zapamiętywanie pozycji świtu i pójście tam o zmierzchu.
- Wyjmowanie regulatora z MCU.
- Wyłączanie diod LED na MCU.
- Przekierowanie zasilania przez VCC zamiast RAW.
- Zapewnienie obejścia dla flashowania bez regulowanego zasilania z konwertera USB na Serial TTL.
- Monitor napięcia akumulatora.
HISTORIA
20 grudnia 2017 V0.1 KOD
Wersja początkowa śledzi źródło światła, zawsze włączone, bez ładowania
7 stycznia 2018 V0.2 KOD
-
ZMIANY SPRZĘTOWE
- Dodaj piny I2C
- Dodaj przełącznik do serwomechanizmu GND
- Drukowana etykieta na konsoli skrzynki sterownika
-
ZMIANY W OPROGRAMOWANIU
- Odczytaj konfigurację z EEPROM
- Obsługa magistrali I2C jako slave do innego MCU (3,3 V)
- Ustaw konfigurację przez I2C
- Ustaw Włączone przez I2C
- Uzyskaj konfigurację przez I2C
- Uzyskaj właściwości środowiska wykonawczego za pośrednictwem I2C (obecnie włączone i natężenie światła bieżącego)
- Usuń logowanie szeregowe (wpłynęło to na wartości I2C)
19 stycznia 2018 V0.3 KOD
-
SPRZĘT KOMPUTEROWY
Zaktualizowano etykietę. Przełącznik jest teraz używany do wyboru trybu CONFIG lub TRACK
-
OPROGRAMOWANIE
- I2C używane tylko do konfiguracji
- Kontroler czeka 5 sekund przed inicjalizacją śledzenia, pozwala na poruszanie rękami
- Aby użyć konfiguracji I2C, SPDT musi być w trybie CONFIG podczas uruchamiania urządzenia
- Pomiędzy śledzeniem ruchu urządzenie znajduje się w trybie głębokiego uśpienia dla wartości konfiguracyjnej MINUT UŚPIENIA (domyślnie 20 minut).
Krok 1: Materiały i narzędzia
Dostępna jest teraz pełna lista materiałów i źródeł.
- Części drukowane w 3D.
- Arduino Pro Mini 3.3V 8mHz
- 1 z 4x6cm dwustronnie prototypowa płytka drukowana uniwersalna płytka drukowana (do przecięcia na pół)
- 1 nagłówek męski 40P (do przycięcia na wymiar).
- 1 nagłówek żeński 40P (do przycięcia na wymiar).
- 4 rezystory 10K 1/4W.
- Podłączyć przewód.
- Lut i żelazo.
- 20 szt. wkrętów samogwintujących ze stali nierdzewnej 4G x 6mm.
- 4 wkręty samogwintujące ze stali nierdzewnej 4G x 6mm.
- 1 szt. baterii LiPo 3,7 V i uchwytu (zakończone w złączach 2P dupont).
- 1 szt. męski nagłówek kątowy 2P
- 1 wyłącznik SPDT 3-stykowy raster 2,54 mm
- Mocny klej cyjanoakrylowy
- Złącza Dupont żeńskie 1P (1 szt. niebieskie, 1 szt. zielone).
Krok 2: Montaż obwodu
Obwód obecnie nie ma obwodu dzielnika napięcia (woltomierz).
- Przetnij dwustronną prototypową płytkę drukowaną 4x6cm na pół na pół wzdłuż długiej osi.
-
Pokrój męski nagłówek 40P na kawałki:
- 2 z 12P
- 3 z 3P
- 6 z 2P.
-
Pokrój żeński nagłówek 40P na kawałki:
- 2 z 12P
- 1 z 6P
- Przylutuj 2 z nagłówka 12Pfemale, jak pokazano.
- Przyklej przekładkę usuniętą z męskiego nagłówka 3P (dodatkowego) na spód przełącznika SPDT za pomocą kleju cyjanoakrylowego
- Z drugiej strony przylutuj 6 szt. 2P, 2 szt. 3Pmęski nagłówek i przełącznik SPDT, jak pokazano.
- Przylutuj 4 rezystory 10K (A, B, C, D czarny) przez przewód do listwy GND (#2 czarny) i do pinów A0 - A3 (#5, #6, #7, #8), a następnie przez otwór (żółty) jak pokazano (3 zdjęcia + 1 schemat).
- Prześledzić 3,3 V z kołków LDR przylutować kołki #4, #6, #8, #10 i przewlec przez otwór do kołka żeńskiego VCC (zielony).
- Śledź 3,3 V po stronie złącza żeńskiego, jak pokazano (czerwony), lutując do STYKÓW #1, #12, #15.
- 3,3V przez otwór lutowany z boku (czerwony) PIN nr 1 nagłówka RAW.
- Śledź pomarańczowe połączenie od PIN #11 przez otwór do lutowania żeńskiego pinu po drugiej stronie, jak pokazano.
- Śledzenie i lutowanie niebieskiego przewodu łączącego od #20 do #30 i od #31 do #13 i #16.
- Przylutuj żeńskie złącze PIN #11 do męskiego złącza PIN #11 przez otwór.
- Przygotuj 2 złącza dupontowe o długości 30 mm z żeńskim nagłówkiem 1P (1 szt. niebieski, 1 szt. zielony). Drugi koniec taśmy i cyny.
- Przylutuj niebieski przewód Dupont do #28; przylutuj zielony drut Dupont do #29.
- W górnej części Arduino zamocuj żeński nagłówek 6P, a następnie przylutuj.
- W górnej części Arduino zamocuj żeński nagłówek kątowy 2P int #29 i #30, a następnie przylutuj.
- Na spodzie Arduino przymocuj 2 piny 12P i 1 pin 3P, a następnie przylutuj.
- Włóż męskie piny Arduino 12P do żeńskich nagłówków PCB 12P.
Krok 3: Flashowanie MCU
Arduino Pro Mini jest wygodnie flashowany za pomocą konwertera FTDI232 USB na TTL przy użyciu żeńskiego złącza 6P. Zobacz zdjęcie powyżej dla wyrównania 2 desek.
Upewnij się, że w twoim FTDI232 wybrano ustawienie 3,3 V. Postępuj zgodnie z instrukcjami, korzystając z poniższego kodu (użyj linku do GIST).
Należy zainstalować bibliotekę lowpower (w załączniku i
Po zainstalowaniu płytki drukowanej Arduino Pro Mini + w obudowie, nadal można ją flashować, ponieważ styki nagłówka są odsłonięte. Wystarczy odłączyć jednostkę sterującą od ramy panelu, odsłaniając nagłówek.
Lokalizator solarny Tilt Pan z konfiguracją I2C/EEPROM i cyklem uśpienia między ruchami. Dokładność czasu trwania cyklu snu zmniejsza się wraz ze wzrostem czasu trwania, ale wystarcza do tego celu
| /* |
| * zmodyfikowany z kodu |
| * autorstwa Mathiasa Leroy |
| * |
| * MODYFIKACJE V0.2 |
| ** ZESTAW I2C POBIERZ |
| ** ZESTAW EEPROM GET |
| ** USUŃ WYJŚCIE SZEREGOWE - USTERKA I2C |
| ** WŁĄCZ / WYŁĄCZ ŚLEDZENIE |
| ** PRZESUŃ SERWA DO LIMITÓW PRZEZ I2C |
| ** ODCZYTAJ AKTUALNĄ ŚREDNĄ INTENSYWNOŚĆ PRZEZ I2C |
| * MODYFIKACJE V0.3 |
| ** PRZEŁĄCZNIK NA 2 TRYBY - ŚCIEŻKA (BEZ I2C) i KONFIGURACJA (UŻYWA I2C) |
| ** UŚPIENIE W TRYBIE TRASOWYM (BARDZO NISKA PRECYZJA ZE WZGLĘDU NA 8 SEKUNDOWYCH KAWAŁKÓW) |
| ** ODŁĄCZ / PODŁĄCZ SERWA PODCZAS UŚPIENIA / WYBUDZENIA (W PRZYPADKU UŻYWANIA TRANZYSTORA) |
| ** USUŃ KONFIGUROWALNĄ POZYCJĘ POCZĄTKOWĄ (NADMIAROWĄ) |
| ** USUŃ KONFIGUROWALNE SEKUNDY WYBUDZANIA (NADMIAROWE) |
| ** USUŃ KONFIGUROWALNE AKTYWNE/NIEAKTYWNE (NADMIAROWE) |
| ** USUŃ KONFIGUROWALNY TRACK WŁĄCZONY (UŻYJ PRZEŁĄCZNIKA SPRZĘTOWEGO) |
| ** USUŃ WZMACNIACZ NAPIĘCIA - BĘDZIE UŻYWAĆ ODDZIELNEGO KOMPONENTU I2C |
| ** DODAJ REJESTROWANIE SZEREGOWE, GDY NIE UŻYWASZ I2C |
| */ |
| #włączać |
| #włączać |
| #włączać |
| #włączać |
| #włączać |
| #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// średnia wszystkich LDRS |
| #defineIDX_DUSK_INTENSITY13// średnia wszystkich LDRS |
| #defineIDX_END_EEPROM_SET14 |
| #defineIDX_CURRENT_INTENSITY15// średnia wszystkich LDRS - używana do obliczania światła otoczenia niebezpośredniego IDX_DAWN_INTENSITY |
| #defineIDX_END_VALUES_GET16 |
| #defineIDX_SIGN_117 |
| #defineIDX_SIGN_218 |
| #defineIDX_SIGN_319 |
| Serwo _serwoH; |
| Serwo _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_kątH = 90; |
| int_kątV = 90; |
| int _averageTop = 0; |
| int _średniaPrawo = 0; |
| int _averageBottom = 0; |
| int _averageLeft = 0; |
| bajt _i2cOdpowiedź = 0; |
| bool _inConfigMode = false; |
| voidsetup() |
| { |
| Serial.początek(115200); |
| pobierzOdEeprom(); |
| if (inConfigMode()){ |
| Serial.println("Tryb konfiguracji"); |
| Serial.print("Adres I2C: "); |
| Serial.println(_i2cVals[IDX_I2C_ADDR]); |
| Wire.begin(_i2cVals[IDX_I2C_ADDR]); |
| Wire.onReceive(odbierzZdarzenie); |
| Wire.onRequest(requestEvent); |
| }w przeciwnym razie{ |
| Serial.println("Tryb śledzenia"); |
| opóźnienie (5000);// czas na usunięcie rąk z drogi, jeśli podłączasz baterię itp. |
| } |
| } |
| pętla pustej() |
| { |
| getLightValues(); |
| jeśli (!_inConfigMode){ |
| // Do zrobienia: WŁĄCZ PRZEŁĄCZNIK TRANZYSTOROWY |
| _servoH.attach(PIN_SERVO_H); |
| _servoV.attach(PIN_SERVO_V); |
| dla (int i = 0; i < 20; i++){ |
| jeśli (i != 0){ |
| getLightValues(); |
| } |
| przesuńSerwa(); |
| } |
| opóźnienie (500); |
| _serwoH.odłącz(); |
| _servoV.detach(); |
| // Do zrobienia: WYŁĄCZ PRZEŁĄCZNIK TRANZYSTOROWY |
| opóźnienie (500); |
| sleepFor((_i2cVals[IDX_SLEEP_MINUTES] * 60) / 8); |
| } |
| } |
| //---------------------------------AKTUALNY TRYB |
| boolinConfigMode(){ |
| pinMode (PIN_SERVO_H, WEJŚCIE); |
| _inConfigMode = digitalRead(PIN_SERVO_H) == 1; |
| return _inConfigMode; |
| } |
| //---------------------------------EEPROM |
| voidgetFromEeprom(){ |
| Jeśli( |
| EEPROM.read(IDX_SIGN_1) != 'S' || |
| EEPROM.read(IDX_SIGN_2) != 'T' || |
| EEPROM.read(IDX_SIGN_3) != EEPROM_VERSION |
| ) EEPROM_write_default_configuration(); |
| EEPROM_konfiguracja_odczytu(); |
| } |
| 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'); |
| Aktualizacja EEPROM (IDX_SIGN_2, 'T'); |
| Aktualizacja EEPROM (IDX_SIGN_3, EEPROM_VERSION); |
| } |
| voidEEPROM_read_configuration(){ |
| Serial.println("Konfiguracja_odczytu_EEPROM"); |
| for (int i = 0; i < IDX_END_EEPROM_SET; i++){ |
| _i2cVals = EEPROM.odczyt(i); |
| //Serial.println(String(i) + " = " + _i2cVals); |
| } |
| } |
| //---------------------------------I2C |
| voidreceiveEvent(liczba int) { |
| jeśli (liczba == I2C_MSG_IN_SIZE) |
| { |
| char cmd = Wire.read(); |
| indeks bajtów = Wire.read(); |
| wartość bajtu = Wire.read(); |
| przełącznik (cmd) { |
| przypadek „G”: |
| if (indeks< IDX_END_VALUES_GET){ |
| _i2cResponse = _i2cVals[indeks]; |
| } |
| przerwa; |
| sprawy': |
| if (indeks< IDX_END_EEPROM_SET){ |
| _i2cVals[indeks] = wartość; |
| EEPROM.update(indeks, _i2cVals[indeks]); |
| } |
| przerwa; |
| domyślny: |
| powrót; |
| } |
| } |
| } |
| voidrequestZdarzenie() |
| { |
| Wire.write(_i2cResponse); |
| } |
| //---------------------------------LDR |
| voidgetLightValues(){ |
| int wartośćTopLeft = analogRead(PIN_LDR_TL); |
| int wartośćTopRight = analogRead(PIN_LDR_TR); |
| int wartośćBottomRight = analogRead(PIN_LDR_BR); |
| int wartośćBottomLeft = analogRead(PIN_LDR_BL); |
| _averageTop = (valueTopLeft + valueTopRight) / 2; |
| _średniaPrawa = (wartośćPrawa górna + wartośćPrawa dolna) / 2; |
| _averageBottom = (wartośćBottomRight + wartośćBottomLeft) / 2; |
| _averageLeft = (wartośćBottomLeft + wartośćTopLeft) / 2; |
| int avgIntensity = (wartośćGóraLeft + wartośćGóraPrawa + wartośćDółPrawo + wartośćDółLeft) / 4; |
| _i2cVals[IDX_CURRENT_INTENSITY] = map(avgIntensity, 0, 1024, 0, 255); |
| } |
| //---------------------------------SERWA |
| voidmoveServos(){ |
| Serial.println("przenieśSerwa"); |
| if ((_averageLeft-_averageRight)>_i2cVals[IDX_H_SENSITIVITY] && (_angleH-_i2cVals[IDX_H_STEP])>_i2cVals[IDX_H_ANGLE_MIN]) { |
| // idąc w lewo |
| Serial.println("moveServos idąc w lewo"); |
| opóźnienie(_slowingDelay); |
| for (int i=0; i < _i2cVals[IDX_H_STEP]; i++){ |
| _servoH.write(_angleH--); |
| opóźnienie(_servoLoopDelay); |
| } |
| } |
| elseif ((_averageRight-_averageLeft)>_i2cVals[IDX_H_SENSITIVITY] && (_angleH+_i2cVals[IDX_H_STEP])<_i2cVals[IDX_H_ANGLE_MAX]) { |
| // idąc w prawo |
| Serial.println("moveServos idąc w lewo"); |
| opóźnienie(_slowingDelay); |
| for (int i=0; i < _i2cVals[IDX_H_STEP]; i++){ |
| _servoH.write(_angleH++); |
| opóźnienie(_servoLoopDelay); |
| } |
| } |
| w przeciwnym razie { |
| // nic nie robić |
| Serial.println("moveServos nic nie robią"); |
| opóźnienie(_slowingDelay); |
| } |
| if ((_averageTop-_averageBottom)>_i2cVals[IDX_V_SENSITIVITY] && (_angleV+_i2cVals[IDX_V_STEP])<_i2cVals[IDX_V_ANGLE_MAX]) { |
| // idąc w górę |
| Serial.println("moveServos rośnie"); |
| opóźnienie(_slowingDelay); |
| for (int i=0; i < _i2cVals[IDX_V_STEP]; i++){ |
| _servoV.write(_angleV++); |
| opóźnienie(_servoLoopDelay); |
| } |
| } |
| elseif ((_averageBottom-_averageTop)>_i2cVals[IDX_V_SENSITIVITY] && (_angleV-_i2cVals[IDX_V_STEP])>_i2cVals[IDX_V_ANGLE_MIN]) { |
| // zejście |
| Serial.println("moveServos spada"); |
| opóźnienie(_slowingDelay); |
| for (int i=0; i < _i2cVals[IDX_V_STEP]; i++){ |
| _servoV.write(_angleV--); |
| opóźnienie(_servoLoopDelay); |
| } |
| } |
| w przeciwnym razie { |
| Serial.println("moveServos nic nie robią"); |
| opóźnienie(_slowingDelay); |
| } |
| } |
| //---------------------------------SPAĆ |
| voidasleepFor(unsignedint eightSecondSegments){ |
| Serial.println("śpiącyDla"); |
| for (unsignedint sleepCounter = osiemSecondSegments; sleepCounter >0; sleepCounter--) |
| { |
| LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); |
| } |
| } |
zobacz rawtilt_pan_tracker_0.3.ino hostowane z ❤ przez GitHub
Krok 4: Montaż obudowy obwodu
- Upewnij się, że Ardiuno Pro Mini jest włożony do nagłówków na płytce drukowanej.
- Włóż podstawę skrzynki sterownika SOLAR TRACKER do ścianek skrzynki sterownika SOLAR TRACKER i przymocuj 2 nierdzewnymi wkrętami samogwintującymi z łbem stożkowym 4G x 6mm.
- Włóż Ardiuno Pro Mini + PCB z gniazdem 6P Header do pustej przestrzeni w podstawie skrzynki sterownika SOLAR TRACKER.
- Włóż pokrywę skrzynki sterownika SOLAR TRACKER do ścianek skrzynki sterownika SOLAR TRACKER i przymocuj 2 nierdzewnymi wkrętami samogwintującymi z łbem stożkowym 4G x 6mm.
- Przymocuj zespół powyżej do podstawy ramy panelu za pomocą 4 samogwintujących wkrętów 4G x 6mm ze stali nierdzewnej.
Krok 5: Podłączanie przewodów rigu do kontrolera
Odpowiednie połączenia gotowe z poprzedniego Instructable to 4 połączenia 2P LDR i 2 połączenia 3P z serw. Tym, co jest tymczasowe, dopóki ładowanie nie będzie gotowe, jest bateria. Użyj na razie LiPo 3,7 V, które kończy się w połączeniu 2P DuPont.
-
Włóż połączenia LDR (bez polaryzacji) od góry:
- W prawym górnym rogu
- U góry z lewej
- Prawy dolny
- Na dole po lewej
-
Włóż połączenia Servo (z przewodem sygnałowym po lewej stronie) od góry:
- Poziomy
- Pionowy
- POCZEKAJ, AŻ GOTOWY DO TESTU NASTĘPNIE: Podłącz przewód zasilający 3,7 V DC +ve do góry, -ve do dołu.
Krok 6: Testowanie kontrolera
Jak wspomniano wcześniej, oprogramowanie nie zostało zoptymalizowane pod kątem przepływu pracy ładowania słonecznego. Można go jednak testować i modyfikować przy użyciu naturalnych (słońce) i nienaturalnych źródeł światła.
Aby przetestować śledzenie w kontrolowanym środowisku, może być wygodne ustawienie MINUT UŚPIENIA na niższą wartość (patrz następny krok).
Krok 7: Konfiguracja przez I2C przy użyciu wejścia konsoli
Wyjaśnia to konfigurowanie kontrolera za pomocą drugiego MCU, wprowadzanie ustawień w oknie konsoli.
- Prześlij następujący skrypt do D1M WIFI BLOCK (lub Wemos D1 Mini).
- Odłącz USB od komputera
-
POŁĄCZENIA PIN:-ve (Kontroler) => GND (D1M)+ve (Kontroler) => 3V3 (D1M)SCL (Kontroler) => D1 (D1M)
SDA (kontroler) => D2 (D1M)
- Ustaw przełącznik SPDT w pozycji CONFIG
- Podłącz USB do komputera
- Z Arduino IDE uruchom okno konsoli z odpowiednim portem COM
- Upewnij się, że wybrano „Nowa linia” i „9600 bodów”
- Polecenia są wprowadzane w polu Wyślij tekst, a następnie klawisz Enter
- Polecenia są w formacie znak bajt bajt
- Jeśli drugi bajt (trzeci segment) nie jest uwzględniony, 0 (zero) jest wysyłane przez skrypt
- Zachowaj ostrożność podczas korzystania z wejścia szeregowego; przejrzyj wprowadzone dane przed naciśnięciem klawisza „Enter”. Jeśli jesteś zablokowany (na przykład zmiana adresu I2C na wartość, o której zapomniałeś), będziesz musiał ponownie sflashować oprogramowanie kontrolera.
Obsługiwane odmiany pierwszego znaku polecenia to:
- E (Włącz śledzenie serwomechanizmu) przydatne do zatrzymywania ruchu podczas konfiguracji. Jest to wprowadzane za pomocą: E 0
- D (Wyłącz śledzenie serwa) przydatne do rozpoczęcia automatycznego śledzenia, jeśli urządzenie nie jest ponownie uruchamiane. Jest to wprowadzane za pomocą: D 0
- G (Get configuration value) odczytuje wartości z EEPROM i IN-MEMORY: To jest wprowadzane za pomocą: G (indeks jest prawidłowymi wartościami bajtów 0 - 13 i 15)
- S (Set EEPROM value) ustawia wartości EEPROM, które są dostępne po ponownym uruchomieniu. Jest to wprowadzane za pomocą: S (indeks jest poprawnymi wartościami bajtów od 0 do 13, wartość jest poprawnymi wartościami bajtów i zmienia się w zależności od właściwości)
Kod jest punktem prawdy dla indeksów, ale poniższy jest używany jako przewodnik dla poprawnych wartości/komentarzy:
- ADRES I2C 0 - adres podrzędny kontrolera, master potrzebuje tego do komunikacji z kontrolerem (domyślnie 10)
- MINIMUM VERTICAL ANGLE 1 - dolna granica pionowego serwomechanizmu kąta (domyślnie 10, zakres 0 - 180)
- MAKSYMALNY KĄT PIONOWY 2 - górny limit kąta pionowego serwa (domyślnie 170, zakres 0 - 180)
- CZUŁOŚĆ PIONOWY LDR 3 - Pionowy margines odczytu LDR (domyślnie 20, zakres 0 - 1024)
- VERTICAL ANGLE STEP 4 - kątowe pionowe kroki serwa przy każdej regulacji (domyślnie 5, zakres 1 - 20)
- MINIMALNY KĄT POZIOMY 5 - dolny limit kąta poziomego serwa (domyślnie 10, zakres 0 - 180)
- MAKSYMALNY KĄT POZIOMY 6 - górna granica serwomechanizmu w poziomie (domyślnie 170, zakres 0 - 180)
- CZUŁOŚĆ POZIOMA LDR 7 - Margines odczytu poziomego LDR (domyślnie 20, zakres 0 - 1024)
- KĄT POZIOMY KROK 8 - poziomy serwomechanizmu pod kątem przy każdej regulacji (domyślnie 5, zakres 1 - 20)
- MINUT UŚPIENIA 9 - przybliżony okres snu między śledzeniem (domyślnie 20, zakres 1 - 255)
- PIONOWY KĄT ŚWITOWY 10 - PRZYSZŁOŚĆ - kąt w pionie, do którego wracamy po zachodzie słońca
- HORYZONTALNY KĄT ŚWIATU 11 - PRZYSZŁOŚĆ - kąt poziomy, do którego wracamy po zachodzie słońca
- INTENSYWNOŚĆ ŚWITU 12 - WYKORZYSTANIE W PRZYSZŁOŚCI - minimalna średnia ze wszystkich wskaźników LDR, która powoduje rozpoczęcie codziennego śledzenia słońca
- INTENSYWNOŚĆ ZMIERZCHU 13 - WYKORZYSTANIE W PRZYSZŁOŚCI - minimalna średnia ze wszystkich wskaźników LDR, która powoduje zakończenie codziennego śledzenia słońca
- KONIEC WARTOŚCI EEPROM ZNACZNIK 14 - WARTOŚĆ NIEUŻYWANA
- NATĘŻENIE PRĄDU 15 - aktualny średni procent natężenia światła
- ZNACZNIK KONIEC WARTOŚCI W PAMIĘCI 16 - WARTOŚĆ NIEUŻYWANA.
Przechwytuje wejście szeregowe (wejście z klawiatury w oknie konsoli) i przekazuje je do urządzenia podrzędnego I2C w formacie char, byte, byte
| #włączać |
| #defineI2C_MSG_IN_SIZE2 |
| #defineI2C_MSG_OUT_SIZE3 |
| #defineI2C_SLAVE_ADDRESS10 |
| wartość logiczna _newData = fałsz; |
| stały bajt _numChars = 32; |
| char _receivedChars[_numChars]; // tablica do przechowywania otrzymanych danych |
| voidsetup() { |
| Serial.początek(9600); |
| Drut.początek(D2, D1); |
| opóźnienie(5000); |
| } |
| voidloop() { |
| recvWithEndMarker(); |
| parseSendCommands(); |
| } |
| voidrecvWithEndMarker() { |
| bajt statyczny ndx = 0; |
| char endMarker = '\n'; |
| char rc; |
| while (Serial.available() >0 && _newData == false) { |
| rc = Serial.odczyt(); |
| if (rc != endMarker) { |
| _otrzymaneZnaki[ndx] = rc; |
| ndx++; |
| if (ndx >= _numChars) { |
| ndx = _numChars - 1; |
| } |
| } w przeciwnym razie { |
| _receivedChars[ndx] = '\0'; // zakończ ciąg |
| ndx = 0; |
| _noweDane = prawda; |
| } |
| } |
| } |
| voidparseSendCommands() { |
| if (_newData == prawda) { |
| constchar delim[2] = ""; |
| char *token; |
| token = strtok(_receivedChars, delim); |
| char cmd = _otrzymaneChars[0]; |
| indeks bajtów = 0; |
| wartość bajtu = 0; |
| int i = 0; |
| while(token != NULL) { |
| //Serial.println(token); |
| i++; |
| przełącznik (i){ |
| przypadek 1: |
| token = strtok(NULL, delim); |
| indeks = atoi(token); |
| przerwa; |
| sprawa2: |
| token = strtok(NULL, delim); |
| if (token != NULL){ |
| wartość = atoi(token); |
| } |
| przerwa; |
| domyślny: |
| token = NULL; |
| } |
| } |
| sendCmd(cmd, indeks, wartość); |
| _noweDane = fałsz; |
| } |
| } |
| voidsendCmd(char cmd, indeks bajtów, wartość bajtu) { |
| Serial.println("-----"); |
| Serial.println("Wysyłanie polecenia:"); |
| Serial.println("\t" + String(cmd) + "" + String(indeks) + "" + String(wartość)); |
| Serial.println("-----"); |
| Wire.beginTransmission(I2C_SLAVE_ADDRESS); // prześlij do urządzenia |
| Wire.write(cmd); // wysyła znak |
| Wire.write(indeks); // wysyła jeden bajt |
| Wire.write(wartość); // wysyła jeden bajt |
| Wire.endTransmission(); |
| odpowiedź bajtu = 0; |
| bool hadResponse = false; |
| jeśli (cmd == 'G'){ |
| Wire.requestFrom(I2C_SLAVE_ADDRESS, 1); |
| while(Wire.available()) // slave może wysłać mniej niż żądano |
| { |
| hadResponse = prawda; |
| odpowiedź = Wire.read(); |
| } |
| if (hadResponse == true){ |
| Serial.println("Otrzymywanie odpowiedzi:"); |
| Serial.println(odpowiedź); |
| }w przeciwnym razie{ |
| Serial.println("Brak odpowiedzi, sprawdź adres/połączenie"); |
| } |
| } |
| } |
zobacz rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino hostowane z ❤ przez GitHub
Krok 8: Kolejne kroki
Sprawdzaj okresowo, aby sprawdzić zmiany oprogramowania/sprzętu.
Dostosuj oprogramowanie/sprzęt do swoich wymagań.
Komentuj wszelkie prośby/optymalizacje.
Zalecana:
Jak zrobić światło słoneczne do ładowania: 8 kroków
Jak zrobić światło słoneczne do ładowania:
Światło słoneczne bez baterii lub słoneczne światło dzienne Dlaczego nie?: 3 kroki
Światło słoneczne bez baterii lub słoneczne światło dzienne… Dlaczego nie?: Witamy. Przepraszam za mój englishDaylight? Słoneczny? Czemu? Mam nieco ciemny pokój w ciągu dnia i muszę włączać światła podczas użytkowania. Zainstaluj światło słoneczne na dzień i na noc (1 pokój): (w Chile) - Panel słoneczny 20 w: 42 USD - Bateria: 15 USD - Solar opłata kont
Obrotowe płyty słoneczne oparte na programie: 9 kroków
Obrotowe płyty słoneczne oparte na programie: Zgodnie z rosnącą populacją i potrzebami potrzebujemy większej wydajności przy mniejszych nakładach. Zaproponowaliśmy programową rotacyjną płytę solarną. Działa zawsze zgodnie z kierunkiem natężenia światła słonecznego. W tym konkursie zaproponowaliśmy specjalny rodzaj
Dekoracja na baterie słoneczne: 7 kroków
Solar Rechargeable Decor: Phoenix Fire Lily: Solarna bateria wielokrotnego ładowania podłączona do migoczącej diody LED wewnątrz sztucznego kwiatu lilii znajdującego się w ręcznie wykonanym drewnianym wazonie
Niesamowity samochód na ogniwa słoneczne: 5 kroków
Niesamowity samochód na ogniwa słoneczne: Witajcie czytelnicy w tej instrukcji, pokażę wam, jak w bardzo łatwy sposób zrobić wyjątkowy samochód na energię słoneczną … Czytaj dalej
