Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Integrated Solar ChargeController, Inverter, PowerBank, Lamp

Komponen dan persediaan

Teknologi Microchip Atmega8
× 1
Konverter Uang
× 1
LED SparkFun - PCB Aluminium 3W (5 Paket, Putih Hangat
× 1
Tampilan Nokia 5110
× 1
SparkFun Heat Sink
× 1
SparkFun N-Channel MOSFET
× 4
Mosfet P-Channel SparkFun
× 1
Panel Surya 40 Watt atau Kurang untuk sistem 12 V
× 1
Baterai Lithium Ion SparkFun - Sel 18650
× 1
DC-DC 0.9V-5V ke Modul USB Peningkatan DC 5V Catu Daya Tingkatkan
× 1
NPN Transistor Serbaguna
× 1
12-0-12/220 Trafo yang Disadap Tengah
× 1
1N4007 – Tegangan Tinggi, Dioda Nilai Arus Tinggi
× 1
Male-Header 36 Posisi 1 Baris- Panjang (0,1")
× 1
Sakelar Geser
× 1
Sakelar Tombol Tekan SparkFun 12mm
× 1
Arduino Proto Shield
× 1
Papan Strip/Vero/Proto 8x11 cm
× 1
Arduino UNO
× 1
Arduino Nano R3
× 1
Arduino Mega 2560
× 1
Dioda Schottky Tegangan FW Rendah 5822
× 1
Kapasitor 10 F
× 1
Kapasitor 100 nF
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)
Motor Bor
Pistol lem panas (generik)

Aplikasi dan layanan online

Arduino IDE
AutoDesk 123D

Tentang proyek ini

Tentang Proyek ini

Saya memiliki beberapa panel surya, baterai 12 Volt, transformer, dan beberapa barang lagi yang tergeletak di sekitar untuk sementara waktu sambil berteriak keras untuk memanfaatkannya dengan baik. Maka lahirlah perangkat ini - solusi PV kecil lengkap di satu papan. Mari kita tinjau dulu yang melakukan apa, ya?

  • Pengisi daya adalah perangkat yang mengatur pengisian baterai/penyimpanan DC dari panel surya fotovoltaik dan pengosongan baterai oleh beban untuk memperpanjang masa pakai baterai.
  • Inverter adalah perangkat yang mengubah bentuk listrik DC menjadi bentuk AC untuk mengoperasikan Beban AC.
  • Power Bank menyediakan suplai DC 5V melalui port USB ke gadget/perangkat seluler untuk pengisian daya portabel atau pengisian daya di luar jaringan.
  • Lampu darurat adalah sumber cahaya LED super terang yang dapat digunakan saat listrik padam, berkemah, aktivitas di luar ruangan setelah senja.

Perangkat yang saya buat ini memiliki semua fitur ini, dua fitur terakhir didukung secara independen oleh baterai Li-ion on-board. Dengan panel surya (hingga 100 Watt), baterai asam timbal 12 Volt dan trafo- semua opsi dapat digunakan.

Versi Proto di Uno

Versi pertama dikembangkan di Uno Board dengan perangkat keras minimum dan opsi minimum. Layar Nokia dipasang langsung dan pelindung MOSFET dikembangkan untuk mendukung pengisian/pengosongan baterai. Tidak ada kontrol menu, tidak ada inverter, tidak ada pengisian PWM, dan fitur keren! Hanya on/off pengisian dan menunjukkan tingkat tegangan baterai dan panel. Melakukan pekerjaan tetapi tidak mendapat pesona!

Versi Lengkap di Protoboard

Kemudian saya mengembangkan yang baru ini dengan fitur berikut:

  • PWM Solar Charge Controller Hingga 100 Watt Panel
  • Inverter mini gelombang persegi 60 Watt
  • Kontrol beban DC 12 Volt hingga tiga
  • Pemuatan DC primer mendukung fitur hidup/mati otomatis
  • Bank Daya USB independen
  • Modul pengatur uang
  • Lampu LED darurat dengan kontrol Kedipan dan Kecerahan

2 tombol/saklar gulir terkontrol dan pilih menu berdasarkan kontrol pengguna, menampilkan opsi dan informasi status pada layar Nokia 5110. Sangat keren! Sisi belakang Terisolasi Lem Panas untuk perlindungan hubung singkat terhadap benda logam!

Ada beberapa fitur yang lebih nyaman seperti sakelar hidup/mati untuk lampu latar tampilan, memisahkan beban untuk pengoperasian independen dengan mematikan dari baterai internal.

Mengakses menu pada tampilan Nokia 5110 dengan tombol pengguna ditampilkan di sini:

Mari kita pelajari beberapa hal teknis!

Charge controller dapat berupa tipe On/Off, PWM atau MPPT. On/Off adalah bentuk pengontrol yang paling sederhana (versi saya 1 - gambar di atas) yang tidak mencekik arus pengisian saat tegangan baterai mendekati tegangan pengisian penuh.

Sedangkan PWM secara bertahap mengurangi arus pengisian saat baterai penuh. Kontroler PWM memiliki manfaat sebagai berikut:

  • Membantu memulihkan kapasitas baterai yang hilang dan menghilangkan sulfat pada baterai
  • Meningkatkan kemampuan baterai untuk menerima lebih banyak daya
  • Pertahankan kapasitas baterai rata-rata tinggi hingga 95%
  • Menyamakan sel baterai yang melayang, sehingga sel internal dapat mencapai potensi yang sama
  • Mengurangi pemanasan baterai dan gas sehingga mencegah kehilangan elektrolit
  • Memperlambat penuaan dan memperpanjang umur sistem

Tapi PWM tidak bisa mendapatkan sebagian besar daya listrik dari panel surya PV, karena menyeret panel untuk beroperasi di dekat tegangan baterai. MPPT adalah solusi untuk masalah ini yang pada dasarnya adalah konverter buck-boost DC ke DC yang dapat disesuaikan, dapat mengubah sebagian besar tenaga surya dibandingkan dengan pengontrol PWM.

Inverter dapat berupa gelombang persegi, gelombang sinus termodifikasi, dan jenis gelombang sinus murni. Inverter gelombang persegi sangat sederhana dalam desain dan beban DC kecil yang cukup baik seperti lampu AC, lampu CFL, kipas meja, besi solder tetapi tidak direkomendasikan untuk motor induktif, peralatan/catu daya yang halus karena distorsi harmonik.

Gelombang sinus termodifikasi adalah jenis gelombang sinus terbelakang yang dibuat dari gelombang persegi, lebih baik daripada inverter gelombang persegi biasa. Inverter gelombang sinus yang terbaik untuk semua jenis beban tetapi kompleks untuk merancang perangkat keras, algoritma perangkat lunak yang sulit untuk dioperasikan dan mahal untuk dibuat.

Regulator buck adalah konverter DC-DC step down, di sini saya telah menggunakan modul buck untuk mengisi baterai Li-ion 4,2 V yang memberi daya pada pengontrol (layar Arduino +), bank daya USB independen, lampu LED terpasang.

Sekarang bank daya USB pada dasarnya adalah dorongan DC-DC yang dapat mengubah kisaran tegangan di bawah 5 (seperti kisaran 3,3 hingga 4,2 volt) dari baterai Li-ion atau LiPo menjadi 5 volt yang merupakan tegangan bus USB yang dapat mengisi daya perangkat seluler .

Ini juga memiliki konverter uang untuk mengisi baterai itu. Dalam proyek saya, modul buck mengambil beberapa jus dari panel untuk mengisi baterai internal (on board).

Cara Kerja Perangkat Keras

Sebelum kita masuk ke detail, periksa gambar ini dari semua yang terhubung di sekitar perangkat:

Sistem ini memiliki berbagai perangkat keras untuk melayani tujuan yang berbeda. Tentu saja otaknya adalah mikrokontroler AVR Atmega8A (dapat digunakan Atmega328P dengan sedikit perubahan, dibahas di bawah) yang diprogram di Arduino.

Atmega8A baru dibakar dengan bootloader Arduino Optiboot8, Anda dapat membeli Arduino Mini/Atmega328 Bootloaded untuk menghindari kerumitan.

Pengontrol, layar, lampu LED, dan bank daya ditenagai dari baterai Li-ion terpasang. Dua tombol sentuh sesaat untuk mengakses menu yang ditampilkan, yang memungkinkan pengguna mengoperasikan berbagai fungsi perangkat. Sakelar adalah perangkat keras yang dilepaskan melalui kapasitor penghalus yang terhubung secara paralel.

Sakelar geser memungkinkan untuk menyalakan/mematikan perangkat sesuai kebutuhan.

Fungsi solar charging dilakukan oleh P-MOSFET yang digerakkan oleh rangkaian penggerak berbasis transistor 2N2222 yang dikendalikan melalui PWM dari mikrokontroler. PWM dikendalikan berdasarkan tingkat tegangan baterai eksternal. Arus dari panel surya mengalir melalui P-MOSFET ke baterai asam timbal. Ketika baterai terisi penuh, MOSFET dimatikan dari mikrokontroler. Setelah pengisian daya dimatikan, tegangan baterai mulai turun secara bertahap, ketika mencapai 13,6 volt pengisian dilanjutkan kembali dengan siklus tugas rendah untuk mempertahankan pengisian daya mengambang.

Beban DC 12 Volt dikontrol melalui N-MOSFET dengan mengontrol pin Gerbangnya dari Mikrokontroler.

LAMPU LED terpasang juga digerakkan melalui NMOS. Gerbang MOSFET ini dikontrol PWM untuk penyesuaian kecerahan LED.

Blok inverter terdiri dari 2 N-MOSFET yang bergantian On/Off untuk mensimulasikan AC. Dengan menambahkan trafo eksternal yang disadap tengah, suplai AC gelombang persegi dapat direalisasikan.

Gambar berikut menjelaskan tindakan inverter:

Dengan membiarkan arus mengalir melalui center tap dari kumparan transformator step up ke arah yang berlawanan atau menggunakan MOSFET, tegangan AC di sekunder dapat dibuat. Hal ini terjadi karena ketika MOSFET atas menyala dan MOSFET bawah mati, arus mengalir ke atas. Tetapi ketika MOSFET atas mati dan MOSFET Bawah menyala, arus mengalir ke bawah.

Kedua MOSFET harus diaktifkan dua kali frekuensi AC. Cek gambar berikut untuk memahaminya:

Untuk membuat AC 50 Hz, Gelombang Persegi bolak-balik diterapkan pada sisi rendah transformator yang disadap tengah 12-0-12V/220V. 50 Hz berarti waktu 20 mdtk untuk setiap gelombang.

Itu sebabnya 20 md/2 =10 md atau 100 kali Beralih Sinyal Gerbang yang diterapkan ke MOSFET penggerak Transformator (MOSFET inverter).

Peringatan !!! :Tegangan AC Mematikan Bagi Manusia, Dapat Menyebabkan Kematian/Cedera! Jangan pernah menyentuh sisi HV transformator dengan tangan kosong!

Jika fungsi inverter tidak digunakan, opsi Beban 2XDC memungkinkan untuk menggunakan dua beban DC 12 volt lagi di terminal Inverter.

Keajaiban Perangkat Lunak

Dua set kode disediakan, satu adalah kode lengkap dalam satu Tab Arduino, yang lain adalah Kode Tab sesuai dengan fungsi yang terpisah.

Saya telah menggeneralisasi kelompok tugas menjadi satu fungsi.

Misalnya :

Get_ADCVal() akan mengukur tegangan Panel, Baterai Internal, dan Baterai Eksternal, mengambil 20 sampel, rata-rata nilai tersebut, dan memperbarui informasi tegangan penyimpanan Variabel.

Context_Control() akan melakukan Interaksi Pengguna, Kontrol Tindakan, Pembaruan Info pada aktivitas terkait Tampilan.

Charging_Control() , Discharging_Control(), Load_Control() adalah fungsi latar belakang yang bertindak sebagai CLOSE LOOP untuk sistem, memonitor level tegangan baterai, mengontrol fungsi Auto Load, kontrol perlindungan Overcharge/Deep Discharge, dll.

Masukan pengguna dikumpulkan melalui sakelar tekan sesaat yang digerakkan oleh interupsi. Ketika sakelar ini ditekan, ISR terkait INT0/INT1 dijalankan. Dua variabel volatil dp dan ds perubahan. Variabel ketiga lainnya level bersama dengan dp (penunjuk tampilan ->) dan ds (pemilih konten tampilan) memungkinkan pengguna untuk melakukan perjalanan melalui menu/sub menu dan melakukan tindakan yang diperlukan.

16 bit TImer1 dari AVR dikonfigurasi untuk menghasilkan Timer Overflow Interrupt pada setiap 10 ms dan membalik PIN_INVP dan PIN_INVN ketika fungsi Inverter Aktif.

Semua fungsi Lcd_....() ada hubungannya dengan kontrol tampilan .

Atmega8A vs Atmega328P (Uno)

Sistem dapat dengan mudah ditingkatkan untuk bekerja dengan Atmega328P/Uno membuat perubahan berikut pada kode. Temukan dan ganti

 TIMSK dengan TIMSK1#define ADC_VREF 2.69 dengan #define ADC_VREF 1.11 #define ADCVDIV_R1 22 dengan #define ADCVDIV_R1 8.2  

Di bagian perangkat keras Anda harus menggunakan resistor 8.2K, bukan 22 K untuk memperkecil panel, voltase baterai ke rentang pengukuran ADC.

Video Aksi

Saya biasanya tidak hanya membaca kata-kata tentang beberapa proyek, alih-alih saya melihat videonya terlebih dahulu. Jika Anda seperti saya, nikmati videonya:

Lingkup Peningkatan

Saya kehabisan Ruang Flash di Atmega8A. Tidak dapat menambahkan beberapa fitur penting seperti :

  • Perlindungan Kelebihan Beban/Hubung Singkat Terkendali Perangkat Lunak
  • Beberapa Ikon Grafis dan Logo
  • Pengukuran Energi dan Penebangan
  • Perkiraan dan Alarm untuk waktu Pencadangan
  • Opsi Pengisian Daya Laptop
  • Dukungan untuk Sistem 6 Volt
  • Kontrol Beban Bluetooth
  • Kontrol Beban Berbasis Timer
  • Jam RTC untuk fitur keren lainnya
  • Solusi terhubung IoT

Jika Anda memiliki rencana untuk membuat sesuatu seperti ini, jangan lupa untuk menambahkan beberapa fitur ini!

Atmega328P(Uno) atau Arduino Mega mungkin merupakan kandidat yang lebih baik untuk menyertakan semua opsi ini.

Bagaimanapun, itu berhasil, saya senang dengan itu.

Sumber Daya Tambahan

  • Unduh Arduino 1. 0. 6 dengan dukungan papan Atmega8
  • Buka Arduino.exe , buka Alat> Papan> Optiboot8
  • Bakar bootloader menggunakan metode ini
  • Kompilasi dan Unggah Kode

Kode

  • Kode Tab Tunggal
  • Kode Lengkap
  • Bootloader
Kode Tab Tunggal Arduino
#define PIN_SCE 12#define PIN_RESET 13#define PIN_DC 8#define PIN_SDIN 7#define PIN_SCLK 6#define PIN_INVP 4#define PIN_INVN 5#define PIN_LOAD 9 // 12 v dc load#define PIN_LAMP 10 // LAMPU LED PUTIH #define PIN_BATTPWM 11 // Drive PMOS untuk Ext BAtt Charging #define PIN_BATTint_Sense A2#define PIN_SOLAR_Sense A0#define PIN_BATText_Sense A3#define ADC_VREF 2.695 // tegangan ref internal, sekitar 1,11V untuk Arduino Uno alias Atmega328A, ini Atmega328P saya! define ADCVDIV_R1 22 // 22 K pembagi tegangan bawah Resistor#define ADCVDIV_R2 175 // 175 K pembagi tegangan atas Resistor//const uint8_t skulljoke[] PROGMEM ={2,};// PIN 2 &3 DIGUNAKAN SEBAGAI SWITCH INTERRUPT// PIN 0 &1 SEBAGAI PEMROGRAMAN// RESET PIN SEBAGAI#definisikan LCD_C RENDAH#definisikan LCD_D TINGGI#definisikan LCD_X 84#definisikan LCD_Y 48uint8_t x=0;uint8_t level=0;uint8_t blinker=0; boolean Load_Auto_Enable=0;float maxADC_Voltage=0.0;float BattInt_Voltage=0.0;float BattExt_Voltage=0.0;float PV_Voltage=0.0;volatil int y=0;volatil uint8_t dp =0;volatil uint8_t ds volatil uint8_t cdc_level =0;//int i;pengaturan batal(batal){ LcdInitialise(); LcdClear(); LcdString("*ARDUBOY PV*"); LcdString("KONTROLER,"); LcdString("INVERTER AC,"); LcdString("POWER BANK, "); LcdString("Benda LAMPU!!"); penundaan(3000); analogReferensi(INTERNAL); maxADC_Voltage=(ADC_VREF/ADCVDIV_R1)*(ADCVDIV_R1+ADCVDIV_R2); pinMode(PIN_LOAD,OUTPUT); digitalWrite(PIN_LOAD,RENDAH); pinMode(2, INPUT_PULLUP); attachInterrupt(0, SW1, FALLING);// Interrupt untuk Swithc 1 pinMode(3, INPUT_PULLUP); attachInterrupt(1, SW2, FALLING);// Interupsi untuk Swithc 2 }void loop(void){ Get_ADCVal();Context_Control();Charging_Control();Discharging_Control();Load_Control();LcdClear();;}// /////////// ADC ///////////////void Get_ADCVal(void){int I=0;int J=0;int K=0;for( x=0;x<20;x++) {I=I+analogRead(PIN_BATTint_Sense);J=J+analogRead(PIN_BATText_Sense);K=K+analogRead(PIN_SOLAR_Sense); }// tegangan rata-rata BattInt_Voltage=I/20.0;BattExt_Voltage=J/20.0;PV_Voltage=K/20.0;BattInt_Voltage=maxADC_Voltage*BattInt_Voltage/1023.0;BattExt_Voltage=PV_maxADC_V. ////////// Tampilan dan Kontrol //////////////void Context_Control(void){ if(ds==0) ​​{show_menu();} if(ds==1 &&dp ==0) {show_info(); delay(100);} //LcdClear();Get_ADCVal();}//////////////////////Masuk ke Sub Menu Pertama////// ////////////////////// if(ds==1 &&dp ==1) { level=1; dp=0; while(level==1) { int temp=ds; LcdClear(); show_load_ctrl();delay(250); if (dp==0){ if(ds!=temp){Load_Auto_Enable=0;digitalWrite(PIN_LOAD,LOW);}} if (dp==1){if(ds!=temp){Load_Auto_Enable=0; digitalWrite(PIN_LOAD,HIGH);}} if (dp==2){ if(ds!=temp){Load_Auto_Enable=1;}} if (dp==3){show_load_ctrl();delay(250);level=0;dp=0;ds=0;} } }/////////////////////Masuk ke Sub Menu ke-2/////////// ///////////////////if(ds==1 &&dp ==2) { level=2; dp=0; while(level==2) { int temp=ds; show_inv_ctrl();delay(250); LcdClear(); if (dp==0){ if(ds!=temp){Timer1_Init();}} if (dp==1){ if(ds!=temp){Timer1_DeInit();}} if (dp==2 ){ if(ds!=temp){Timer1_DeInit();digitalWrite(PIN_INVP,1);digitalWrite(PIN_INVN,1);}} if (dp==3){show_inv_ctrl();delay(250);level=0;dp=0;ds=0;} } } ///////////////////////////////////////////////////// /////////////////// ///////////////Masuk ke Sub Menu ke-3/////////// //////////////////if(ds==1 &&dp ==3) { level=3; dp=0; while(level==3) { int temp=ds; LcdClear(); show_led_ctrl();delay(250); if (dp==0){blinker=0;if(ds!=temp) {if(y<=255){y=y+15;analogWrite(PIN_LAMP,y);}}} if (dp==1 ){blinker=0;if(ds!=temp) {if(y>=0){y=y-15;analogWrite(PIN_LAMP,y);}}} if (dp==2){if(ds! =temp) {blinker^=1;analogWrite(PIN_LAMP,127);delay(250);analogWrite(PIN_LAMP,0);}} if (dp==3){show_led_ctrl();delay(250);level=0;dp=0;ds=0;} } } ///////////////////////////////////////////////////// /////////////////// // {show_inv_ctrl();}// {show_led_ctrl();}//}if(blinker==1){analogWrite(PIN_LAMP, 0);}delay(250);if(blinker==1){analogWrite(PIN_LAMP,127);}}/////////////////////// /// Teks Menu yang akan ditampilkan pada tampilan Nokia 5110 //////////////////void show_menu(void){LcdXY(0,dp);LcdString("->" );LcdXY(15,0);LcdString("Info Sistem");LcdXY(15,1);LcdString("Beban DC+");LcdXY(15,2);LcdString("Beban AC~");LcdXY( 15,3);LcdString("Lampu LED");}void show_info(void){ LcdXY(0,0);LcdString("Bat_I=");LcdNumtoString(BattInt_Voltage);LcdString("v");LcdXY(0 ,1);LcdString("Bat_E=");LcdNumtoString(BattExt_Voltage);LcdString("v");LcdXY(0,2);LcdString("Sol_ P=");LcdNumtoString(PV_Voltage);LcdString("v");LcdXY(0,3);if(BattExt_Voltage>8.0){LcdString("Batt Conn OK");}else{LcdString("Hubungkan Batt");}if (PV_Voltage> 10.5 &&cdc_level!=3 &&cdc_level!=0){LcdString("Charging:ON ");}else{LcdString("Charging:OFF");}if (TCNT1>=45535 ){LcdString ("Inverter:ON");}else{LcdString("Inverter:OFF");}}void show_load_ctrl(void){LcdXY(0,dp);LcdString("->");LcdXY(15,0); LcdString("Muat Mati");LcdXY(15,1);LcdString("Muat Aktif");LcdXY(15,2);LcdString("Muat Otomatis");LcdXY(15,3);LcdString("Kembali" );LcdXY(0,4);LcdString("Harus Terhubung");LcdString("12V DC Load");}void show_inv_ctrl(void){LcdXY(0,dp);LcdString("->");LcdXY( 15,0);LcdString("Inv AC Aktif");LcdXY(15,1);LcdString("Inv AC Mati");LcdXY(15,2);LcdString("2XDC Load");LcdXY(15,3 );LcdString("Kembali");LcdXY(0,4);LcdString("Pemuatan 2XDC,TIDAK");LcdXY(0,5);LcdString("TRANSFORMER!");}void show_led_ctrl(void){LcdXY( 0,dp);LcdString("->");LcdXY(15,0);LcdString("LED ++");LcdXY(15,1);LcdString("LED --");LcdXY(15,2 );LcdString("LED Blk" );LcdXY(15,3);LcdString("Kembali");LcdXY(0,4);LcdString("LED DINONAKTIFKAN");LcdXY(0,5);LcdString("Saat INVR Aktif");}// //////////// Interrupt ISR //////////////void SW1(){dp++;if(dp>
3){dp=0;} }void SW2 (){ds^=1;} ISR(TIMER1_OVF_vect) { noInterrupts(); TCNT1 =45535; // TCNT1 =25535; siklus^=1; jika(siklus==0); { digitalWrite(PIN_INVP,TINGGI); delayMicroseconds(1); // pita mati digitalWrite(PIN_INVN,LOW); delayMicroseconds(1); } if(siklus==1) { digitalWrite(PIN_INVP,RENDAH); delayMicroseconds(1); // digitalWrite pita mati(PIN_INVN,HIGH); delayMicroseconds(1); } menyela(); }/////////////Nokia 5110 Fungsi //////////byte konstanta ASCII[][5] ={{0x00, 0x00, 0x00, 0x00, 0x00} / / 20,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 ",{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 # ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &,{ 0x00, 0x05, 0x03, 0x00, 0x00} // 27 ',{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 ),{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6,{0x01, 0x71, 0x09, 0x05, 0x03 } // 37 7,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9,{0x00, 0x36, 0x36, 0x00, 0x00} / / 3a :,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b;,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e>,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @, {0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C,{0x7f , 0x41, 0x41, 0x22, 0x1c} // 44 D,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F,{0x3e, 0x41 , 0x49, 0x49, 0x7a} // 47 G,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I,{0x20, 0x40, 0x41 , 0x3f, 0x01} // 4a J,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L,{0x7f, 0x02, 0x0c, 0x02 , 0x7f} // 4d M,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O,{0x7f, 0x09, 0x09, 0x09, 0x06 } // 50 P,{0x3e, 0x41, 0x 51, 0x21, 0x5e} // 51 Q,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ],{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `, {0x20, 0x54, 0x54, 0x54, 0x78} // 61 a,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c,{0x38 , 0x44, 0x44, 0x48, 0x7f} // 64 hari,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f,{0x0c, 0x52 , 0x52, 0x52, 0x3e} // 67 g,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 j,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i,{0x20, 0x40, 0x44 , 0x3d, 0x00} // 6a j,{0 x7f, 0x10, 0x28, 0x44, 0x00} // 6b k,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 d,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d },{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f };void LcdCharacter(char character){ LcdWrite(LCD_D, 0x00); for (int indeks =0; indeks <5; indeks++) { LcdWrite(LCD_D, ASCII[karakter - 0x20][indeks]); } LcdWrite(LCD_D, 0x00);}void LcdClear(void){ for (int indeks =0; indeks  0) {digitalWrite(PIN_LOAD,HIGH);} if (Load_Auto_Enable ==1 &&PV_Voltage>10.5 || cdc_level==0) {digitalWrite(PIN_LOAD,LOW);} }void Charging_Control (void){// BattExt_Voltage Level 14.3 Mengisi daya mati, 13,5 atau lebih rendah Mengisi daya aktif, 10.8 Memuat mati, 12,5 Memuat aktif // kondisi berikut ini mencegah upaya pengisian pada malam hari % malam PV adalah 0 volt !if (PV_Voltage> 10.5 &&BattExt_Voltage>8.0){if (BattExt_Voltage <=12.5) { analogWrite(PIN_BATTPWM,255); cdc_level =0; } if (BattExt_Voltage> 12,5 &&BattExt_Voltage <=12.9) { analogWrite(PIN_BATTPWM,200); cdc_level =1; } if (BattExt_Voltage> 12.9 &&BattExt_Voltage <=13.3) { analogWrite(PIN_BATTPWM,160); cdc_level =1; } if (BattExt_Voltage> 13.3 &&BattExt_Voltage <=13.6) { analogWrite(PIN_BATTPWM,120); cdc_level =2; } if (BattExt_Voltage> 13.6 &&BattExt_Voltage <=13.9 &&cdc_level ==2) { analogWrite(PIN_BATTPWM,80); cdc_level =2; } if (BattExt_Voltage> 13.9 &&BattExt_Voltage <=14.3 &&cdc_level ==2) { analogWrite(PIN_BATTPWM,40); cdc_level =2; }// Penguncian Tegangan Lebih, sementara cdc_level 3, TANPA Pengisian! Pengisian Dilanjutkan ketika cdc adalah 2 yang di bawah 13,5 v if (BattExt_Voltage> 14,3) { analogWrite(PIN_BATTPWM,0); cdc_level =3; } }else {analogWrite(PIN_BATTPWM,0);cdc_level =3;}}/// Di bawah tegangan Lockoutvoid Discharging_Control (void){if (BattExt_Voltage <=10.8) { cdc_level =0; {digitalWrite(PIN_LOAD,LOW);} Timer1_DeInit(); }}/////////////// Timer 2 Fungsi /////////////// Bagian kode ini ditulis dalam stylevoid AVR Timer1_Init(void) { tidak ada interupsi(); // nonaktifkan semua interupsi pinMode(PIN_INVP,OUTPUT); pinMode(PIN_INVN,OUTPUT); TCCR1A =0; TCCR1B =0; /* ========================================50 Hz AC berarti 20 ms Gelombang yang dibentuk oleh 2, 10 ms Pulsa dari pin PIN_INVP dan PIN_INVN jadi kedua pin ini harus beralih pada 100 Hz ! Now 100 Hz =.01 sec Arduino System Clock 16 MHz =16000000 cycle in 0,01 sec we have 160000 cycles using prescaler of 8 (CS11) makes timer count 160000/8 =20000 timer ticks Since the timer 2 is 16 bit Up Counter and it Overflows at 65635 value we need to start counting from 65535-20000 =from 45535 value upto 65535 thus TCNT1 starts at 45535 ..then tick tick tick ... 46000 .... 50000 .............. 65536 !!! Boom Timer Over Flow Interrupt and toggle the Inverter driving pins in ISR and start counting from 45535 Again !!! (This happens in the Background) ========================================*/ TCNT1 =45535; //TCNT1 =25535; TCCR1B |=(1 < 
Full CodeC/C++
Code Organized &Readable
No preview (download only).
BootloadersC/C++
Tidak ada pratinjau (hanya unduhan).

Skema


Proses manufaktur

  1. Apa Itu Inverter Surya dan Bagaimana Cara Kerjanya?
  2. Lampu Halogen
  3. Lampu Lava
  4. Sistem Pemanas Tenaga Surya
  5. Sirkuit Terintegrasi
  6. Sel Surya
  7. Lampu Lalu Lintas Cerdas
  8. Pengontrol Game Arduino
  9. Solar Tracker V2.0
  10. Pengertian energi matahari