Isi kandungan:

IOT123 - SOLAR TRACKER - CONTROLLER: 8 Langkah
IOT123 - SOLAR TRACKER - CONTROLLER: 8 Langkah

Video: IOT123 - SOLAR TRACKER - CONTROLLER: 8 Langkah

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

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:

  1. Gunakan LDR dari yang asli Instructable untuk merasakan lokasi matahari yang hampir.
  2. Gerakkan servos untuk menghadap cahaya matahari.
  3. Pilihan untuk kepekaan pergerakan.
  4. Pilihan untuk ukuran langkah ketika bergerak ke matahari.
  5. Pilihan untuk kekangan sudut yang digunakan pada servo.
  6. Pilihan untuk kelewatan pergerakan.
  7. Antara muka I2C untuk menetapkan / mendapatkan nilai antara MCU.
  8. Tidur nyenyak antara pergerakan.

Perkara ini tidak termasuk (dan akan ditangani seiring dengan waktu):

  1. Hanya menggunakan kuasa pada waktu siang.
  2. Teringat kedudukan subuh dan pergi ke sana pada waktu senja ditutup.
  3. Mengeluarkan pengatur dari MCU.
  4. Melumpuhkan LED pada MCU.
  5. Mengubah semula kekuatan melalui VCC dan bukannya RAW.
  6. Menyediakan penyelesaian untuk berkelip tanpa kuasa terkawal dari penukar USB ke Serial TTL.
  7. 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

Bahan dan Alat
Bahan dan Alat
Bahan dan Alat
Bahan dan Alat
Bahan dan Alat
Bahan dan Alat

Kini terdapat senarai Bil Bahan dan Sumber yang lengkap.

  1. Bahagian bercetak 3D.
  2. Arduino Pro Mini 3.3V 8mHz
  3. 1 daripada 4x6cm Double Side Prototype PCB Universal Printed Circuit Board (akan dipotong separuh)
  4. 1 potongan header lelaki 40P (akan dipotong mengikut ukuran).
  5. 1 potongan header wanita 40P (akan dipotong mengikut ukuran).
  6. 4 dari 10K 1 / 4W restistor.
  7. Kawat cangkuk.
  8. Pateri dan Besi.
  9. 20 skru pengetuk kepala panci tahan karat 4G x 6mm.
  10. 4 skru penoreh kendiri 4G x 6mm tahan karat.
  11. 1 off bateri dan pemegang LiPo 3.7V (ditamatkan pada penyambung dupont 2P).
  12. 1 off header sudut kanan lelaki 2P
  13. 1 off suis SPDT 3 pin 2.54mm nada
  14. Gam Cyanoacrylate yang kuat
  15. Penyambung Dupont header 1P wanita (1 off biru, 1 off hijau).

Langkah 2: Memasang Litar

Memasang Litar
Memasang Litar
Memasang Litar
Memasang Litar
Memasang Litar
Memasang Litar

Litar pada masa ini tidak mempunyai Voltage Divider Circuit (volt meter).

  1. Potong Papan Lingkaran Bercetak Universal Prototaip PCB Sisi Ganda 4x6cm pada separuh pada paksi panjang.
  2. Potong kepala lelaki 40P menjadi kepingan:

    1. 2 diskaun 12P
    2. 3 diskaun 3P
    3. 6 diskaun 2P.
  3. Potong kepala wanita 40P menjadi beberapa bahagian:

    1. 2 diskaun 12P
    2. 1 dari 6P
  4. Solder 2 dari header 12Pfemale seperti yang ditunjukkan.
  5. Lekatkan spacer yang dikeluarkan dari header lelaki 3P (tambahan) ke bahagian bawah Suis SPDT dengan gam Cyanacrylate
  6. Di tempat sisi lain kemudian solder 6 off 2P, 2 off 3Pmale header dan suis SPDT seperti yang ditunjukkan.
  7. 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).
  8. Jejaki 3.3V dari PIN pematerian PIN LDR # 4, # 6, # 8, # 10 dan utas melalui lubang ke pin VCC header feamale (hijau).
  9. Jejak 3.3V di bahagian kepala wanita seperti yang ditunjukkan (merah) pematerian ke PINS # 1, # 12, # 15.
  10. 3.3V melalui lubang PIN header RAW sisi # yang disolder (merah) # 1.
  11. Jejak penyambungan oren dari PIN # 11 melalui lubang ke solder Pin wanita di sisi lain seperti yang ditunjukkan.
  12. Jejak dan solder wayar hookup dari # 20 hingga # 30 dan dari # 31 hingga # 13 dan # 16.
  13. Solder Female Header PIN # 11 to Male Header PIN # 11 melalui lubang.
  14. Sediakan 2 penyambung dupont sepanjang 30mm dengan header 1P wanita (1 off blue, 1 off green). Jalur dan timah hujung yang lain.
  15. Kawat Dupont biru solder ke # 28; pateri hijau Dupont wayar ke # 29.
  16. Di bahagian atas Arduino betulkan header wanita 6P kemudian solder.
  17. Di bahagian atas Arduino tetapkan header wanita sudut kanan 2P int # 29 dan # 30 kemudian solder.
  18. Di bahagian bawah Arduino tetapkan 2 dari 12P dan 1 dari pin lelaki 3P kemudian solder.
  19. Masukkan pin 12P lelaki Arduino ke header wanita 12P PCB.

Langkah 3: Melancarkan MCU

Menghidupkan MCU
Menghidupkan MCU
Menghidupkan MCU
Menghidupkan MCU
Menghidupkan MCU
Menghidupkan 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

Memasang Selongsong Litar
Memasang Selongsong Litar
Memasang Selongsong Litar
Memasang Selongsong Litar
Memasang Selongsong Litar
Memasang Selongsong Litar
  1. Pastikan Ardiuno Pro Mini dimasukkan ke dalam tajuk pada PCB.
  2. Masukkan pangkalan kotak pengawal SOLAR TRACKER ke dinding kotak pengawal SOLAR TRACKER dan lekatkan dengan 2 skru penoreh kendiri tahan karat 4G x 6mm.
  3. Masukkan Ardiuno Pro Mini + PCB dengan slot Header 6P ke dalam kekosongan di pangkalan kotak pengawal SOLAR TRACKER.
  4. Masukkan penutup kotak pengawal SOLAR TRACKER ke dinding kotak pengawal SOLAR TRACKER dan lekatkan dengan 2 skru penoreh kendiri tahan karat 4G x 6mm.
  5. 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

Menyambungkan Rig Memimpin ke Pengawal
Menyambungkan Rig Memimpin ke Pengawal
Menyambungkan Rig Memimpin ke Pengawal
Menyambungkan Rig Memimpin ke Pengawal
Menyambungkan Rig Memimpin ke Pengawal
Menyambungkan Rig Memimpin ke Pengawal

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.

  1. Masukkan sambungan LDR (tiada kekutuban) dari atas:

    1. Atas Kanan
    2. Kiri Atas
    3. Bawah Kanan
    4. Dibahagian bawah kiri
  2. Masukkan sambungan Servo (dengan wayar isyarat ke kiri) dari atas:

    1. Melintang
    2. Tegak
  3. TUNGGU SEDIA ADA UNTUK UJIAN KEMUDIAN: Masukkan plumbum Kuasa DC 3.7V + ve ke atas, -ve ke bawah.

Langkah 6: Menguji Pengawal

Image
Image

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.

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

    SDA (Pengawal) => D2 (D1M)

  4. Putar suis SPDT ke CONFIG
  5. Sambungkan USB ke PC
  6. Dari Arduino IDE mulakan tetingkap konsol dengan Port COM yang betul
  7. Pastikan "Newline" dan "9600 baud" dipilih
  8. Perintah dimasukkan ke dalam Kotak Teks Hantar diikuti dengan tombol Enter
  9. Perintah dalam format Character byte byte
  10. Sekiranya bait kedua (segmen ketiga) tidak disertakan 0 (sifar) dihantar oleh skrip
  11. 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: