Talaan ng mga Nilalaman:

IOT123 - SOLAR TRACKER - CONTROLLER: 8 Hakbang
IOT123 - SOLAR TRACKER - CONTROLLER: 8 Hakbang

Video: IOT123 - SOLAR TRACKER - CONTROLLER: 8 Hakbang

Video: IOT123 - SOLAR TRACKER - CONTROLLER: 8 Hakbang
Video: IOT123 - SOLAR TRACKER CONTROLLER TEST 0 3 2024, Hulyo
Anonim
Image
Image
IOT123 - SOLAR TRACKER - CONTROLLER
IOT123 - SOLAR TRACKER - CONTROLLER
IOT123 - SOLAR TRACKER - CONTROLLER
IOT123 - SOLAR TRACKER - CONTROLLER

Ito ay isang extension ng Instructable

IOT123 - SOLAR TRACKER - TILT / PAN, PANEL FRAME, LDR MOUNTS RIG. Dito nakatuon kami sa controller ng servos, at mga sensor ng posisyon ng araw. Mahalagang ituro na ang disenyo na ito ay ipinapalagay na 2 MCUs ang gagamitin: isa (3.3V 8mHz Arduino Pro Mini) para sa solar tracker, at isang independiyenteng MCU para sa iyong mga sensor / aktor.

Ito ang Bersyon 0.3

Sa halip na mai-publish ang lahat ng mga proyekto pagkatapos ng kumpletong kasiyahan, magsasanay ako ng tuluy-tuloy na pagsasama at maghatid ng isang bagay nang mas madalas, binabago kung ano ang naihatid ko na kailangan ko. Magsusulat ako ng isa pang itinuturo para sa charger ng baterya, _kapag_ ang pag-optimize ng software ng software / hardware ay kumpleto. Ituturo ko kung saan kinakailangan ang mga pag-optimize sa hakbang namin dito.

Bahagi ng dahilan para sa pamamaraang ito ay ang feedback ng kliyente. Kung nakikita mo ang isang pangangailangan o may isang mas mahusay na diskarte, mangyaring magkomento, ngunit tandaan na hindi ko maihahatid ang lahat at posibleng hindi sa isang time-frame na nababagay sa iyo. Tulad ng mga paliwanag na ito tila hindi gaanong nauugnay ang mga ito ay tatanggalin mula sa artikulong ito.

Ano ang kasama dito:

  1. Gamitin ang mga LDR mula sa orihinal na Maaaring turuan upang maunawaan ang mga lokasyon ng suns.
  2. Gawin ang servos upang harapin ang araw.
  3. Mga pagpipilian para sa pagiging sensitibo ng mga paggalaw.
  4. Mga pagpipilian para sa laki ng hakbang kapag lumilipat sa araw.
  5. Mga pagpipilian para sa mga angular na hadlang na ginagamit sa mga servos.
  6. Mga pagpipilian para sa pagkaantala ng mga paggalaw.
  7. I2C interface para sa pagtatakda / pagkuha ng mga halaga sa pagitan ng mga MCU.
  8. Malalim na pagtulog sa pagitan ng mga paggalaw.

Ano ang hindi kasama rito (at bibigyan ng hinahayaan ng oras):

  1. Gumagamit lamang ng kuryente sa mga oras ng liwanag ng araw.
  2. Naaalala ang posisyon ng bukang-liwayway at pagpunta doon sa pagsasara ng dapit-hapon.
  3. Inaalis ang regulator mula sa MCU.
  4. Hindi pagpapagana ng (mga) LED sa MCU.
  5. Routouting ang kapangyarihan sa pamamagitan ng VCC sa halip na RAW.
  6. Ang pagbibigay ng mga workaround para sa flashing nang walang kinokontrol na lakas mula sa USB patungo sa Serial TTL converter.
  7. Monitor ng boltahe ng baterya.

KASAYSAYAN

Dis 20, 2017 V0.1 CODE

Sinusubaybayan ng paunang bersyon ang ilaw na mapagkukunan, palaging naka-on, walang singilin

Ene 7, 2018 V0.2 CODE

  • PAGBABAGO NG HARDWARE

    • Magdagdag ng I2C pin
    • Magdagdag ng switch sa servo GNDs
    • Naka-print na Label sa kahon ng fascia ng fascia
  • PAGBABAGO NG SOFTWARE

    • Basahin ang pagsasaayos mula sa EEPROM
    • Suporta ng I2C bus bilang alipin ng ibang MCU (3.3V)
    • Itakda ang pagsasaayos sa pamamagitan ng I2C
    • Itakda ang Pinagana sa pamamagitan ng I2C
    • Kumuha ng pagsasaayos sa pamamagitan ng I2C
    • Kumuha ng mga pag-aari ng runtime sa pamamagitan ng I2C (kasalukuyang Pinagana, at Kasalukuyang Lakas ng Intensity)
    • Alisin ang serial logging (naapektuhan ang mga halagang I2C)

Ene 19, 2018 V0.3 CODE

  • HARDWARE

    Nai-update ang label. Ginagamit na ngayon ang switch upang pumili ng alinman sa CONFIG o TRACK mode

  • SOFTWARE

    • Ginamit lang ang I2C para sa pagsasaayos
    • Naghihintay ang Controller ng 5 segundo bago simulan ang pagsubaybay, pinapayagan ang paglipat ng mga kamay
    • Upang magamit ang pagsasaayos ng I2C, ang SPDT ay dapat na nasa CONFIG bilang mga unit boots
    • Sa pagitan ng paggalaw ng pagsubaybay, ang unit ay nasa malalim na mode ng pagtulog para sa halaga ng pagsasaayos na Tulog na MINUTES (default na 20 minuto).

Hakbang 1: Mga Materyales at Tool

Mga Kagamitan at Kasangkapan
Mga Kagamitan at Kasangkapan
Mga Kagamitan at Kasangkapan
Mga Kagamitan at Kasangkapan
Mga Kagamitan at Kasangkapan
Mga Kagamitan at Kasangkapan

Mayroon na ngayong isang buong listahan ng Mga Materyal at Mga Pinagmulan.

  1. Mga naka-print na bahagi ng 3D.
  2. Arduino Pro Mini 3.3V 8mHz
  3. 1 ng 4x6cm Double Side Prototype PCB Universal Printed Circuit Board (upang putulin sa kalahati)
  4. 1 off 40P male header (upang i-cut sa laki).
  5. 1 sa 40P babaeng header (upang i-cut sa laki).
  6. 4 off 10K 1 / 4W restistors.
  7. Hookup wire.
  8. Maghinang at bakal.
  9. 20 off 4G x 6mm stainless pan head self tapping screws.
  10. 4 off 4G x 6mm hindi kinakalawang na countersunk na self-tapping screws.
  11. 1 off 3.7V LiPo na baterya at may hawak (tinatapos sa 2P dupont konektor).
  12. 1 off 2P male kanang anggulo header
  13. 1 off SPDT switch 3 pin 2.54mm pitch
  14. Malakas na pandikit na Cyanoacrylate
  15. Mga konektor ng Dupont na babaeng 1P header (1 off blue, 1 off green).

Hakbang 2: Pag-iipon ng Circuit

Pag-iipon ng Circuit
Pag-iipon ng Circuit
Pag-iipon ng Circuit
Pag-iipon ng Circuit
Pag-iipon ng Circuit
Pag-iipon ng Circuit

Ang circuit ay kasalukuyang walang Voltage Divider Circuit (volt meter).

  1. Gupitin ang 4x6cm Double Side Prototype PCB Universal Printed Circuit Board sa kalahati sa buong axis.
  2. Gupitin ang 40P male header sa mga piraso:

    1. 2 off 12P
    2. 3 off 3P
    3. 6 off 2P.
  3. Gupitin ang 40P babaeng header sa mga piraso:

    1. 2 off 12P
    2. 1 off 6P
  4. Solder 2 off 12Pfemale header tulad ng ipinakita.
  5. Kola ang spacer na tinanggal mula sa isang 3P male (karagdagang) header papunta sa ilalim ng SPDT Switch na may Cyanoacrylate glue
  6. Sa kabilang panig lugar pagkatapos ay maghinang 6 off 2P, 2 off 3Pmale header at ang SPDT switch tulad ng ipinakita.
  7. Solder 4 off 10K resistors (A, B, C, D black) sa pamamagitan ng lead sa GND pin header (# 2 black) at sa A0 - A3 header pin (# 5, # 6, # 7, # 8) pagkatapos ay sa pamamagitan ng hole (dilaw) tulad ng ipinapakita (3 mga larawan + 1 diagram).
  8. Subaybayan ang 3.3V mula sa LDR PINS na soldering PINS # 4, # 6, # 8, # 10 at thread kahit na butas sa feamale header VCC pin (berde).
  9. Subaybayan ang 3.3V sa babaeng bahagi ng header tulad ng ipinakita (pula) na paghihinang sa PINS # 1, # 12, # 15.
  10. 3.3V sa pamamagitan ng butas ng soldered sa gilid (pula) RAW header PIN # 1.
  11. Subaybayan ang kahel na hookup mula sa PIN # 11 hanggang butas hanggang sa maghinang na Babae na pin sa kabilang panig tulad ng ipinakita.
  12. Subaybayan at maghinang asul na hookup wire mula # 20 hanggang # 30 at mula # 31 hanggang # 13 at # 16.
  13. Solder Babae Header PIN # 11 hanggang Male Header PIN # 11 hanggang butas.
  14. Maghanda ng 2 dupont konektor na 30mm ang haba na may babaeng 1P header (1 off blue, 1 off green). Strip at lata iba pang mga dulo.
  15. Solder blue Dupont wire sa # 28; solder green Dupont wire sa # 29.
  16. Sa tuktok ng Arduino ayusin ang 6P babaeng header pagkatapos ng panghinang.
  17. Sa tuktok ng Arduino ayusin ang 2P tamang anggulo ng babaeng header int # 29 at # 30 pagkatapos ng panghinang.
  18. Sa ilalim ng Arduino ayusin ang 2 ng 12P at 1 off 3P male pin pagkatapos maghinang.
  19. Ipasok ang Arduino male 12P pins sa PCB 12P na mga header ng babae.

Hakbang 3: Flashing ang MCU

Flashing ang MCU
Flashing ang MCU
Flashing ang MCU
Flashing ang MCU
Flashing ang MCU
Flashing ang MCU

Ang Arduino Pro Mini ay madaling i-flash gamit ang isang FTDI232 USB sa TTL converter gamit ang 6P na babaeng header. Tingnan ang larawan sa itaas para sa pagkakahanay ng 2 board.

Tiyaking napili ang setting ng 3.3V sa iyong FTDI232. Sundin ang mga tagubilin dito gamit ang code sa ibaba (gumamit ng link sa GIST).

Ang librong lowpower (nakakabit at https://github.com/rocketscream/Low-Power) ay kailangang mai-install.

Kapag ang Arduino Pro Mini + PCB ay naka-install sa pambalot maaari pa rin itong mai-flash habang ang mga header pin ay nakalantad. Idiskonekta lamang ang Controller Unit mula sa Panel Frame na inilalantad ang header.

Ikiling ang pan solar tracker na may pagsasaayos ng I2C / EEPROM at cycle ng pagtulog sa pagitan ng mga paggalaw. Ang katumpakan ng tagal ng ikot ng pagtulog ay nababawasan habang tumataas ang tagal, ngunit sapat para sa hangaring ito

/*
* binago mula sa code
* ni Mathias Leroy
*
* Mga Pagbabago ng V0.2
** KUMUHA NG I2C
** Kumuha ng EEPROM SET
** TANGGALIN ANG SERIAL OUTPUT - NAapektuhan ang I2C
** I-ENABLE / DISABLE TRACKING
** ilipat ang SERVOS SA LIMITS VIA I2C
** BASAHIN ANG CURRENT AVG INTENSITY VIA I2C
* Mga Pagbabago ng V0.3
** SWITCH FOR 2 MODES - TRACK (NO I2C) at CONFIGURE (Gumagamit ng I2C)
** TULOG SA MODYANG TRACK (NAPAKABABANG PRESISYON DAHIL SA 8 IKALAWANG CHUNKS)
** DETACH / Attach SERVOS ON TULOG / WAKE (TRANSISTOR USED EVENTUALLY)
** TANGGALIN ANG KONFIGURABLE INITIAL POSITION (REDUNDANT)
** TANGGALIN ANG CONFIGURABLE WAKE SECONDS (REDUNDANT)
** TANGGALIN ANG KONFIGURABEL NA PAGHANGGANG / Hindi paganahin (REDUNDANT)
** TANGGALIN ANG KONFIGURABLE TRACKER NA NAKA-ENGLARO (GAMITIN ANG HARDWARE SWITCH)
** TANGGALIN ANG VOLTAGE GETTER - GAGAMITIN ANG Hiwalay na I2C COMPONENT
** Magdagdag NG SERIAL LOGGING KUNG HINDI GAMIT NG I2C
*/
# isama
# isama
# isama
# isama
# isama
# kahuluganEEPROM_VERSION1
# kahuluganI2C_MSG_IN_SIZE3
#definePIN_LDR_TL A0
#definePIN_LDR_TR A1
#definePIN_LDR_BR A3
#definePIN_LDR_BL A2
# kahuluganPIN_SERVO_V11
# kahuluganPIN_SERVO_H5
# kahuluganIDX_I2C_ADDR0
# kahuluganIDX_V_ANGLE_MIN1
# kahuluganIDX_V_ANGLE_MAX2
# kahuluganIDX_V_SENSITIVITY3
# kahuluganIDX_V_STEP4
# kahuluganIDX_H_ANGLE_MIN5
# kahuluganIDX_H_ANGLE_MAX6
# kahuluganIDX_H_SENSITIVITY7
# kahuluganIDX_H_STEP8
# kahuluganIDX_SLEEP_MINUTES9
# kahuluganIDX_V_DAWN_ANGLE10
# kahuluganIDX_H_DAWN_ANGLE11
# kahuluganIDX_DAWN_INTENSITY12 // average ng lahat ng LDRS
# kahuluganIDX_DUSK_INTENSITY13 // average ng lahat ng LDRS
# kahuluganIDX_END_EEPROM_SET14
# kahuluganIDX_CURRENT_INTENSITY15 // average ng lahat ng LDRS - ginamit para sa pagkalkula ng IDX_DAWN_INTENSITY ambisyenteng hindi direktang ilaw
# kahuluganIDX_END_VALUES_GET16
# kahuluganIDX_SIGN_117
# kahuluganIDX_SIGN_218
# kahuluganIDX_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 = false;
voidsetup ()
{
Serial.begin (115200);
getFromEeprom ();
kung (inConfigMode ()) {
Serial.println ("Config Mode");
Serial.print ("I2C Address:");
Serial.println (_i2cVals [IDX_I2C_ADDR]);
Wire.begin (_i2cVals [IDX_I2C_ADDR]);
Wire.onReceive (acceptEvent);
Wire.onRequest (requestEvent);
} iba pa {
Serial.println ("Mode sa Pagsubaybay");
antala (5000); // oras upang mawala sa kamay ang mga kamay kung ikonekta ang baterya atbp.
}
}
voidloop ()
{
getLightValues ();
kung (! _inConfigMode) {
// ToDo: TURN ON TRANSISTOR SWITCH
_servoH.attach (PIN_SERVO_H);
_servoV.attach (PIN_SERVO_V);
para sa (int i = 0; i <20; i ++) {
kung (i! = 0) {
getLightValues ();
}
ilipatServos ();
}
pagkaantala (500);
_servoH.detach ();
_servoV.detach ();
// ToDo: TURN OFF TRANSISTOR SWITCH
pagkaantala (500);
tulogFor ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8);
}
}
// ----------------- CURRENT MODE
boolinConfigMode () {
pinMode (PIN_SERVO_H, INPUT);
_inConfigMode = digitalRead (PIN_SERVO_H) == 1;
ibalik _inConfigMode;
}
// ----------------- EEPROM
voidgetFromEeprom () {
kung (
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");
para sa (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");
para sa (int i = 0; i <IDX_END_EEPROM_SET; i ++) {
_i2cVals = EEPROM.read (i);
//Serial.println(String(i) + "=" + _i2cVals );
}
}
// ----------------- I2C
voidreceiveEvent (int count) {
kung (bilangin == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read ();
byte index = Wire.read ();
byte halaga = Wire.read ();
switch (cmd) {
case'G ':
kung (index <IDX_END_VALUES_GET) {
_i2cResponse = _i2cVals [index];
}
pahinga;
kaso'S ':
kung (index <IDX_END_EEPROM_SET) {
_i2cVals [index] = halaga;
EEPROM.update (index, _i2cVals [index]);
}
pahinga;
default:
bumalik;
}
}
}
voidrequestEvent ()
{
Wire.write (_i2cResponse);
}
// ------------------------------- LDRs
voidgetLightValues () {
int halagaTopLeft = analogRead (PIN_LDR_TL);
int halagaTopRight = analogRead (PIN_LDR_TR);
int halagaBottomRight = analogRead (PIN_LDR_BR);
int halagaBottomLeft = 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");
kung ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) {
// aalis
Serial.println ("ilipat angServos pakaliwa");
pagkaantala (_slowingDelay);
para sa (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH--);
antala (_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH + _i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) {
// pagpunta sa kanan
Serial.println ("ilipat angServos pakaliwa");
pagkaantala (_slowingDelay);
para sa (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) {
_servoH.write (_angleH ++);
antala (_servoLoopDelay);
}
}
iba pa {
// walang ginagawa
Serial.println ("moveServos doing nothing");
pagkaantala (_slowingDelay);
}
kung ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV + _i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) {
// pataas
Serial.println ("ilipat ang mgaServos");
antala (_slowingDelay);
para sa (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV ++);
antala (_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) {
// pababa
Serial.println ("ilipat angServos pababa");
antala (_slowingDelay);
para sa (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) {
_servoV.write (_angleV--);
antala (_servoLoopDelay);
}
}
iba pa {
Serial.println ("moveServos doing nothing");
pagkaantala (_slowingDelay);
}
}
// ----------------- TULOG
voidasleepFor (unsignedint eightSecondSegments) {
Serial.println ("tulogFor");
para sa (unsignedint sleepCounter = eightSecondSegments; sleepCounter> 0; sleepCounter--)
{
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

tingnan ang rawtilt_pan_tracker_0.3.ino naka-host sa ❤ ng GitHub

Hakbang 4: Pag-iipon ng Circuit Casing

Pag-iipon ng Circuit Casing
Pag-iipon ng Circuit Casing
Pag-iipon ng Circuit Casing
Pag-iipon ng Circuit Casing
Pag-iipon ng Circuit Casing
Pag-iipon ng Circuit Casing
  1. Tiyaking ang Ardiuno Pro Mini ay naipasok sa mga header sa PCB.
  2. Ipasok ang base ng kahon ng controller ng SOLAR TRACKER sa SOLAR TRACKER na pader ng kahon ng controller at lagyan ng 2 off 4G x 6mm na hindi kinakalawang na countersunk na self-t-turnilyo.
  3. Ipasok ang Ardiuno Pro Mini + PCB na may 6P Header slotting sa walang bisa sa SOLAR TRACKER controller box base.
  4. Ipasok ang SOLAR TRACKER controller box na takip sa SOLAR TRACKER controller box wall at lagyan ng 2 off 4G x 6mm stainless countersunk self tapping screws.
  5. Magkabit ng pagpupulong sa itaas sa base ng Panel Frame na may 4 na 4G x 6mm na hindi kinakalawang na countersunk na self-tapping screws.

Hakbang 5: Ang pagkonekta sa Rig ay humahantong sa Controller

Ang pagkonekta sa Rig ay humahantong sa Controller
Ang pagkonekta sa Rig ay humahantong sa Controller
Ang pagkonekta sa Rig ay humahantong sa Controller
Ang pagkonekta sa Rig ay humahantong sa Controller
Ang pagkonekta sa Rig ay humahantong sa Controller
Ang pagkonekta sa Rig ay humahantong sa Controller

Ang mga nauugnay na koneksyon ay handa na mula sa nakaraang Instructable, ay 4 off 2P LDR na koneksyon at 2 off 3P na koneksyon mula sa servos. Ang pansamantala hanggang handa na ang recharging ay ang baterya. Gumamit ng isang 3.7V LiPo na nagtatapos sa isang koneksyon ng 2P DuPont sa ngayon.

  1. Ipasok ang mga koneksyon sa LDR (walang polarity) mula sa itaas:

    1. Nangungunang Kanan
    2. Nangungunang Kaliwa
    3. Ibabang Kanan
    4. Babang kaliwa
  2. Ipasok ang mga koneksyon ng Servo (gamit ang signal wire sa kaliwa) mula sa itaas:

    1. Pahalang
    2. Patayo
  3. HUMANDA HANGANG HANDA SA PAGSUSULIT DALO: Ipasok ang 3.7V DC Power lead + ve sa tuktok, -ve hanggang sa ibaba.

Hakbang 6: Pagsubok sa Controller

Image
Image

Tulad ng nakasaad dati, ang software ay hindi na-optimize para sa workflow ng Solar Charging. Maaari itong masubukan at mai-tweak gamit ang natural (araw) at hindi likas na mapagkukunan ng ilaw.

Upang subukan ang pagsubaybay sa isang kinokontrol na kapaligiran maaaring maging maginhawa upang itakda ang TULOG na MINUTES sa isang mas mababang halaga (tingnan ang susunod na hakbang).

Hakbang 7: Pag-configure sa pamamagitan ng I2C Paggamit ng Console Input

Ipinapaliwanag nito ang pag-configure ng controller sa pamamagitan ng pangalawang MCU, pagpasok ng mga setting sa isang window ng console.

  1. I-upload ang sumusunod na script sa isang D1M WIFI BLOCK (o Wemos D1 Mini).
  2. Idiskonekta ang USB mula sa PC
  3. Mga Koneksyon sa PIN: -ve (Controller) => GND (D1M) + ve (Controller) => 3V3 (D1M) SCL (Controller) => D1 (D1M)

    SDA (Controller) => D2 (D1M)

  4. I-on ang switch ng SPDT sa CONFIG
  5. Ikonekta ang USB sa PC
  6. Mula sa Arduino IDE simulan ang isang window ng console na may tamang COM Port
  7. Tiyaking napili ang "Newline" at "9600 baud"
  8. Ang mga utos ay nakapasok sa Send Textbox na sinusundan ng Enter key
  9. Ang mga utos ay nasa format na byte ng Character
  10. Kung ang pangalawang byte (pangatlong segment) ay hindi kasama 0 (zero) ay ipinadala ng script
  11. Mag-ingat sa paggamit ng serial input; suriin ang iyong ipinasok bago ang pagpindot sa "Enter" key. Kung naka-lock out ka (halimbawa binabago ang I2C address sa isang halagang nakalimutan mo) kakailanganin mong i-flash muli ang firmware ng controller.

Ang mga sinusuportahang pagkakaiba-iba sa unang karakter ng utos ay:

  • E (Paganahin ang pagsubaybay sa servo) na kapaki-pakinabang para sa pagpapahinto ng paggalaw sa panahon ng pagsasaayos. Input ito gamit ang: E 0
  • D (Huwag paganahin ang pagsubaybay sa servo) na kapaki-pakinabang upang simulan ang awtomatikong pagsubaybay kung hindi muling pag-reboot ang aparato. Input ito gamit ang: D 0
  • Ang G (Kumuha ng halaga ng pagsasaayos) ay nagbabasa ng mga halagang mula sa EEPROM at IN-MEMORY: Ito ay pag-input gamit ang: G (ang index ay wastong byte na halagang 0 - 13 at 15)
  • Ang S (Itakda ang halaga ng EEPROM) ay nagtatakda ng mga halaga sa EEPROM na magagamit pagkatapos ng mga reboot. Ito ay pag-input gamit ang: S (ang index ay wastong byte na halaga 0 - 13, ang halaga ay wastong byte na halaga at magkakaiba-iba sa bawat pag-aari)

Ang code ay ang punto ng katotohanan para sa mga indeks ngunit ang sumusunod ay ginagamit para sa isang gabay para sa mga wastong halaga / komento:

  • I2C ADDRESS 0 - controller address ng alipin, kailangan ito ng master upang makipag-usap sa controller (default 10)
  • MINIMUM VERTICAL ANGLE 1 - anggulo ng patayong servo na mas mababang limitasyon (default 10, saklaw 0 - 180)
  • MAXIMUM VERTICAL ANGLE 2 - anggulo ng patayong servo itaas na limitasyon (default 170, saklaw 0 - 180)
  • SENSITIVITY VERTICAL LDR 3 - Vertical LDR margin ng pagbabasa (default 20, saklaw 0 - 1024)
  • VERTICAL ANGLE STEP 4 - anggulo ng patayong mga servo na hakbang sa bawat pagsasaayos (default 5, saklaw 1 - 20)
  • MINIMUM HORIZONTAL ANGLE 5 - anggulo ng pahalang na servo na mas mababang limitasyon (default 10, saklaw 0 - 180)
  • MAXIMUM HORIZONTAL ANGLE 6 - anggulo ng pahalang na servo itaas na limitasyon (default 170, saklaw 0 - 180)
  • SENSITIVITY HORIZONTAL LDR 7 - Pahalang na margin ng pagbabasa ng LDR (default 20, saklaw 0 - 1024)
  • HORIZONTAL ANGLE STEP 8 - anggulo ng pahalang na mga servo na hakbang sa bawat pagsasaayos (default 5, saklaw 1 - 20)
  • SLEEP MINUTES 9 - ang tinatayang panahon ng pagtulog sa pagitan ng pagsubaybay (default 20, saklaw 1 - 255)
  • VERTICAL DAWN ANGLE 10 - FUTURE USE - ang patayong anggulo upang bumalik sa paglubog ng araw
  • HORIZONTAL DAWN ANGLE 11 - FUTURE USE - ang pahalang na anggulo upang bumalik kapag lumubog ang araw
  • DAWN INTENSITY 12 - FUTURE USE - ang minimum na average ng lahat ng LDR na nagpapalitaw ng isang pagsisimula ng pang-araw-araw na pagsubaybay sa araw
  • DUSK INTENSITY 13 - FUTURE USE - ang minimum na average ng lahat ng LDR na nagpapalitaw ng pagtatapos ng pang-araw-araw na pagsubaybay sa araw
  • END OF EEPROM VALUES MARKER 14 - HINDI GINAMIT ANG HALAGA
  • CURRENT INTENSITY 15 - ang kasalukuyang average na porsyento ng light intensity
  • WAKAS NG IN-MEMORY VALUES MARKER 16 - HINDI GINAMIT ANG HALAGA.

Nakukuha ang serial input (input ng keyboard sa window ng console) at ipasa ito sa isang alipin ng I2C sa format na char, byte, byte

# isama
# kahuluganI2C_MSG_IN_SIZE2
# kahuluganI2C_MSG_OUT_SIZE3
# kahuluganI2C_SLAVE_ADDRESS10
boolean _newData = false;
const byte _numChars = 32;
char _receivedChars [_numChars]; // isang array upang maiimbak ang natanggap na data
voidsetup () {
Serial.begin (9600);
Wire.begin (D2, D1);
pagkaantala (5000);
}
voidloop () {
recvWithEndMarker ();
parseSendCommands ();
}
voidrecvWithEndMarker () {
static byte ndx = 0;
char endMarker = '\ n';
char rc;
habang (Serial.available ()> 0 && _newData == maling) {
rc = Serial.read ();
kung (rc! = endMarker) {
_receivedChars [ndx] = rc;
ndx ++;
kung (ndx> = _numChars) {
ndx = _numChars - 1;
}
} iba pa {
_receivedChars [ndx] = '\ 0'; // wakasan ang string
ndx = 0;
_newData = totoo;
}
}
}
voidparseSendCommands () {
kung (_newData == totoo) {
constchar delim [2] = "";
char * token;
token = strtok (_receivedChars, delim);
char cmd = _receivedChars [0];
byte index = 0;
byte halaga = 0;
int i = 0;
habang (token! = NULL) {
//Serial.println(token);
ako ++;
lumipat (i) {
case1:
token = strtok (NULL, delim);
index = atoi (token);
pahinga;
kaso2:
token = strtok (NULL, delim);
kung (token! = NULL) {
halaga = atoi (token);
}
pahinga;
default:
token = NULL;
}
}
sendCmd (cmd, index, halaga);
_newData = false;
}
}
voidsendCmd (char cmd, byte index, byte na halaga) {
Serial.println ("-----");
Serial.println ("Utos ng pagpapadala:");
Serial.println ("\ t" + String (cmd) + "" + String (index) + "" + String (halaga));
Serial.println ("-----");
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // ipadala sa aparato
Wire.write (cmd); // nagpapadala ng char
Wire.write (index); // nagpapadala ng isang byte
Wire.write (halaga); // nagpapadala ng isang byte
Wire.endTransmission ();
byte na tugon = 0;
bool hadResponse = false;
kung (cmd == 'G') {
Wire.requestFrom (I2C_SLAVE_ADDRESS, 1);
habang (Wire.available ()) // alipin ay maaaring magpadala ng mas mababa sa hiniling
{
hadResponse = totoo;
tugon = Wire.read ();
}
kung (hadResponse == totoo) {
Serial.println ("Pagkuha ng tugon:");
Serial.println (tugon);
} iba pa {
Serial.println ("Walang tugon, suriin ang address / koneksyon");
}
}
}

tingnan ang rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino naka-host sa ❤ ng GitHub

Hakbang 8: Susunod na Mga Hakbang

Balikan pana-panahon upang suriin ang mga pagbabago sa software / hardware.

Baguhin ang software / hardware sa iyong mga kinakailangan.

Magkomento sa anumang mga kahilingan / pag-optimize.

Inirerekumendang: