工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

9Vニッケル水素二次電池用インテリジェント充電器V1

コンポーネントと消耗品

>
Arduino UNO
× 1
SparkFun I2CDACブレイクアウト-MCP4725
× 1
出力調整可能なリニアレギュレータ
× 1
Texas Instruments General Purpose Dual Op-Amp
× 1
抵抗6.8kオーム
× 2
抵抗3.3kオーム
× 1
抵抗5.1kオーム
× 1
抵抗1kオーム
× 1
抵抗10オーム
× 1
リレー(汎用)
× 1
抵抗20kオーム
× 1
SparkFunブレッドボード電源5V / 3.3V
× 1
電源装置17V
× 1
YwRobotI2CシリアルLCD1602モジュール
× 1

このプロジェクトについて

数時間で9Vニッケル水素電池を充電できるスマート充電器チャットを探しましたが、見つかりませんでした。さらに、私が見つけたすべての充電器は本当に「ダム」でした。充電電流が不明で、バッテリーが完全に充電された後に充電を終了する機能がありません。このような充電器には、バッテリーが過充電されて寿命が大幅に短くなる可能性があるという問題があります。そこで、「スマート」な充電器を作ることにしました。

最初のバージョンはシンプルに保つつもりなので、定電流での充電、バッテリーが完全に充電された後の自動充電終了、トリクル充電、バッテリーに転送された電荷の測定などの基本的なことができます。

次のバージョンでは、放電、容量測定、サイクリングなどの便利な機能をいくつか追加します。

警告:大電流でバッテリーを充電すると、バッテリーの爆発や火災の原因となる可能性があります。充電器を放置しないでください。また、アルカリとして充電することを意図していないバッテリーを充電しようとしないでください。この充電器はNiMHバッテリーでのみテストされています(それでもあなたは自己責任で使用しており、デザインやコードのバグが原因で損傷が発生した場合、私は一切の責任を負いません)。他の種類のバッテリーの悔しさは、コードの変更が必要になります。

理論

充電器に必要なパラメータを理解するのに役立つ、覚えておくと便利な事実。

C-バッテリーの公称容量に等しい電流

Cレートで充電すると、単一セル電圧が1.6Vに達する可能性があります。古い電池の場合、この電圧は高くなる可能性があります。

単一セルの公称電圧は1.2Vですが、完全に充電されたセルの開回路電圧は最大1.5ボルトです。

バッテリーが完全に充電された後は、0.025 C(C / 40)未満のトリクル充電率をお勧めします。

NiMHバッテリーを充電するには、通常2つのオプションがあります。

1.急速充電。充電電流0.5C-1C。充電状態は、dV / dt(電圧変化率)またはdT / dt(温度変化率)によって監視および終了する必要があります

2.充電が遅い。充電電流0.1C。充電時間は14〜16時間です。タイマーによる充電終了。低電流ではdT / dtの充電終了は不可能です。文献によると、dV / dt終端は、0.5C未満の電流では信頼できない可能性があります。

<図>

充電回路の基本パラメータ

9V電池には通常、7つの直列接続されたセルがありますが、場合によっては6または8セルのセルがあります。電圧レギュレータは、少なくとも8 * 1.6 =12.8Vまでの充電電圧を提供できる必要があります。 LM317レギュレータのドロップアウト電圧は最大2Vであるため、供給電圧は約15Vである必要があります(これは電流検出抵抗の電圧降下を考慮していません)。

最大充電電流が200mAで電流検出抵抗が10オームの場合、電流検出抵抗の追加の降下は2Vであるため、17Vの供給電圧が必要です。

完全に放電されたセルは、負の電圧でさえ非常に低い場合があります。レギュレータの最小電圧は理想的には0である必要がありますが、LM317を使用すると1.2Vまで低くなる可能性があります。

回路

<図> <図>

回路の説明

基本的な考え方は、充電電流を測定し、目的の電流に達するまでレギュレータの電圧を調整することです。電流検出抵抗R5の電圧降下を測定して測定された電流。 I =V / R。

SparkFun I2CDACブレークアウト-MCP4725-22ビットデジタル-アナログコンバーターを使用して電圧を制御します。出力電圧カムは、0〜5VのI2Cを介して構成できます。より広い範囲で電圧を調整できる必要があるため、DACの出力電圧を増幅するために使用される0〜15VのオペアンプLM358。抵抗R4とR3によって設定されたオペアンプの増幅。ゲイン=1 + R4 / R3 =1 + 6800/3300 =3.06なので、オペアンプの出力電圧は約0〜15Vです。

LM358の最大出力電流は50mAであるため、LM317調整可能電圧レギュレータを使用してより高い電流を制御します。 LM317のADJ端子に接続されたオペアンプの出力。 LM317はADJ端子とOUT端子の間で1.2Vを維持するため、バッテリーの実際の電圧は1.2〜16.2Vの範囲で構成できます。 LM317は、レギュレーションを維持するために最低3.5mAの電流を必要とします。したがって、バッテリーが接続されていない場合のレギュレーションを確保するために、1kOhmの抵抗R6が使用されます。出力電圧をフィルタリングし、LM317の安定性を向上させるために使用されるコンデンサC1。

2つの異なるポイントで測定された電圧。

1.ArduinoのピンA2に接続された抵抗R5。測定された抵抗器の電圧と、Ichargeing =V / R

として計算された充電電流よりも

2.バッテリーの電圧は最大16.2Vになる可能性があるため、Arduinoで許可されているように、抵抗分割器R1、R2を使用して電圧を5V未満にしました。 ArduinoのピンA0に接続された分周器の出力。 R1 =5.1kオームおよびR2 =20kオームの場合Vout =Vin /(20000 + 5100)* 5100 =0.2したがって、バッテリー電圧を5で割った値。

バッテリーを充電回路から切り離すために使用されるリレー。私が使用したフォトリレーで確認できますが、通常は5V制御のリレーであればどれでも使用できます。バッテリーを接続してリレーの接点を通常開いている方が安全です。

YwRobot I2C SERIAL LCD 1602 MODULEを使用して充電器のステータスを表示しましたが、他のI2C制御LCDモジュールを使用できます。 YwRobot LCDモジュールは標準のLiquidCrystal_I2Cライブラリでサポートされていないようです。そのため、新しいLiquidCrystalライブラリを使用しました。別のLCDモジュールを使用している場合は、次の行を変更する必要があります。

  LiquidCrystal_I2C lcd(0x27、2、1、0、4、5、6、7、3、POSITIVE); // 16文字と2行の表示の場合、LCDアドレスを0x27に設定します 

デジタル-アナログコンバーターとLCDに電力を供給するために、SparkFunブレッドボード電源5V /3.3Vを使用しました。 Arduinoボードから5Vを使用しても大丈夫でしょう。

また、充電回路に17Vを供給する必要があります。電源がない場合は、次のように調整可能なDC / DCコンバーターを使用できます

http://www.ebay.com/itm/DC-DC-Adjustable-Step-up-boost-Power-Converter-Module-XL6009-Replace-LM2577-/310717070508

<図> <図> <図>

機能性

ワイヤーはあまり必要ないので、充電を設定するためのボタンはありません。コードでのみ構成されたChagrincurrent。 Charger.inoで希望の充電電流を設定する必要があります

  // ***************************課金パラメータ************* **************************** // ******************** ************************************************** ******************* float target_current_mA =30; //充電電流mAfloatbattery_nominal_capacity_mA =170; //バッテリーの公称容量mAfloatmax_time_for_trickle_charge =6; //最大トリクル充電時間(分)// **************************************** ************************************************* / / ************************************************* ****************************************  

target_current_mA-一定の充電電流

max_time_for_trickle_charge-トリクル充電の最大分数。最大600(10時間)に設定できます

battery_nominal_capacity_mA-細流電流の計算に使用されるバッテリー容量

通常、充電電流は公称容量まで可​​能です。公称容量が170mAhのバッテリーの場合、最大充電電流は170mAです。最小充電電流は通常、170mAhバッテリーでC / 10-17mAです。

電源が入った後、充電器はバッテリーが接続されているかどうかをチェックします。バッテリーが接続されている場合、バッテリーは完全に充電されるまで設定された定電流で充電されます。 5分間に負のdV / dtを検出すると、充電が終了しました。充電が完了すると、充電器は現在のC / 40でトリクル充電に切り替わります。最大トリクル充電時間が経過すると、充電器はバッテリーから切断されます。

<図>

1-dV / dt

2-充電時間(分)

<図> <図>

1-充電時間

2-電荷がバッテリーに転送されました

NiMHバッテリーに関する追加情報:

1. http://data.energizer.com/PDFs/nickelmetalhydrate_appman.pdf

2. http://batteryuniversity.com/learn/article/charge_nickel_metal_hydrate

コード

  • Charger.ino
  • main.ino
  • hw.ino
  • lcd.ino
  • calculations.ino
  • このプロジェクトで使用される新しいLiquidCrystalライブラリ
Charger.ino Arduino
メインファイル
 //これは9VNiMHバッテリーを充電するためのものです//バッテリーは6,7または8個の1.25Vセルを持つことができます//これにより公称電圧は7.5〜10Vになります#include  #include  #include  #include  #include  LiquidCrystal_I2C lcd(0x27、2、1、0、4、5、6、7、3、POSITIVE); // 16文字と2行の表示の場合はLCDアドレスを0x27に設定します//ハードウェアdefenitions#define MCP4725_ADDR 0x60 // DACアドレス#define DAC_REF_VOLTAGE 5.0#define CHARGE_RELAY_PIN 2#define DISCONNECT_CHARGE_RELAY HIGH#define CONNECT_CHARGE_RELAY LOW#define CURRENT_SENSING_SESISTOR 10.2 // OHm#define BATTERY_VOLTAGE_PIN A0#define R1 5090 //電圧検出ディバイダーのローサイド抵抗#defineR2 19910 //電圧検出ディバイダーのハイサイド抵抗#defineADC_REF_VOLTAGE4.89 // Arduinoの実際の供給電圧または適切なAREF電圧ADCから電圧への変換#defineR3 3300.0#define R4 6800.0#define AMP_GAIN(1 + R4 / R3)//さまざまな定義//#defineMINIMUM_VOLTAGE 8.1 //レギュレータ後の最小電圧#defineBATTERY_GOOD_VOLTAGE_THRESHOLD7.0#define MAXIMIM_ALLOWED_CURRENT 200 //最大バッテリー電流mA(ハードカットオフ)#defineMAXIMUM_BATTERY_VOLTAGE 15.0 //最大許容バッテリー電圧V(ハードカットオフ)#defineVOLTAGE_STEP 0.001 //電圧のステップregulation#define POINTS_FOR_AVERAGING 100 //平均化に必要なポイント数#defineMEASURE2MEASURE_US 5000 //マイクロ秒単位の測定間の時間(2回のアナログ読み取りのために200以上必要)#define VOLTAGE_LOG_TIME_MIN 30.0 // dVの電圧を節約するための分単位の時間/ dT cutoff#define MINUTES_TO_LOG 5#define TRICKLE_CURRENT_RATIO 40 // Chargestates#define INITIALIZATION 0#define NO_BATTERY 5#define BATTERY_CONNECTED 10#define BATTERY_VOLTAGE_LOW 15#define CURRENT_RAMP_UP 30#define CURRENT_RAMP_UP 20#define CHARG 37#define UNEXPECTED_CURRENT_FALL 40#define UNABLE_TO_REACH_CURRENT 60#define FULLY_CHARGED 70#define CURRENT_TOO_HIGH 80#define REGULATION_FAILED 90#define OVERCURRENT 100#define OVERVOLTAGE 101#define FINAL_STATE 200 /// unsigned int //平均化の場合longunsigned int Voltage_sum、current_sum; //平均化の合計f loatレギュレーター_電圧_コード、抵抗器_電圧、csr_電圧_コード、レギュレーター_電圧、電流_mA、バッテリー_電圧; //測定値フロートtmp_resistor_voltage、tmp_current_mA、tmp_regulator_volatile、tmp_battery_voltage; int i、j、charger_state; short unsigned int last_second、lcd_last_second;; String msg、eoc_line1、eoc_line2; unsigned char sec_index、min_index; // long long int Charged_started; float sec_l​​og [60]、min_log [MINUTES_TO_LOG]、last_blf; float tickle_current_mA; int total_minutes_average =0; elapsedMillis ChargingTimeMillis 0; float last_dac_voltage =0; // Messagesconst char msg_battery_detected [] PROGMEM ="バッテリーが検出されました"; constchar msg_no_battery [] PROGMEM ="バッテリーなし"; constchar msg_battery_ok [] PROGMEM ="Battery ok"; const char msg_ PROGMEM ="バッテリー電圧が低すぎます"; constchar msg_voltage_too_low_short [] PROGMEM ="Vバッテリー残量が少なくなっています"; constchar msg_ramp_u p [] PROGMEM ="Ramp up"; const char msg_charge [] PROGMEM ="Charging"; const char msg_space [] PROGMEM =""; const char msg_ramp_down [] PROGMEM ="Ramp down"; const char msg_trickle_charge [] PROGMEM ="Trickle Charge"; const char msg_no_current [] PROGMEM ="No current"; const char msg_current_unreachable [] PROGMEM ="I unreachable"; const char msg_current_unreachable_long [] PROGMEM ="希望の電流に到達できません"; const char msg_completed [] PROGMEM ="Completed"; const char msg_charge [] PROGMEM ="Charge"; const char msg_high_current [] PROGMEM ="High current"; const char msg_regulation_fault [] PROGMEM ="Regulation fault"; const char msg_overcurrent [] PROGMEM ="Current too high "; const char msg_overvoltage [] PROGMEM ="電圧が高すぎます "; const char msg_trickle_completed [] PROGMEM ="トリクルが終了しました "; // ******************** *******充電パラメータ***************************************** // ************************************************ *********************************** ****** float target_current_mA =30; //充電電流mAfloatbattery_nominal_capacity_mA =170; //バッテリーの公称容量mAfloatmax_time_for_trickle_charge =6; //最大トリクル充電時間(分)// **************************************** ************************************************* / / ************************************************* **************************************** struct mytime {unsigned char hours; unsignedchar分; unsigned int total_minutes;} lapsed_time; void setup(){pinMode(CHARGE_RELAY_PIN、OUTPUT);切断_充電_回路(); //充電器ftomバッテリーを切断しますWire.begin(); // I2C dac_write_voltage(0); //可能な限り低い電流セットを確認しますSerial.begin(115200); last_second =second(); lcd_last_second =second(); log_last_second =second(); Timer1.initialize(MEASURE2MEASURE_US); //バッテリーの電圧と電流の測定に使用します(マイクロ秒)Timer1.attachInterrupt(read_hw); // read_hw()をタイマーオーバーフロー割り込みとしてアタッチしますaverageing_index =0; sec_index =0; min_index =0; Charger_state =0; //ステートマシンの初期状態wanted_dac_voltage =0; // shureの最小電圧をlast_blf =1.0に出力します。 tickle_current_mA =battery_nominal_capacity_mA / TRICKLE_CURRENT_RATIO; // ChargeingTimeMillis =0; // LCD lcd.begin(16,2); lcd.backlight(); lcd.clear(); update_lcd(F( "Power up ...")、empty_string); delay(1000);} float log_battery_voltage(){//(log_last_second ==second())return last_blf;の場合、1秒に1回だけログに記録します。それ以外の場合、log_last_second =second(); sec_l​​og [sec_index] =battery_voltage; if(sec_index <59){sec_index ++; } else {// 1分がログに記録された場合// 1分あたりの平均を計算するif(min_index> =MINUTES_TO_LOG)min_index =0; sec_index =0; float sum_v =0; for(i =0; i <60; i ++){sum_v + =sec_l​​og [i]; } float min_average =sum_v / 60.0; for(i =1; i  
main.ino Arduino
 void loop(){String msg1; switch(charger_state){case INITIALIZATION://初期状態disconnect_charge_circuit(); // shureリレーを切断しますdac_write_voltage(0); //可能な限り低い電流を設定しますwanted_dac_voltage =0; // shureの最小電圧出力遅延を作成します(100); read_status(); if(battery_voltage> 0.1){charger_state =BATTERY_CONNECTED; //バッテリーが検出されましたupdate_lcd(M2S(msg_battery_detected)、empty_string); Serial.println(M2S(msg_battery_detected)); delay(2000); } else {//バッテリーなしSerial.println(M2S(msg_no_battery)); update_lcd(M2S(msg_no_battery)、construct_status_string()); Charger_state =NO_BATTERY; //バッテリー検出遅延(1000); } 壊す;ケースNO_BATTERY://バッテリーなしread_status(); if(battery_voltage> 0.1){charger_state =BATTERY_CONNECTED; //バッテリーが検出されましたSerial.println(M2S(msg_battery_detected)); update_lcd(M2S(msg_battery_detected)、construct_status_string()); delay(1500); } else {//この状態のバッテリーがない場合update_lcd(M2S(msg_no_battery)、construct_status_string()); delay(1100); } 壊す; case BATTERY_CONNECTED://バッテリー接続dac_write_voltage(0); //可能な限り低い電流セットwanted_dac_voltage =0を確認してください。 delay(100); read_status(); if(battery_voltage> BATTERY_GOOD_VOLTAGE_THRESHOLD){charger_state =CURRENT_RAMP_UP; //電流ランプアップの充電を開始// snprintf(welcome、sizeof(welcome)、 "Firmware:V%d。%d%d"、ver、ver2、ver3); update_lcd(M2S(msg_battery_ok)、construct_status_string()); Serial.println(M2S(msg_battery_ok)); delay(2000); want_dac_voltage =get_approximated_dac_voltage(battery_voltage); //必要なレギュレーター電圧を設定します//Serial.println(get_approximated_dac_voltage(battery_voltage)); connect_charge_circuit(); delay(200); } else {charger_state =BATTERY_VOLTAGE_LOW; //バッテリー電圧が低すぎますSerial.println(M2S(msg_voltage_too_low)); update_lcd(M2S(msg_voltage_too_low_short)、construct_status_string()); delay(1000); } 壊す;ケースBATTERY_VOLTAGE_LOW://バッテリー電圧が低すぎますupdate_lcd(M2S(msg_voltage_too_low_short)、construct_status_string()); Serial.println(M2S(msg_voltage_too_low)); Charger_state =FINAL_STATE; //停止ブレーク; case CURRENT_RAMP_UP:///電流ランプアップ// if(current_mA <1.0)charger_state =40; //電流が予期せず低下したread_status(); update_lcd(M2S(msg_ramp_up)、construct_status_string()); delay(50); if(current_mA  MAXIMUM_BATTERY_VOLTAGE)charger_state =OVERVOLTAGE; //過電圧if(abs(current_mA-target_current_mA)> 0.2){//電流がターゲットから外れた場合if(current_mA  5){//規制に失敗しました、差が高すぎますcharger_state =REGULATION_FAILED; //規制エラー、差が高すぎます} dac_write_volatile (wanted_dac_voltage); if(total_minutes_average  trickle_current_mA){if(wanted_dac_voltage> VOLTAGE_STEP){wanted_dac_voltage =wanted_dac_voltage-VOLTAGE_STEP; dac_write_voltage(wanted_dac_voltage); } else Charger_state =CURRENT_TOO_HIGH; //電流をトリクルレートに下げることができません} else {charger_state =TRICKLE; //充電TrickleChargingTimeMillis =0; Serial.println(M2S(msg_trickle_charge)); } 壊す;ケースTRICKLE://充電遅延(200); read_status(); if(current_mA <0.2)charger_state =UNEXPECTED_CURRENT_FALL; //電流が予期せず低下したif(battery_volatile> MAXIMUM_BATTERY_VOLTAGE)charger_state =OVERVOLTAGE; //過電圧if(abs(current_mA-trickle_current_mA)> 0.2){//電流がターゲットから外れた場合if(current_mA  5){//規制に失敗しました、差が高すぎますcharger_state =REGULATION_FAILED; //規制エラー、差が高すぎます} dac_write_volatile (wanted_dac_voltage); // if(total_minutes_average  max_time_for_trickle_charge){//最大許容トリクル充電update_lcd(eoc_line1、eoc_line2); Charger_state =END_OF_TRICKLE; //切断disconnect_charge_circuit(); //充電器をバッテリーから外します} break;ケースEND_OF_TRICKLE:if((second()%8)<4)update_lcd(M2S(msg_trickle_completed)、construct_status_string()); else update_lcd(eoc_line1、eoc_line2);壊す; case UNEXPECTED_CURRENT_FALL:// Currentが予期せずに落ちたSerial.println(F( "Currentが予期せず落ちた"));切断_充電_回路(); want_dac_voltage =0; update_lcd(M2S(msg_no_current)、construct_status_string()); Charger_state =FINAL_STATE; // Halt delay(1000);壊す;ケースUNABLE_TO_REACH_CURRENT://目的の現在のSerial.println(M2S(msg_current_unreachable_long));に到達できません。切断_充電_回路(); want_dac_voltage =0; dac_write_voltage(wanted_dac_voltage); delay(1000); update_lcd(M2S(msg_current_unreachable)、construct_status_string()); Charger_state =FINAL_STATE; //停止ブレーク;ケースFULLY_CHARGED://完全に充電されたelapsed_time =mills2time(ChargingTimeMillis); int Charge_mAh; Charge_mAh =calculate_charge(ChargingTimeMillis); msg =String(M2S(msg_completed)+ M2S(msg_space)+ construct_time_string(elapsed_time)); msg1 =String(M2S(msg_charge)+ M2S(msg_space)+ String(charge_mAh)+ String( "mAh")); eoc_line1 =msg; eoc_line2 =msg1; update_lcd(msg、msg1); Serial.println(msg); // disconnect_charge_circuit(); // wanted_dac_voltage =0; // dac_write_voltage(wanted_dac_voltage); delay(3000); Charger_state =CURRENT_RAMP_DOWN; //停止ブレーク; case CURRENT_TOO_HIGH://電流が高すぎますSerial.println(F( "電流をターゲットに下げることができません"));切断_充電_回路(); want_dac_voltage =0; dac_write_voltage(0); update_lcd(M2S(msg_high_current)、construct_status_string()); delay(1000); Charger_state =FINAL_STATE; //停止ブレーク;ケースREGULATION_FAILED://規制に失敗しましたSerial.println(M2S(msg_regulation_fault));切断_充電_回路(); want_dac_voltage =0; dac_write_voltage(0); update_lcd(M2S(msg_regulation_fault)、construct_status_string()); delay(1000); Charger_state =FINAL_STATE; //停止ブレーク;ケースOVERCURRENT:// Overcurrentdisconnect_charge_circuit(); Serial.println(M2S(msg_overcurrent)); want_dac_voltage =0; dac_write_voltage(wanted_dac_voltage); update_lcd(M2S(msg_overcurrent)、construct_status_string()); delay(1000); Charger_state =FINAL_STATE; //停止ブレーク;ケースOVERVOLTAGE://過電圧disconnect_charge_circuit(); Serial.println(M2S(msg_overvoltage)); want_dac_voltage =0; dac_write_voltage(wanted_dac_voltage); update_lcd(M2S(msg_overvoltage)、construct_status_string()); delay(1000); Charger_state =FINAL_STATE; //停止ブレーク;ケースFINAL_STATE:// Halt delay(10000);壊す;デフォルト:wanted_dac_voltage =0; Charger_state =0; } //Serial.println(current_mA); //Serial.print("Current="); //Serial.print(current_mA); //Serial.println("mA "); //Serial.print("DAC電圧 "); //Serial.println(dac_voltage); //Serial.print( "必要なDAC電圧"); //Serial.println(wanted_dac_voltage); //Serial.print(current_mA); //Serial.print( ""); //Serial.print(dac_voltage); //Serial.print( ""); read_status(); if(last_second!=second()){Serial.print(current_mA); Serial.print( "、"); //Serial.print(resistor_voltage); //Serial.print( "、"); //Serial.print(dac_voltage); //Serial.print( "、"); //Serial.print(regulator_voltage); //Serial.print( "、"); Serial.println(battery_voltage); last_second =second(); }} 
hw.ino Arduino
 float get_approximated_dac_voltage(float vbat){// float offset_voltage =1.2 / R3 *(R3 + R4);フロートオフセット電圧=1.2; float adc_voltage =(vbat-offset_voltage)/AMP_GAIN-0.5; if(adc_voltage <0)adc_voltage =0; return adc_voltage;} int Voltage_to_code(float Voltage){int code =4095.0 / DAC_REF_VOLTAGE * Voltage;リターンコード;} void dac_write(int code){Wire.beginTransmission(MCP4725_ADDR); Wire.write(64); // DACを更新するcmdWire.write(code>> 4); //最上位8ビット... Wire.write((code&15)<<4); //最下位4ビット... Wire.endTransmission();} void read_status(){volatile_sum =0; current_sum =0; for(i =0; i  =POINTS_FOR_AVERAGING)averageing_index =0; if(tmp_battery_voltage> MAXIMUM_BATTERY_VOLTAGE){disconnect_charge_circuit(); //充電器をバッテリーから切断しますcharger_state =OVERVOLTAGE; } if(tmp_current_mA> MAXIMIM_ALLOWED_CURRENT){disconnect_charge_circuit(); //充電器をバッテリーから切断しますcharger_state =OVERCURRENT; }} voiddisconnect_charge_circuit(){digitalWrite(CHARGE_RELAY_PIN、DISCONNECT_CHARGE_RELAY); //充電器をバッテリーから外します} void connect_charge_circuit(){digitalWrite(CHARGE_RELAY_PIN、CONNECT_CHARGE_RELAY); //充電器をバッテリーに接続します} // sec_index =0; // min_index =0; 
lcd.ino Arduino
 void update_lcd(String first_line、String second_line){// Serial.print( "update_lcd"); //Serial.print(lcd_last_string2); //Serial.print( ""); //Serial.println(second_line); if(lcd_last_string1!=first_line){lcd.clear(); lcd.setCursor(0,0); lcd.print(first_line); lcd_last_string1 =first_line; lcd.setCursor(0,1); lcd.print(second_line); lcd_last_string2 =second_line; } if(lcd_last_second!=second()){if(lcd_last_string2!=second_line){lcd.setCursor(0,1); lcd.print(second_line); lcd_last_string2 =second_line; }} lcd_last_second =second();} String Construct_status_string(void){String v、i; if(battery_voltage <10)v =String(battery_voltage、2);それ以外の場合、v =String(battery_voltage、1); if(current_mA <10)i =String(current_mA、2); else i =String(current_mA、1); //Serial.println(v); mytimeが経過しました。文字列msg、msg_time; //Serial.print(chargeing_started); //Serial.print( ""); //Serial.println(String(millis()-chargeing_started)); switch(charger_state){case CHARGING:elapsed =mills2time(ChargingTimeMillis);壊す;ケースTRICKLE:経過=mills2time(TrickleChargingTimeMillis);壊す; } if(charger_state ==CHARGING || Charger_state ==TRICKLE){if(elapsed.total_minutes <10)msg_time =String(elapsed.total_minutes)+ ""; else if(elapsed.total_minutes <100)msg_time =String(elapsed.total_minutes)+ "";それ以外の場合、msg_time =String(elapsed.total_minutes); } switch(charger_state){case CHARGING:msg =v + String(F( "V"))+ i + String(F( "mA"))+ "" + msg_time;壊す;ケーストリック:msg =v + String(F( "V"))+ i + String(F( "mA"))+ "" + msg_time;壊す;デフォルト:msg =v + String(F( "V"))+ i + String(F( "mA")); } msg.replace( "-"、 ""); //マイナス記号を削除returnmsg;} Stringconstruct_time_string(mytime timeinfo){String mystring =String(timeinfo.hours、DEC)+ String(F( ":")) + String(timeinfo.minutes、DEC); // String(timeinfo.hours、DEC)+ String(F( ":"))+ String(timeinfo.minutes、DEC);を返しますmystringを返す;} 
calculations.ino Arduino
 float best_linear_fit(float y [MINUTES_TO_LOG]){float sx =0.0、sy =0.0、sxx =0.0、sxy =0.0; // int n =y.size(); for(i =0; i  
このプロジェクトで使用される新しいLiquidCrystalライブラリ Arduino
プレビューなし(ダウンロードのみ)。

回路図

Charger_AgK96zxw2T.zip

製造プロセス

  1. 喉の渇き警報プラント警報
  2. イタリア語の単語時計
  3. 4x3キーパッドのピンは3つだけ
  4. SigfoxkWhメーター
  5. Bluetooth温度モニター
  6. ジェスチャー制御ロック
  7. コンパニオンIC
  8. USBMIDIアダプター
  9. Arduino用の絶縁アナログ入力
  10. RGB32バンドオーディオスペクトルビジュアライザー
  11. 反応時間を測定する