Isi kandungan:
- Langkah 1: Bahan dan Alat
- Langkah 2: Memasang Litar
- Langkah 3: Melancarkan MCU
- Langkah 4: Memasang Sarung Litar
- Langkah 5: Menyambungkan Rig Leads ke Controller
- Langkah 6: Menguji Pengawal
- Langkah 7: Mengkonfigurasi Via I2C Menggunakan Input Konsol
- Langkah 8: Langkah Seterusnya
Video: IOT123 - SOLAR TRACKER - CONTROLLER: 8 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:11
Ini adalah lanjutan dari Instructable
IOT123 - SOLAR TRACKER - TILT / PAN, PANEL FRAME, LDR MOUNTS RIG. Di sini kita menumpukan perhatian pada pengawal servos, dan sensor kedudukan matahari. Penting untuk dinyatakan bahawa reka bentuk ini mengandaikan 2 MCU akan digunakan: satu (3.3V 8mHz Arduino Pro Mini) untuk pelacak solar, dan satu MCU bebas untuk sensor / pelakon anda.
Ini adalah Versi 0.3
Daripada menerbitkan semua projek setelah mendapat kepuasan sepenuhnya, saya akan mempraktikkan integrasi berterusan dan menyampaikan sesuatu dengan lebih kerap, mengubah apa yang telah saya sampaikan mengikut keperluan saya. Saya akan menulis arahan lain untuk pengecas bateri, _ ketika_ pengoptimuman perisian / perkakasan pengawal selesai. Saya akan menunjukkan di mana pengoptimuman diperlukan semasa kita melangkah ke arah ini.
Sebahagian daripada sebab pendekatan ini adalah maklum balas pelanggan. Sekiranya anda melihat keperluan atau mempunyai pendekatan yang lebih baik, sila beri komen, tetapi ingatlah bahawa saya tidak dapat menyampaikan semuanya dan mungkin bukan pada jangka masa yang sesuai dengan anda. Oleh kerana penjelasan ini kelihatan kurang relevan, penjelasan ini akan dihapuskan dari artikel ini.
Ini termasuk:
- Gunakan LDR dari yang asli Instructable untuk merasakan lokasi matahari yang hampir.
- Gerakkan servos untuk menghadap cahaya matahari.
- Pilihan untuk kepekaan pergerakan.
- Pilihan untuk ukuran langkah ketika bergerak ke matahari.
- Pilihan untuk kekangan sudut yang digunakan pada servo.
- Pilihan untuk kelewatan pergerakan.
- Antara muka I2C untuk menetapkan / mendapatkan nilai antara MCU.
- Tidur nyenyak antara pergerakan.
Perkara ini tidak termasuk (dan akan ditangani seiring dengan waktu):
- Hanya menggunakan kuasa pada waktu siang.
- Teringat kedudukan subuh dan pergi ke sana pada waktu senja ditutup.
- Mengeluarkan pengatur dari MCU.
- Melumpuhkan LED pada MCU.
- Mengubah semula kekuatan melalui VCC dan bukannya RAW.
- Menyediakan penyelesaian untuk berkelip tanpa kuasa terkawal dari penukar USB ke Serial TTL.
- Monitor voltan bateri.
SEJARAH
20 Dis 2017 KOD V0.1
Versi awal menjejaki sumber cahaya, selalu menyala, tanpa pengecasan
7 Jan 2018 KOD V0.2
-
PERUBAHAN PERKAKASAN
- Tambah pin I2C
- Tambah suis ke GND servo
- Label Bercetak pada fasia kotak pengawal
-
PERUBAHAN PERISIAN
- Baca konfigurasi dari EEPROM
- Sokongan bas I2C sebagai hamba MCU lain (3.3V)
- Tetapkan konfigurasi melalui I2C
- Tetapkan Diaktifkan melalui I2C
- Dapatkan konfigurasi melalui I2C
- Dapatkan sifat runtime melalui I2C (sedang diaktifkan, dan Intensiti Cahaya Semasa)
- Buang pembalakan bersiri (ia mempengaruhi nilai I2C)
19 Jan 2018 V0.3 KOD
-
PERKAKASAN
Label dikemas kini. Switch kini digunakan untuk memilih mod CONFIG atau TRACK
-
PERISIAN
- I2C hanya digunakan untuk konfigurasi
- Pengawal menunggu 5 saat sebelum memulakan penjejakan, memungkinkan untuk bergerak tangan
- Untuk menggunakan konfigurasi I2C, SPDT mesti berada dalam CONFIG sebagai unit boot
- Di antara pergerakan penjejakan, unit berada dalam mod tidur dalam untuk nilai konfigurasi SLEEP MINUTES (lalai 20 minit).
Langkah 1: Bahan dan Alat
Kini terdapat senarai Bil Bahan dan Sumber yang lengkap.
- Bahagian bercetak 3D.
- Arduino Pro Mini 3.3V 8mHz
- 1 daripada 4x6cm Double Side Prototype PCB Universal Printed Circuit Board (akan dipotong separuh)
- 1 potongan header lelaki 40P (akan dipotong mengikut ukuran).
- 1 potongan header wanita 40P (akan dipotong mengikut ukuran).
- 4 dari 10K 1 / 4W restistor.
- Kawat cangkuk.
- Pateri dan Besi.
- 20 skru pengetuk kepala panci tahan karat 4G x 6mm.
- 4 skru penoreh kendiri 4G x 6mm tahan karat.
- 1 off bateri dan pemegang LiPo 3.7V (ditamatkan pada penyambung dupont 2P).
- 1 off header sudut kanan lelaki 2P
- 1 off suis SPDT 3 pin 2.54mm nada
- Gam Cyanoacrylate yang kuat
- Penyambung Dupont header 1P wanita (1 off biru, 1 off hijau).
Langkah 2: Memasang Litar
Litar pada masa ini tidak mempunyai Voltage Divider Circuit (volt meter).
- Potong Papan Lingkaran Bercetak Universal Prototaip PCB Sisi Ganda 4x6cm pada separuh pada paksi panjang.
-
Potong kepala lelaki 40P menjadi kepingan:
- 2 diskaun 12P
- 3 diskaun 3P
- 6 diskaun 2P.
-
Potong kepala wanita 40P menjadi beberapa bahagian:
- 2 diskaun 12P
- 1 dari 6P
- Solder 2 dari header 12Pfemale seperti yang ditunjukkan.
- Lekatkan spacer yang dikeluarkan dari header lelaki 3P (tambahan) ke bahagian bawah Suis SPDT dengan gam Cyanacrylate
- Di tempat sisi lain kemudian solder 6 off 2P, 2 off 3Pmale header dan suis SPDT seperti yang ditunjukkan.
- Solder 4 off 10K perintang (A, B, C, D black) melalui plumbum ke header pin GND (# 2 hitam) dan ke pin header A0 - A3 (# 5, # 6, # 7, # 8) kemudian melalui lubang (kuning) seperti yang ditunjukkan (3 gambar + 1 rajah).
- Jejaki 3.3V dari PIN pematerian PIN LDR # 4, # 6, # 8, # 10 dan utas melalui lubang ke pin VCC header feamale (hijau).
- Jejak 3.3V di bahagian kepala wanita seperti yang ditunjukkan (merah) pematerian ke PINS # 1, # 12, # 15.
- 3.3V melalui lubang PIN header RAW sisi # yang disolder (merah) # 1.
- Jejak penyambungan oren dari PIN # 11 melalui lubang ke solder Pin wanita di sisi lain seperti yang ditunjukkan.
- Jejak dan solder wayar hookup dari # 20 hingga # 30 dan dari # 31 hingga # 13 dan # 16.
- Solder Female Header PIN # 11 to Male Header PIN # 11 melalui lubang.
- Sediakan 2 penyambung dupont sepanjang 30mm dengan header 1P wanita (1 off blue, 1 off green). Jalur dan timah hujung yang lain.
- Kawat Dupont biru solder ke # 28; pateri hijau Dupont wayar ke # 29.
- Di bahagian atas Arduino betulkan header wanita 6P kemudian solder.
- Di bahagian atas Arduino tetapkan header wanita sudut kanan 2P int # 29 dan # 30 kemudian solder.
- Di bahagian bawah Arduino tetapkan 2 dari 12P dan 1 dari pin lelaki 3P kemudian solder.
- Masukkan pin 12P lelaki Arduino ke header wanita 12P PCB.
Langkah 3: Melancarkan MCU
Arduino Pro Mini dengan pantas menggunakan penukar FTDI232 USB ke TTL menggunakan header wanita 6P. Lihat foto di atas untuk penjajaran 2 papan.
Pastikan tetapan 3.3V dipilih pada FTDI232 anda. Ikuti arahan di sini menggunakan kod di bawah (gunakan pautan ke GIST).
Perpustakaan lowpower (dilampirkan dan https://github.com/rocketscream/Low-Power) perlu dipasang.
Sebaik sahaja Arduino Pro Mini + PCB dipasang di selongsong, ia masih boleh dilancarkan semasa pin header terkena. Cabut sahaja Unit Pengawal dari Rangka Panel yang mendedahkan tajuk.
Penjejak solar Tilt pan dengan konfigurasi I2C / EEPROM dan kitaran tidur antara pergerakan. Ketepatan tempoh kitaran tidur berkurang apabila tempoh meningkat, tetapi mencukupi untuk tujuan ini
/* |
* diubah suai dari kod |
* oleh Mathias Leroy |
* |
* V0.2 MODIFIKASI |
** SET I2C DAPATKAN |
** SET EEPROM DAPATKAN |
** HAPUSKAN OUTPUT SERIAL - SELEPAS I2C |
** MENGAKTIFKAN / MENGAKTIFKAN TRACKING |
** Pindahkan SERVOS KE TERHAD VIA I2C |
** BACA INTENSITI AVG SEMASA VIA I2C |
* V0.3 MODIFIKASI |
** TUKAR UNTUK 2 MOD - TRACK (NO I2C) dan CONFIGURE (MENGGUNAKAN I2C) |
** TIDUR DALAM MOD TRACK (PRECISION YANG SANGAT RENDAH SEHINGGA 8 KEDUA KEDUA) |
** DETACH / ATTACH SERVOS ON SLEEP / WAKE (TRANSISTOR DIGUNAKAN SETIAP HARI) |
** HAPUSKAN KEDUDUKAN INISIAT YANG BERKONFIGURASI (MENGURANGKAN) |
** HAPUSKAN KEDUA WAKE YANG BERKONFIGURASI (MENGURANGKAN) |
** HAPUSKAN KONFIGURABEL YANG DIGUNAKAN / HILANGKAN (MENGURANGKAN) |
** HAPUSKAN TRACKER KONFIGURABEL YANG DIGUNAKAN (GUNAKAN PESAN HARDWARE) |
** HAPUSKAN GETTER VOLTAGE - AKAN MENGGUNAKAN KOMPONEN I2C SEPARUH |
** TAMBAHKAN LOGGASI SIRI TIDAK MENGGUNAKAN I2C |
*/ |
#sertakan |
#sertakan |
#sertakan |
#sertakan |
#sertakan |
# tentukanEEPROM_VERSION1 |
# tentukanI2C_MSG_IN_SIZE3 |
#tentukanPIN_LDR_TL A0 |
#tentukanPIN_LDR_TR A1 |
#tentukanPIN_LDR_BR A3 |
#tentukanPIN_LDR_BL A2 |
# tentukanPIN_SERVO_V11 |
# tentukanPIN_SERVO_H5 |
# tentukanIDX_I2C_ADDR0 |
# tentukanIDX_V_ANGLE_MIN1 |
# tentukanIDX_V_ANGLE_MAX2 |
# tentukanIDX_V_SENSITIVITY3 |
# tentukanIDX_V_STEP4 |
# tentukanIDX_H_ANGLE_MIN5 |
# tentukanIDX_H_ANGLE_MAX6 |
# tentukanIDX_H_SENSITIVITY7 |
# tentukanIDX_H_STEP8 |
# tentukanIDX_SLEEP_MINUTES9 |
# tentukanIDX_V_DAWN_ANGLE10 |
# tentukanIDX_H_DAWN_ANGLE11 |
# defineIDX_DAWN_INTENSITY12 // purata semua LDRS |
# defineIDX_DUSK_INTENSITY13 // purata semua LDRS |
# tentukanIDX_END_EEPROM_SET14 |
# defineIDX_CURRENT_INTENSITY15 // purata semua LDRS - digunakan untuk mengira IDX_DAWN_INTENSITY cahaya tidak langsung ambien |
# tentukanIDX_END_VALUES_GET16 |
# tentukanIDX_SIGN_117 |
# tentukanIDX_SIGN_218 |
# tentukanIDX_SIGN_319 |
Servo _servoH; |
Servo _servoV; |
bait _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; |
bait _i2cResponse = 0; |
bool _inConfigMode = false; |
kekosongan () |
{ |
Serial.begin (115200); |
getFromEeprom (); |
jika (dalamConfigMode ()) { |
Serial.println ("Mod Konfigurasi"); |
Serial.print ("Alamat I2C:"); |
Serial.println (_i2cVals [IDX_I2C_ADDR]); |
Wire.begin (_i2cVals [IDX_I2C_ADDR]); |
Wire.onReceive (menerimaEvent); |
Wire.onRequest (requestEvent); |
} lain { |
Serial.println ("Mod Penjejakan"); |
kelewatan (5000); // masa untuk melepaskan diri jika menyambungkan bateri dll. |
} |
} |
kekosongan () |
{ |
getLightValues (); |
jika (! _inConfigMode) { |
// ToDo: MENGHIDUPKAN TRANSISTOR SWITCH |
_servoH.attach (PIN_SERVO_H); |
_servoV.attach (PIN_SERVO_V); |
untuk (int i = 0; i <20; i ++) { |
jika (i! = 0) { |
getLightValues (); |
} |
bergerakServos (); |
} |
kelewatan (500); |
_servoH.detach (); |
_servoV.detach (); |
// ToDo: HAPUSKAN PEMINDAHAN TRANSISTOR |
kelewatan (500); |
sleepFor ((_ i2cVals [IDX_SLEEP_MINUTES] * 60) / 8); |
} |
} |
// --------------------------------- MODEN SEMASA |
boolinConfigMode () { |
pinMode (PIN_SERVO_H, INPUT); |
_inConfigMode = digitalRead (PIN_SERVO_H) == 1; |
kembali _inConfigMode; |
} |
// --------------------------------- EEPROM |
voidgetFromEeprom () { |
sekiranya ( |
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"); |
untuk (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"); |
untuk (int i = 0; i <IDX_END_EEPROM_SET; i ++) { |
_i2cVals = EEPROM.read (i); |
//Serial.println(String(i) + "=" + _i2cVals ); |
} |
} |
// --------------------------------- I2C |
voidreceiveEvent (pengiraan int) { |
jika (hitung == I2C_MSG_IN_SIZE) |
{ |
char cmd = Wire.read (); |
indeks bait = Wire.read (); |
nilai bait = Wire.read (); |
tukar (cmd) { |
kes'G ': |
jika (indeks <IDX_END_VALUES_GET) { |
_i2cResponse = _i2cVals [indeks]; |
} |
rehat; |
kes 'S': |
jika (indeks <IDX_END_EEPROM_SET) { |
_i2cVals [index] = nilai; |
EEPROM.update (indeks, _i2cVals [indeks]); |
} |
rehat; |
lalai: |
kembali; |
} |
} |
} |
voidrequestEvent () |
{ |
Wire.write (_i2cResponse); |
} |
// --------------------------------- LDR |
voidgetLightValues () { |
int valueTopLeft = analogRead (PIN_LDR_TL); |
int valueTopRight = analogRead (PIN_LDR_TR); |
int valueBottomRight = analogRead (PIN_LDR_BR); |
int valueBottomLeft = analogRead (PIN_LDR_BL); |
_averageTop = (valueTopLeft + valueTopRight) / 2; |
_averageRight = (valueTopRight + valueBottomRight) / 2; |
_averageBottom = (valueBottomRight + valueBottomLeft) / 2; |
_averageLeft = (valueBottomLeft + valueTopLeft) / 2; |
int avgIntensity = (valueTopLeft + valueTopRight + valueBottomRight + valueBottomLeft) / 4; |
_i2cVals [IDX_CURRENT_INTENSITY] = peta (avgIntensity, 0, 1024, 0, 255); |
} |
// --------------------------------- SERVOS |
voidmoveServos () { |
Serial.println ("moveServos"); |
jika ((_averageLeft-_averageRight)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH-_i2cVals [IDX_H_STEP])> _ i2cVals [IDX_H_ANGLE_MIN]) { |
// ke kiri |
Serial.println ("moveServos ke kiri"); |
kelewatan (_slowingDelay); |
untuk (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) { |
_servoH.write (_angleH--); |
kelewatan (_servoLoopDelay); |
} |
} |
elseif ((_averageRight-_averageLeft)> _ i2cVals [IDX_H_SENSITIVITY] && (_angleH + _i2cVals [IDX_H_STEP]) <_ i2cVals [IDX_H_ANGLE_MAX]) { |
// menuju ke kanan |
Serial.println ("moveServos ke kiri"); |
kelewatan (_slowingDelay); |
untuk (int i = 0; i <_i2cVals [IDX_H_STEP]; i ++) { |
_servoH.write (_angleH ++); |
kelewatan (_servoLoopDelay); |
} |
} |
lain { |
// tidak melakukan apa-apa |
Serial.println ("moveServos tidak melakukan apa-apa"); |
kelewatan (_slowingDelay); |
} |
jika ((_averageTop-_averageBottom)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV + _i2cVals [IDX_V_STEP]) <_ i2cVals [IDX_V_ANGLE_MAX]) { |
// pergi ke atas |
Serial.println ("moveServos naik"); |
kelewatan (_slowingDelay); |
untuk (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) { |
_servoV.write (_angleV ++); |
kelewatan (_servoLoopDelay); |
} |
} |
elseif ((_averageBottom-_averageTop)> _ i2cVals [IDX_V_SENSITIVITY] && (_angleV-_i2cVals [IDX_V_STEP])> _ i2cVals [IDX_V_ANGLE_MIN]) { |
// turun bawah |
Serial.println ("moveServos akan turun"); |
kelewatan (_slowingDelay); |
untuk (int i = 0; i <_i2cVals [IDX_V_STEP]; i ++) { |
_servoV.write (_angleV--); |
kelewatan (_servoLoopDelay); |
} |
} |
lain { |
Serial.println ("moveServos tidak melakukan apa-apa"); |
kelewatan (_slowingDelay); |
} |
} |
// --------------------------------- TIDUR |
voidasleepFor (unsignedint lapanSecondSegments) { |
Serial.println ("sleepFor"); |
untuk (unsignedint sleepCounter = lapanSecondSegments; sleepCounter> 0; sleepCounter--) |
{ |
LowPower.powerDown (SLEEP_8S, ADC_OFF, BOD_OFF); |
} |
} |
lihat rawtilt_pan_tracker_0.3.ino dihoskan dengan ❤ oleh GitHub
Langkah 4: Memasang Sarung Litar
- Pastikan Ardiuno Pro Mini dimasukkan ke dalam tajuk pada PCB.
- Masukkan pangkalan kotak pengawal SOLAR TRACKER ke dinding kotak pengawal SOLAR TRACKER dan lekatkan dengan 2 skru penoreh kendiri tahan karat 4G x 6mm.
- Masukkan Ardiuno Pro Mini + PCB dengan slot Header 6P ke dalam kekosongan di pangkalan kotak pengawal SOLAR TRACKER.
- Masukkan penutup kotak pengawal SOLAR TRACKER ke dinding kotak pengawal SOLAR TRACKER dan lekatkan dengan 2 skru penoreh kendiri tahan karat 4G x 6mm.
- Lekatkan pemasangan di atas ke dasar Rangka Panel dengan 4 skru tahan karat 4G x 6mm tahan karat.
Langkah 5: Menyambungkan Rig Leads ke Controller
Sambungan yang berkaitan siap dari Instructable sebelumnya, adalah 4 sambungan 2P LDR dan 2 sambungan 3P dari servo. Apa yang sementara sehingga pengisian semula siap adalah bateri. Gunakan LiPo 3.7V yang berakhir dalam sambungan 2P DuPont buat masa ini.
-
Masukkan sambungan LDR (tiada kekutuban) dari atas:
- Atas Kanan
- Kiri Atas
- Bawah Kanan
- Dibahagian bawah kiri
-
Masukkan sambungan Servo (dengan wayar isyarat ke kiri) dari atas:
- Melintang
- Tegak
- TUNGGU SEDIA ADA UNTUK UJIAN KEMUDIAN: Masukkan plumbum Kuasa DC 3.7V + ve ke atas, -ve ke bawah.
Langkah 6: Menguji Pengawal
Seperti yang dinyatakan sebelumnya, perisian belum dioptimumkan untuk aliran kerja Solar Charging. Ia boleh diuji dan diubah menggunakan sumber cahaya semula jadi (matahari) dan tidak semula jadi.
Untuk menguji penjejakan dalam lingkungan terkawal, lebih baik menetapkan SITUS MINIT ke nilai yang lebih rendah (lihat langkah seterusnya).
Langkah 7: Mengkonfigurasi Via I2C Menggunakan Input Konsol
Ini menjelaskan mengkonfigurasi pengawal melalui MCU kedua, memasukkan tetapan ke tetingkap konsol.
- Muat naik skrip berikut ke D1M WIFI BLOCK (atau Wemos D1 Mini).
- Putuskan sambungan USB dari PC
-
Sambungan PIN: -ve (Controller) => GND (D1M) + ve (Controller) => 3V3 (D1M) SCL (Controller) => D1 (D1M)
SDA (Pengawal) => D2 (D1M)
- Putar suis SPDT ke CONFIG
- Sambungkan USB ke PC
- Dari Arduino IDE mulakan tetingkap konsol dengan Port COM yang betul
- Pastikan "Newline" dan "9600 baud" dipilih
- Perintah dimasukkan ke dalam Kotak Teks Hantar diikuti dengan tombol Enter
- Perintah dalam format Character byte byte
- Sekiranya bait kedua (segmen ketiga) tidak disertakan 0 (sifar) dihantar oleh skrip
- Berhati-hati menggunakan input bersiri; semak semula apa yang anda masukkan sebelum menekan kekunci "Enter". Sekiranya anda terkunci (contohnya menukar alamat I2C ke nilai yang anda lupakan) anda perlu mem-flash firmware pengawal sekali lagi.
Variasi yang disokong dalam watak pertama perintah adalah:
- E (Dayakan pelacakan servo) berguna untuk menghentikan pergerakan semasa konfigurasi. Ini adalah input menggunakan: E 0
- D (Lumpuhkan pelacakan servo) berguna untuk memulakan penjejakan automatik jika tidak menghidupkan semula peranti. Ini adalah input menggunakan: D 0
- G (Dapatkan nilai konfigurasi) membaca nilai dari EEPROM dan IN-MEMORY: Ini dimasukkan menggunakan: G (indeks adalah nilai byte yang sah 0 - 13 dan 15)
- S (Tetapkan nilai EEPROM) menetapkan nilai ke EEPROM yang tersedia selepas reboot. Ini dimasukkan menggunakan: S (indeks adalah nilai bait 0 - 13, nilai adalah nilai bait yang sah dan berbeza-beza setiap harta tanah)
Kodnya adalah titik kebenaran untuk indeks tetapi berikut digunakan untuk panduan untuk nilai / komen yang sah:
- ALAMAT I2C 0 - alamat hamba pengawal, tuan memerlukan ini untuk berkomunikasi dengan pengawal (lalai 10)
- MINIMUM VERTICAL ANGLE 1 - had bawah servo menegak bawah (lalai 10, julat 0 - 180)
- MAXIMUM VERTICAL ANGLE 2 - had atas servo menegak atas (lalai 170, julat 0 - 180)
- SENSITIVITY VERTICAL LDR 3 - Margin bacaan LDR menegak (lalai 20, julat 0 - 1024)
- LANGKAH VERTIKAL LANGKAH 4 - langkah servo menegak sudut pada setiap penyesuaian (lalai 5, julat 1 - 20)
- MINIMUM HORIZONTAL ANGLE 5 - had bawah servo mendatar sudut (lalai 10, julat 0 - 180)
- MAXIMUM HORIZONTAL ANGLE 6 - had atas servo mendatar sudut (lalai 170, julat 0 - 180)
- SENSITIVITY HORIZONTAL LDR 7 - Margin bacaan LDR mendatar (lalai 20, julat 0 - 1024)
- LANGKAH HORIZONTAL LANGKAH 8 - langkah servo mendatar sudut pada setiap pelarasan (lalai 5, julat 1 - 20)
- MINIT TIDUR 9 - jangka masa tidur antara penjejakan (lalai 20, julat 1 - 255)
- VERTICAL DAWN ANGLE 10 - PENGGUNAAN MASA DEPAN - sudut menegak untuk kembali ketika matahari terbenam
- HORIZONTAL DAWN ANGLE 11 - PENGGUNAAN MASA DEPAN - sudut mendatar untuk kembali ketika matahari terbenam
- INTENSITI DAWN 12 - PENGGUNAAN MASA DEPAN - purata minimum semua LDR yang mencetuskan permulaan penjejakan matahari setiap hari
- INTENSITI DUSK 13 - PENGGUNAAN MASA DEPAN - purata minimum semua LDR yang mencetuskan penghujung sinar matahari setiap hari
- MARKER NILAI EEPROM TAMAT 14 - NILAI TIDAK DIGUNAKAN
- INTENSITI SEMASA 15 - peratusan purata intensiti cahaya semasa
- MARKER NILAI DALAM MEMORI 16 - NILAI TIDAK DIGUNAKAN.
Menangkap input bersiri (input papan kekunci di tetingkap konsol) dan meneruskannya ke hamba I2C dalam format char, byte, byte
#sertakan |
# tentukanI2C_MSG_IN_SIZE2 |
# tentukanI2C_MSG_OUT_SIZE3 |
# tentukanI2C_SLAVE_ADDRESS10 |
boolean _newData = palsu; |
const byte _numChars = 32; |
char _receivedChars [_numChars]; // array untuk menyimpan data yang diterima |
kekosongan () { |
Serial.begin (9600); |
Wire.begin (D2, D1); |
kelewatan (5000); |
} |
kekosongan () { |
recvWithEndMarker (); |
parseSendCommands (); |
} |
voidrecvWithEndMarker () { |
bait statik ndx = 0; |
char endMarker = '\ n'; |
char rc; |
sementara (Serial.available ()> 0 && _newData == false) { |
rc = Serial.read (); |
jika (rc! = endMarker) { |
_receivedChars [ndx] = rc; |
ndx ++; |
jika (ndx> = _numChars) { |
ndx = _numChars - 1; |
} |
} lain { |
_receivedChars [ndx] = '\ 0'; // tamatkan rentetan |
ndx = 0; |
_newData = benar; |
} |
} |
} |
voidparseSendCommands () { |
jika (_newData == benar) { |
constchar delim [2] = ""; |
token char *; |
token = strtok (_receivedChars, delim); |
char cmd = _receivedChars [0]; |
indeks bait = 0; |
nilai bait = 0; |
int i = 0; |
sementara (token! = NULL) { |
//Serial.println(token); |
saya ++; |
beralih (i) { |
kes1: |
token = strtok (NULL, delim); |
index = atoi (token); |
rehat; |
kes2: |
token = strtok (NULL, delim); |
jika (token! = NULL) { |
nilai = atoi (token); |
} |
rehat; |
lalai: |
token = NULL; |
} |
} |
sendCmd (cmd, indeks, nilai); |
_newData = salah; |
} |
} |
voidsendCmd (char cmd, indeks bait, nilai bait) { |
Serial.println ("-----"); |
Serial.println ("Menghantar arahan:"); |
Serial.println ("\ t" + String (cmd) + "" + String (index) + "" + String (nilai)); |
Serial.println ("-----"); |
Wire.beginTransmission (I2C_SLAVE_ADDRESS); // hantar ke peranti |
Wire.write (cmd); // menghantar char |
Wire.write (indeks); // menghantar satu bait |
Wire.write (nilai); // menghantar satu bait |
Wire.endTransmission (); |
tindak balas bait = 0; |
bool hadResponse = salah; |
jika (cmd == 'G') { |
Wire.requestFrom (I2C_SLAVE_ADDRESS, 1); |
sementara (Wire.available ()) // hamba boleh menghantar lebih sedikit daripada yang diminta |
{ |
hadResponse = benar; |
tindak balas = Wire.read (); |
} |
jika (hadResponse == benar) { |
Serial.println ("Mendapatkan respons:"); |
Serial.println (tindak balas); |
} lain { |
Serial.println ("Tidak ada jawapan, periksa alamat / sambungan"); |
} |
} |
} |
lihat rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino dihoskan dengan ❤ oleh GitHub
Langkah 8: Langkah Seterusnya
Periksa kembali secara berkala untuk memeriksa perubahan perisian / perkakasan.
Ubah suai perisian / perkakasan mengikut keperluan anda.
Komen mengenai sebarang permintaan / pengoptimuman.
Disyorkan:
Jam Tangan Pintar DIY Fitness Tracker Dengan Oksimeter dan Denyut Jantung - Modul Elektronik Modular Dari TinyCircuits - Arcade terkecil: 6 Langkah
Jam Tangan Pintar DIY Fitness Tracker Dengan Oksimeter dan Denyut Jantung | Modul Elektronik Modular Dari TinyCircuits | Arcade Terkecil: Hei, ada apa, Guys! Akarsh di sini dari CETech. Hari ini kita mempunyai beberapa modul sensor yang sangat berguna dalam kehidupan kita sehari-hari tetapi dalam versi kecil mereka sendiri. Sensor yang kita miliki sekarang sangat kecil berbanding dengan
Bina Tracker Gerak Boleh Dipakai (BLE Dari Arduino ke Aplikasi Studio Android Custom): 4 Langkah
Bina Tracker Gerak Boleh Dipakai (BLE Dari Arduino ke Aplikasi Studio Android Kustom): Tenaga Rendah Bluetooth (BLE) adalah bentuk komunikasi Bluetooth berkuasa rendah. Peranti yang boleh dipakai, seperti pakaian pintar yang saya bantu reka di Predictive Wear, mesti menghadkan penggunaan kuasa sedapat mungkin untuk memanjangkan hayat bateri, dan sering menggunakan BLE
Penjejak Desktop COVID19 Dengan Jam! Raspberry Pi Powered Tracker: 6 Langkah
Penjejak Desktop COVID19 Dengan Jam! Raspberry Pi Powered Tracker: Kami tahu bahawa kami boleh mati bila-bila masa, bahkan saya boleh mati semasa menulis catatan ini, bagaimanapun, saya saya, anda, kita semua adalah manusia. Seluruh dunia bergoncang kerana wabak COVID19. Kami tahu bagaimana mencegahnya, tapi hei! kita tahu bagaimana berdoa dan mengapa berdoa, adakah kita melakukan
Sarung Tangan VR Etextile untuk Vive Tracker: 13 Langkah (dengan Gambar)
Etextile VR Gloves for Vive Tracker: Tutorial ini menunjukkan kepada anda cara membuat sarung tangan etextile untuk digunakan di VR dengan pelacak Vive. Mereka mengganti tongkat yang dirancang untuk Vive, menjadikan interaksi VR lebih peka dan manusia. Mereka dipanggil sarung tangan 'mudra' kerana anda mencubit indeks dan
Cara Membuat Coronavirus COVID 19 Live Data Tracker Dengan ESP8266, Paparan E-kertas: 7 Langkah
Cara Membuat Coronavirus COVID 19 Live Data Tracker Dengan ESP8266, Paparan E-kertas: 1