Daftar Isi:

IOT123 - PELACAK SURYA - KONTROLER: 8 Langkah
IOT123 - PELACAK SURYA - KONTROLER: 8 Langkah

Video: IOT123 - PELACAK SURYA - KONTROLER: 8 Langkah

Video: IOT123 - PELACAK SURYA - KONTROLER: 8 Langkah
Video: Automatic solar trackers 2024, Juli
Anonim
Image
Image
IOT123 - PELACAK SURYA - KONTROLER
IOT123 - PELACAK SURYA - KONTROLER
IOT123 - PELACAK SURYA - KONTROLER
IOT123 - PELACAK SURYA - KONTROLER

Ini adalah perpanjangan dari Instructable

IOT123 - SURYA TRACKER - TILT/PAN, PANEL FRAME, LDR MOUNTS RIG. Di sini kita berkonsentrasi pada pengontrol servos, dan sensor posisi matahari. Penting untuk menunjukkan bahwa desain ini mengasumsikan 2 MCU akan digunakan: satu (3.3V 8mHz Arduino Pro Mini) untuk pelacak surya, dan satu MCU independen untuk sensor/aktor Anda.

Ini adalah Versi 0.3

Daripada mempublikasikan semua proyek setelah kepuasan penuh, saya akan mempraktikkan integrasi berkelanjutan dan memberikan sesuatu lebih sering, memodifikasi apa yang telah saya berikan sesuai kebutuhan. Saya akan menulis instruksi lain untuk pengisi daya baterai, _kapan_ optimalisasi perangkat lunak/perangkat keras pengontrol selesai. Saya akan menunjukkan di mana pengoptimalan diperlukan saat kita melangkah melalui ini.

Bagian dari alasan untuk pendekatan ini adalah umpan balik klien. Jika kalian melihat kebutuhan atau memiliki pendekatan yang lebih baik, silakan berkomentar, tetapi perlu diingat bahwa saya tidak dapat memberikan semuanya dan mungkin tidak pada kerangka waktu yang sesuai untuk Anda. Karena penjelasan ini tampaknya kurang relevan, mereka akan dihapus dari artikel ini.

Apa ini termasuk:

  1. Gunakan LDR dari Instructable asli untuk merasakan perkiraan lokasi matahari.
  2. Gerakkan servo untuk menghadap matahari.
  3. Pilihan untuk sensitivitas gerakan.
  4. Pilihan untuk ukuran langkah saat pindah ke matahari.
  5. Opsi untuk batasan sudut yang digunakan pada servos.
  6. Pilihan untuk penundaan gerakan.
  7. Antarmuka I2C untuk mengatur/mendapatkan nilai antar MCU.
  8. Tidur nyenyak di antara gerakan.

Apa yang tidak termasuk (dan akan dibahas jika waktu memungkinkan):

  1. Hanya menggunakan daya pada siang hari.
  2. Mengingat posisi fajar dan pergi ke sana saat senja ditutup.
  3. Melepaskan regulator dari MCU.
  4. Menonaktifkan LED pada MCU.
  5. Mengubah rute daya melalui VCC daripada RAW.
  6. Memberikan solusi untuk mem-flash tanpa daya yang diatur dari konverter USB ke Serial TTL.
  7. Monitor tegangan baterai.

SEJARAH

20 Desember 2017 KODE V0.1

Versi awal melacak sumber cahaya, selalu menyala, tanpa pengisian daya

7 Jan 2018 KODE V0.2

  • PERUBAHAN PERANGKAT KERAS

    • Tambahkan pin I2C
    • Tambahkan sakelar ke servo GND
    • Label tercetak pada fasia kotak pengontrol
  • PERUBAHAN PERANGKAT LUNAK

    • Baca konfigurasi dari EEPROM
    • Dukungan bus I2C sebagai budak ke MCU lain (3.3V)
    • Atur konfigurasi melalui I2C
    • Setel Diaktifkan melalui I2C
    • Dapatkan konfigurasi melalui I2C
    • Dapatkan properti runtime melalui I2C (saat ini Diaktifkan, dan Intensitas Cahaya Saat Ini)
    • Hapus logging serial (itu mempengaruhi nilai I2C)

19 Jan 2018 KODE V0.3

  • PERANGKAT KERAS

    Label diperbarui. Sakelar sekarang digunakan untuk memilih mode CONFIG atau TRACK

  • PERANGKAT LUNAK

    • I2C hanya digunakan untuk konfigurasi
    • Pengontrol menunggu 5 detik sebelum menginisialisasi pelacakan, memungkinkan untuk menggerakkan tangan
    • Untuk menggunakan konfigurasi I2C, SPDT harus di CONFIG sebagai unit boot
    • Di antara gerakan pelacakan, unit dalam mode tidur nyenyak untuk nilai konfigurasi SLEEP MINUTES (default 20 menit).

Langkah 1: Bahan dan Alat

Bahan dan alat
Bahan dan alat
Bahan dan alat
Bahan dan alat
Bahan dan alat
Bahan dan alat

Sekarang ada daftar Bill of Materials and Sources yang lengkap.

  1. Bagian cetak 3D.
  2. Arduino Pro Mini 3.3V 8MHz
  3. 1 dari 4x6cm Double Side Prototipe PCB Universal Printed Circuit Board (untuk dipotong dua)
  4. 1 dari 40P header laki-laki (untuk dipotong sesuai ukuran).
  5. 1 dari 40P header perempuan (untuk dipotong sesuai ukuran).
  6. 4 off 10K 1/4W restistor.
  7. Kawat penghubung.
  8. Solder dan Besi.
  9. 20 off 4G x 6mm kepala pan stainless sekrup self-tapping.
  10. 4 dari 4G x 6mm sekrup self-tapping countersunk stainless.
  11. 1 off baterai dan dudukan LiPo 3.7V (berakhir di konektor dupont 2P).
  12. 1 dari 2P header sudut kanan pria
  13. 1 dari sakelar SPDT 3 pin 2.54mm pitch
  14. Lem Cyanoacrylate yang kuat
  15. Konektor Dupont header 1P perempuan (1 mati biru, 1 mati hijau).

Langkah 2: Merakit Sirkuit

Merakit Sirkuit
Merakit Sirkuit
Merakit Sirkuit
Merakit Sirkuit
Merakit Sirkuit
Merakit Sirkuit

Rangkaian saat ini belum memiliki Rangkaian Pembagi Tegangan (volt meter).

  1. Potong Papan Sirkuit Cetak Universal Prototipe Sisi Ganda 4x6cm menjadi dua di sepanjang sumbu panjang.
  2. Potong header pria 40P menjadi beberapa bagian:

    1. 2 potongan 12P
    2. 3 potongan 3P
    3. 6 potongan 2P.
  3. Potong header betina 40P menjadi beberapa bagian:

    1. 2 potongan 12P
    2. 1 potong 6P
  4. Solder 2 dari header 12Pfemale seperti yang ditunjukkan.
  5. Rekatkan spacer yang dilepas dari header 3P male (tambahan) ke bagian bawah SPDT Switch dengan lem Cyanoacrylate
  6. Di sisi lain kemudian solder 6 off 2P, 2 off 3Pmale header dan saklar SPDT seperti yang ditunjukkan.
  7. Solder 4 resistor 10K (A, B, C, D hitam) melalui lead ke pin header GND (#2 hitam) dan ke pin header A0 - A3 (#5, #6, #7, #8) kemudian melalui lubang (kuning) seperti yang ditunjukkan (3 foto + 1 diagram).
  8. Lacak 3.3V dari PIN solder LDR PIN #4, #6, #8, #10 dan ulir melalui lubang ke pin VCC header feamale (hijau).
  9. Lacak 3.3V pada sisi header perempuan seperti yang ditunjukkan (merah) menyolder ke PIN #1, #12, #15.
  10. 3.3V melalui lubang yang disolder di atas sisi (merah) RAW header PIN #1.
  11. Lacak hookup oranye dari PIN #11 melalui lubang ke solder pin Female di sisi lain seperti yang ditunjukkan.
  12. Lacak dan solder kabel pengait biru dari #20 ke #30 dan dari #31 ke #13 dan #16.
  13. Solder PIN Header Wanita #11 ke PIN Header Pria #11 melalui lubang.
  14. Siapkan 2 konektor dupont sepanjang 30mm dengan header 1P betina (1 biru mati, 1 hijau mati). Kupas dan timah ujung lainnya.
  15. Solder kabel Dupont biru ke #28; solder kawat Dupont hijau ke #29.
  16. Di bagian atas Arduino, perbaiki header perempuan 6P lalu solder.
  17. Di bagian atas Arduino, perbaiki header perempuan sudut kanan 2P int #29 dan #30 lalu solder.
  18. Di bagian bawah Arduino, perbaiki 2 pin jantan 12P dan 1 dari 3P lalu solder.
  19. Masukkan pin Arduino 12P male ke dalam header PCB 12P female.

Langkah 3: Mem-flash MCU

Mem-flash MCU
Mem-flash MCU
Mem-flash MCU
Mem-flash MCU
Mem-flash MCU
Mem-flash MCU

Arduino Pro Mini mudah di-flash menggunakan FTDI232 USB to TTL converter menggunakan 6P female header. Lihat foto di atas untuk penyelarasan 2 papan.

Pastikan pengaturan 3.3V dipilih pada FTDI232 Anda. Ikuti petunjuk di sini menggunakan kode di bawah ini (gunakan tautan ke GIST).

Pustaka berdaya rendah (terlampir dan https://github.com/rocketscream/Low-Power) perlu dipasang.

Setelah Arduino Pro Mini + PCB dipasang di casing, itu masih dapat di-flash karena pin header terbuka. Lepaskan saja Unit Pengontrol dari Bingkai Panel yang memperlihatkan header.

Tilt pan solar tracker dengan konfigurasi I2C/EEPROM dan siklus tidur antar gerakan. Presisi durasi siklus tidur menurun seiring dengan meningkatnya durasi, tetapi cukup untuk tujuan ini

/*
* dimodifikasi dari kode
* oleh Mathias Leroy
*
* MODIFIKASI V0.2
** DAPATKAN SET I2C
** DAPATKAN SET EEPROM
** HAPUS OUTPUT SERI - I2C TERDAMPAK
** AKTIFKAN / NONAKTIFKAN PELACAKAN
** PINDAHKAN SERVOS KE BATAS VIA I2C
** BACA INTENSITAS AVG SAAT INI MELALUI I2C
* MODIFIKASI V0.3
** BERALIH UNTUK 2 MODE - TRACK (TIDAK ADA I2C) dan KONFIGURASI (GUNAKAN I2C)
** SLEEP IN TRACK MODE (PRESISI SANGAT RENDAH KARENA 8 BAGIAN DETIK)
** LEPAS / PASANG SERVOS SAAT TIDUR / BANGUN (TRANSISTOR DIGUNAKAN AKHIRNYA)
** HAPUS POSISI AWAL YANG DAPAT DIKONFIGURASI (REDUNDANT)
** HAPUS DETIK BANGUN YANG DAPAT DIKONFIGURASI (REDUNDANT)
** HAPUS AKTIFKAN/NONAKTIFKAN YANG DAPAT DIKONFIGURASI (REDUNDANT)
** HAPUS TRACKER YANG DAPAT DIKONFIGURASI DIAKTIFKAN (GUNAKAN HARDWARE SWITCH)
** HAPUS VOLTAGE GETTER - AKAN MENGGUNAKAN KOMPONEN I2C TERPISAH
** TAMBAHKAN PENDAFTARAN SERI KETIKA TIDAK MENGGUNAKAN I2C
*/
#termasuk
#termasuk
#termasuk
#termasuk
#termasuk
#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// rata-rata semua LDRS
#defineIDX_DUSK_INTENSITY13// rata-rata semua LDRS
#defineIDX_END_EEPROM_SET14
#defineIDX_CURRENT_INTENSITY15// rata-rata dari semua LDRS - digunakan untuk menghitung IDX_DAWN_INTENSITY cahaya ambient non-direct
#defineIDX_END_VALUES_GET16
#defineIDX_SIGN_117
#defineIDX_SIGN_218
#defineIDX_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 = salah;
pengaturan kosong()
{
Serial.begin(115200);
getFromEeprom();
if (inConfigMode()){
Serial.println("Mode Konfigurasi");
Serial.print("Alamat I2C: ");
Serial.println(_i2cVals[IDX_I2C_ADDR]);
Wire.begin(_i2cVals[IDX_I2C_ADDR]);
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
}lain{
Serial.println("Mode Pelacakan");
delay(5000);// waktu untuk menyingkir jika menghubungkan baterai dll.
}
}
batal ()
{
getLightValues();
if (!_inConfigMode){
// Yang Harus Dilakukan: NYALAKAN TRANSISTOR SWITCH
_servoH.attach(PIN_SERVO_H);
_servoV.attach(PIN_SERVO_V);
untuk (int i = 0; i < 20; i++){
jika (saya != 0){
getLightValues();
}
moveServos();
}
penundaan (500);
_servoH.detach();
_servoV.detach();
// Yang Harus Dilakukan: MATIKAN SAKLAR TRANSISTOR
penundaan (500);
sleepFor((_i2cVals[IDX_SLEEP_MINUTES] * 60) / 8);
}
}
//---------------------------------MODE SAAT INI
boolinConfigMode(){
pinMode(PIN_SERVO_H, INPUT);
_inConfigMode = digitalRead(PIN_SERVO_H) == 1;
kembalikan _inConfigMode;
}
//---------------------------------EEPROM
voidgetDariEeprom(){
jika(
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(jumlah int) {
jika (hitung == I2C_MSG_IN_SIZE)
{
char cmd = Wire.read();
indeks byte = Wire.read();
nilai byte = Wire.read();
beralih (cmd) {
kasus'G':
if (indeks< IDX_END_VALUES_GET){
_i2cResponse = _i2cVals[indeks];
}
merusak;
kasus'S':
if (indeks< IDX_END_EEPROM_SET){
_i2cVals[indeks] = nilai;
EEPROM.update(indeks, _i2cVals[indeks]);
}
merusak;
bawaan:
kembali;
}
}
}
voidrequestEvent()
{
Wire.write(_i2cResponse);
}
//---------------------------------LDR
voidgetLightValues(){
int nilaiTopLeft = analogRead(PIN_LDR_TL);
int nilaiTopRight = analogRead(PIN_LDR_TR);
int nilaiBottomRight = analogRead(PIN_LDR_BR);
int nilaiBottomLeft = analogRead(PIN_LDR_BL);
_averageTop = (nilaiTopLeft + nilaiTopRight) / 2;
_averageRight = (valueTopRight + valueBottomRight) / 2;
_averageBottom = (nilaiBottomRight + nilaiBottomLeft) / 2;
_averageLeft = (nilaiBottomLeft + nilaiTopLeft) / 2;
int avgIntensity = (valueTopLeft + valueTopRight + valueBottomRight + valueBottomLeft) / 4;
_i2cVals[IDX_CURRENT_INTENSITY] = peta(avgIntensity, 0, 1024, 0, 255);
}
//---------------------------------SERVOS
voidmoveServos(){
Serial.println("moveServos");
if ((_averageLeft-_averageRight)>_i2cVals[IDX_H_SENSITIVITY] && (_angleH-_i2cVals[IDX_H_STEP])>_i2cVals[IDX_H_ANGLE_MIN]) {
// ke kiri
Serial.println("moveServos ke kiri");
delay(_slowingDelay);
untuk (int i=0; i < _i2cVals[IDX_H_STEP]; i++){
_servoH.write(_angleH--);
delay(_servoLoopDelay);
}
}
elseif ((_averageRight-_averageLeft)>_i2cVals[IDX_H_SENSITIVITY] && (_angleH+_i2cVals[IDX_H_STEP])<_i2cVals[IDX_H_ANGLE_MAX]) {
// ke kanan
Serial.println("moveServos ke kiri");
delay(_slowingDelay);
untuk (int i=0; i < _i2cVals[IDX_H_STEP]; i++){
_servoH.write(_angleH++);
delay(_servoLoopDelay);
}
}
lain {
// tidak melakukan apapun
Serial.println("moveServos tidak melakukan apa-apa");
delay(_slowingDelay);
}
if ((_averageTop-_averageBottom)>_i2cVals[IDX_V_SENSITIVITY] && (_angleV+_i2cVals[IDX_V_STEP])<_i2cVals[IDX_V_ANGLE_MAX]) {
// naik ke atas
Serial.println("moveServos naik");
delay(_slowingDelay);
untuk (int i=0; i < _i2cVals[IDX_V_STEP]; i++){
_servoV.write(_angleV++);
delay(_servoLoopDelay);
}
}
elseif ((_averageBottom-_averageTop)>_i2cVals[IDX_V_SENSITIVITY] && (_angleV-_i2cVals[IDX_V_STEP])>_i2cVals[IDX_V_ANGLE_MIN]) {
// turun
Serial.println("moveServos turun");
delay(_slowingDelay);
untuk (int i=0; i < _i2cVals[IDX_V_STEP]; i++){
_servoV.write(_angleV--);
delay(_servoLoopDelay);
}
}
lain {
Serial.println("moveServos tidak melakukan apa-apa");
delay(_slowingDelay);
}
}
//---------------------------------TIDUR
voidasleepFor(unsignedint EightSecondSegments){
Serial.println("tidurUntuk");
for (unsignedint sleepCounter = EightSecondSegments; sleepCounter >0; sleepCounter--)
{
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
}

lihat rawtilt_pan_tracker_0.3.ino dihosting dengan ❤ oleh GitHub

Langkah 4: Merakit Casing Sirkuit

Merakit Casing Sirkuit
Merakit Casing Sirkuit
Merakit Casing Sirkuit
Merakit Casing Sirkuit
Merakit Casing Sirkuit
Merakit Casing Sirkuit
  1. Pastikan Ardiuno Pro Mini sudah terpasang pada header pada PCB.
  2. Masukkan alas kotak pengontrol SOLAR TRACKER ke dinding kotak pengontrol SOLAR TRACKER dan tempelkan dengan 2 sekrup penyadapan otomatis countersunk stainless 4G x 6mm.
  3. Masukkan Ardiuno Pro Mini + PCB dengan slotting Header 6P ke dalam lubang di dasar kotak pengontrol SOLAR TRACKER.
  4. Masukkan penutup kotak pengontrol SOLAR TRACKER ke dalam dinding kotak pengontrol SOLAR TRACKER dan tempelkan dengan sekrup self-tapping countersunk stainless 4G x 6mm 2 dari 4G x 6mm.
  5. Pasang rakitan di atas ke dasar Bingkai Panel dengan 4 sekrup self-tapping countersunk stainless 4G x 6mm.

Langkah 5: Menghubungkan Rig Leads ke Controller

Menghubungkan Rig Leads ke Controller
Menghubungkan Rig Leads ke Controller
Menghubungkan Rig Leads ke Controller
Menghubungkan Rig Leads ke Controller
Menghubungkan Rig Leads ke Controller
Menghubungkan Rig Leads ke Controller

Koneksi terkait yang siap dari Instruksi sebelumnya, adalah 4 koneksi 2P LDR mati dan 2 koneksi 3P mati dari servos. Yang bersifat sementara hingga pengisian ulang siap adalah baterai. Gunakan LiPo 3.7V yang berakhir dalam koneksi DuPont 2P untuk saat ini.

  1. Masukkan koneksi LDR (tanpa polaritas) dari atas:

    1. Kanan atas
    2. Kiri Atas
    3. Kanan bawah
    4. Kiri bawah
  2. Masukkan koneksi Servo (dengan kabel sinyal ke kiri) dari atas:

    1. Horisontal
    2. Vertikal
  3. TUNGGU SAMPAI SIAP UNTUK PENGUJIAN KEMUDIAN: Masukkan kabel Daya DC 3.7V +ve ke atas, -ve ke bawah.

Langkah 6: Menguji Pengontrol

Image
Image

Seperti yang dinyatakan sebelumnya, perangkat lunak belum dioptimalkan untuk alur kerja Pengisian Tenaga Surya. Ini dapat diuji dan diubah menggunakan sumber cahaya alami (matahari) dan tidak alami.

Untuk menguji pelacakan di lingkungan yang terkendali, mungkin lebih mudah untuk mengatur SLEEP MINUTES ke nilai yang lebih rendah (lihat langkah berikutnya).

Langkah 7: Mengonfigurasi Melalui I2C Menggunakan Input Konsol

Ini menjelaskan konfigurasi pengontrol melalui MCU kedua, memasukkan pengaturan ke jendela konsol.

  1. Unggah skrip berikut ke D1M WIFI BLOCK (atau Wemos D1 Mini).
  2. Putuskan sambungan USB dari PC
  3. KONEKSI PIN:-ve (Pengontrol) => GND (D1M)+ve (Pengontrol) => 3V3 (D1M)SCL (Pengontrol) => D1 (D1M)

    SDA (Pengontrol) => D2 (D1M)

  4. Putar sakelar SPDT ke CONFIG
  5. Hubungkan USB ke PC
  6. Dari Arduino IDE, mulai jendela konsol dengan Port COM yang benar
  7. Pastikan "Baris baru" dan "9600 baud" dipilih
  8. Perintah dimasukkan ke dalam Send Textbox diikuti dengan tombol Enter
  9. Perintah dalam format Karakter byte byte
  10. Jika byte kedua (segmen ketiga) tidak termasuk 0 (nol) dikirim oleh skrip
  11. Hati-hati menggunakan input serial; tinjau apa yang telah Anda masukkan sebelum menekan tombol "Enter". Jika Anda terkunci (misalnya mengubah alamat I2C ke nilai yang Anda lupa), Anda perlu mem-flash firmware pengontrol lagi.

Variasi yang didukung dalam karakter pertama perintah adalah:

  • E (Aktifkan pelacakan servo) berguna untuk menghentikan gerakan selama konfigurasi. Ini adalah input menggunakan: E 0
  • D (Nonaktifkan pelacakan servo) berguna untuk memulai pelacakan otomatis jika tidak me-reboot perangkat. Ini adalah input menggunakan: D 0
  • G (Dapatkan nilai konfigurasi) membaca nilai dari EEPROM dan IN-MEMORY: Ini adalah input menggunakan: G (indeks adalah nilai byte yang valid 0 - 13 dan 15)
  • S (Set EEPROM value) menetapkan nilai ke EEPROM yang tersedia setelah reboot. Ini adalah input menggunakan: S (indeks adalah nilai byte yang valid 0 - 13, nilai adalah nilai byte yang valid dan bervariasi per properti)

Kode adalah titik kebenaran untuk indeks tetapi berikut ini digunakan untuk panduan nilai/komentar yang valid:

  • I2C ADDRESS 0 - alamat slave pengontrol, master membutuhkan ini untuk berkomunikasi dengan pengontrol (default 10)
  • SUDUT VERTIKAL MINIMUM 1 - sudut batas bawah servo vertikal (default 10, rentang 0 - 180)
  • SUDUT VERTIKAL MAKSIMUM 2 - sudut batas atas servo vertikal (default 170, rentang 0 - 180)
  • SENSITIFITAS LDR VERTIKAL 3 - Margin pembacaan LDR vertikal (default 20, rentang 0 - 1024)
  • LANGKAH SUDUT VERTIKAL 4 - langkah servo vertikal sudut pada setiap penyesuaian (default 5, rentang 1 - 20)
  • MINIMUM HORIZONTAL ANGLE 5 - sudut batas bawah servo horizontal (default 10, rentang 0 - 180)
  • MAXIMUM HORIZONTAL ANGLE 6 - sudut batas atas servo horizontal (default 170, rentang 0 - 180)
  • SENSITIFITAS HORIZONTAL LDR 7 - Margin pembacaan LDR Horizontal (default 20, range 0 - 1024)
  • HORIZONTAL ANGLE STEP 8 - langkah servo horizontal sudut pada setiap penyesuaian (default 5, rentang 1 - 20)
  • MENIT TIDUR 9 - perkiraan periode tidur antara pelacakan (default 20, kisaran 1 - 255)
  • SUDUT FAJAR VERTIKAL 10 - PENGGUNAAN MASA DEPAN - sudut vertikal untuk kembali ke saat matahari terbenam
  • SUDUT FAJAR HORIZONTAL 11 - PENGGUNAAN MASA DEPAN - sudut horizontal untuk kembali ke saat matahari terbenam
  • INTENSITAS FAJAR 12 - PENGGUNAAN MASA DEPAN - rata-rata minimum dari semua LDR yang memicu dimulainya pelacakan matahari harian
  • INTENSITAS SENJA 13 - PENGGUNAAN MASA DEPAN - rata-rata minimum dari semua LDR yang memicu berakhirnya pelacakan matahari harian
  • END OF EEPROM VALUES MARKER 14 - NILAI TIDAK DIGUNAKAN
  • INTENSITAS LANCAR 15 - persentase rata-rata intensitas cahaya saat ini
  • END OF IN-MEMORY NILAI MARKER 16 - NILAI TIDAK DIGUNAKAN.

Menangkap input serial (input keyboard di jendela konsol) dan meneruskannya ke slave I2C dalam format char, byte, byte

#termasuk
#defineI2C_MSG_IN_SIZE2
#defineI2C_MSG_OUT_SIZE3
#defineI2C_SLAVE_ADDRESS10
boolean _newData = salah;
const byte _numChars = 32;
char _receivedChars[_numChars]; // array untuk menyimpan data yang diterima
voidsetup() {
Serial.begin(9600);
Kawat.mulai(D2, D1);
penundaan(5000);
}
batal () {
recvWithEndMarker();
parseSendCommands();
}
voidrecvDenganEndMarker() {
byte statis ndx = 0;
char endMarker = '\n';
karakter rc;
while (Serial.available() >0 && _newData == false) {
rc = Serial.read();
if (rc != endMarker) {
_receivedChars[ndx] = rc;
ndx++;
if (ndx >= _numChars) {
ndx = _numChars - 1;
}
} lain {
_receivedChars[ndx] = '\0'; // akhiri string
ndx = 0;
_databaru = benar;
}
}
}
voidparseSendCommands() {
if (_newData == benar) {
constchar delim[2] = "";
karakter * tanda;
token = strtok(_receivedChars, delim);
char cmd = _receivedChars[0];
indeks byte = 0;
nilai byte = 0;
int saya = 0;
while(token != NULL) {
//Serial.println(token);
saya++;
beralih (i){
kasus 1:
token = strtok(NULL, delim);
indeks = atoi(token);
merusak;
kasus2:
token = strtok(NULL, delim);
jika (token != NULL){
nilai = atoi(token);
}
merusak;
bawaan:
tanda = NULL;
}
}
sendCmd(cmd, indeks, nilai);
_databaru = salah;
}
}
voidsendCmd(char cmd, indeks byte, nilai byte) {
Serial.println("-----");
Serial.println("Mengirim perintah:");
Serial.println("\t" + String(cmd) + "" + String(indeks) + "" + String(nilai));
Serial.println("-----");
Wire.beginTransmission(I2C_SLAVE_ADDRESS); // kirim ke perangkat
Kawat.tulis(cmd); // mengirim char
Wire.write(indeks); // mengirim satu byte
Kawat.tulis(nilai); // mengirim satu byte
Kawat.endTransmisi();
tanggapan byte = 0;
bool hadResponse = salah;
jika (cmd == 'G'){
Wire.requestFrom(I2C_SLAVE_ADDRESS, 1);
while(Wire.available()) // slave mungkin mengirim kurang dari yang diminta
{
hadResponse = benar;
respon = Wire.read();
}
if (hadResponse == benar){
Serial.println("Mendapatkan tanggapan:");
Serial.println(tanggapan);
}lain{
Serial.println("Tidak ada respon, periksa alamat/koneksi");
}
}
}

lihat rawd1m_serial_input_i2c_char_byte_byte_v0.1.ino dihosting dengan ❤ oleh GitHub

Langkah 8: Langkah Selanjutnya

Periksa kembali secara berkala untuk memeriksa perubahan software/hardware.

Ubah perangkat lunak / perangkat keras sesuai kebutuhan Anda.

Komentari permintaan/pengoptimalan apa pun.

Direkomendasikan: