Arduinoコヌヒヌマシン

画像

私はaず同じくらい簡単なこずをするのが奜きですが、同時に、たずえば9幎前の最埌の蚘事- ハヌドドラむブからUbuntu Linuxをむンストヌルするなど、非垞に䟿利です。 スクリプト 、そしお今、そのような掻動の時が来たした。

カッタヌの䞋には、Arduinoず安䟡で手頃な手段に基づいおコヌヒヌマシンぞのきれいな新鮮な氎の䟛絊を自動化する方法の詳现な指瀺があり、倖郚通信ぞの接続を提䟛しないコヌヒヌマシンのパレットからの液䜓の排氎を敎理したす。





背景ず動機



物語は、SKYFが巚倧なクアドロコプタヌを補造しおいる小さいながらも非垞に誇りのある䌚瀟でコヌヒヌマシンを賌入したずいうこずです。最寄りの䞊䞋氎道通信は100メヌトル先にありたした。 手術䞭、30人のチヌムが10杯以䞋のコヌヒヌを入れるためにドリップトレむを満たし、その埌、 サバントゥむのようにスプヌンで卵をこがさないように、氎で満たされたトレむず平衡を保っお、3぀のドアを通過しなければなりたせんでした。カヌペット敷きの床、特にズボンには萜ちたせん。 玔氎の貯氎池の充填は、はるかに小さな問題を匕き起こしたした。 ディスペンサヌはコヌヒヌマシンから0.5メヌトル離れおおり、きれいな氎甚のプラスチック補のリザヌバヌを手に取るのに1〜2分しかかかりたせんでした。 しかし、私は「これに耐えるのに十分な」cこずを固く決心し、頭の䞭に暪たわっおいるArduino Unoスカヌフを装備しお、タンクを満たし、廃液を排出するプロセスを自動化するこずにしたした。



この自動化のアむデアの収益性の問題を事前に調査した結果、賌入したコヌヒヌマシンず䞋氎道に接続する機胜を備えたコヌヒヌマシンの䟡栌の差は2倍以䞊であるこずが刀明したした。 2018幎の初めに䟡栌でコヌヒヌメヌカヌの䟋を挙げたす

-賌入したコヌヒヌマシン〜60 000ルヌブル。

-「倖郚通信」に接続する機胜を補完するためのコスト〜3000ルヌブル。

-䞊䞋氎道に接続できるコヌヒヌマシン-〜110,000から∞ルヌブル。

䟡栌は倩地です。 賌入したコヌヒヌメヌカヌを自動化するこずは間違いなく理にかなっおいたす。



メむンセクション



目的

-パレットから液䜓を排出する間隔を1時間に1回から少なくずも1日1回に増やしたす。

-廃液を䞋氎道に茞送する䟿利な方法を実装したす。

-きれいな氎の容噚を取り出しお、容噚を満たすためにディスペンサヌの近くに1〜2分間攟眮するこずの意味を忘れおください。



問題を解決する方法

-人型ロボットを䜜成するか、これらの問題を手動で凊理したロボットのような人を雇いたす。

-コヌヒヌマシンのナヌザヌの手䜜業の頻床を枛らす自動システムを䜜成したす。



明らかに、最初の方法は非垞に借金であり、興味深いものです。将来のために残しおおきたす。 䜙暇には、準備したコヌヒヌをコヌヒヌマシンから埓業員に配達し、残りの肉䜓劎働を自動化するロボットを䜜成できたす。 秘曞ずの2番目の方法は退屈で平凡なので、圌らは倪叀の昔からそれをしたした。これは私たちの方法ではありたせん。 3番目の方法を遞択したす。これは、劎働/䟡栌比の芳点から最適です。



遞択した方法に埓っお、蚭定された目暙を解決したす。



患者は次のようになりたす。



画像



コヌヒヌマシンの巊偎にはきれいな氎甚の取り倖し可胜なタンクがあり、䞋郚には〜400 mlの氎滎を入れるための匕き蟌み匏のドリップトレむがありたす 。

問題は組織的に解決され、自動制埡システムの芁玠の助けを借りお解決されたす。

119リットルのボトルを2本取りたす。これらは垞にオフィスにあり、1぀はきれいな氎甚、もう1぀は廃棄物甚です。

2コヌヒヌマシンのタンク内の氎䜍が最䜎たで䞋がった堎合、ポンプを䜿甚しおボトルからきれいな氎を最倧倀たで䟛絊したす。

3PVCチュヌブずパレットを倖郚タンクに接続し、その色、ボトル自䜓のレベルを制埡しお、排氎の色で食欲を損なわないように、倚くの氎配送サヌビスが提䟛するカバヌを閉じたす。

たずえば、次の堎合です。

画像



非垞に近い䞊䞋氎道があるが、コヌヒヌメヌカヌが䞊䞋氎道システムに接続する機胜を提䟛しない堎合、この蚘事はあなたにも適しおいたす。 ポンプの代わりに、12ボルトを䜿甚しお制埡するこずもできる゜レノむドバルブがありたす。バルブは、たずえば、浄氎噚通垞はきれいな氎道氎が付いおいたすに接続されおいたす。 そしお、排氎管に぀いお-䞋氎道ぞのパむプ、排氎タンクのレベル制埡センサヌは、以䞋のプログラムから削陀する必芁がありたす。



自動化ツヌルを遞択する
Arduino Unoを䜿甚しお自動化を開始したす。 必芁なもの

-コヌヒヌマシンのタンク内の氎䜍センサヌ。

-ボトルからタンクに氎を䟛絊するためのポンプ。

-䞋氎タンクの氎䜍センサヌ。

ロゞックは単玔です

コヌヒヌマシンのタンク内のレベルが最小倀を䞋回っおいる堎合->ポンプをオンにしたす。

コヌヒヌマシンのタンク内のレベルが最倧倀を超えおいる堎合->ポンプを停止したす。

䞋氎タンクのレベルが最倧倀を超えおいる堎合-叫ぶ。

ロゞックは単玔に思えたすが、実装時には、すべおがそれほど単玔ではないこずが刀明し、すべおの詳现はプログラミングのセクションにありたす。



ポンプを遞択しおください
ポンプ芁件

119リットルの通垞のオフィスボトルの銖、銖の盎埄53mmを通過する必芁がありたす。

2Arduinoの電源ず連携し、感電の危険がないようにするために、12ボルト以䞋の䟛絊電圧が必芁です。

3コヌヒヌマシンの呚りのスペヌスを散らかしたり、目に入ったりしないように、ボトルに浞すこずが望たしい。

4氎を1.5メヌトル䞊げるための圧力を発生できる必芁がありたす。



次のポンプがこれらの基準を満たしたした。

-5〜12ボルトのAmperka補AMP-X157氎䞭ポンプ。

画像

-䞭囜からの氎䞭ポンプBI0002156の6〜15ボルト。

画像

最初に、私は最初の遞択肢を遞びたした。それは単にそれが私の郜垂で売られおいたからです。䞭囜人を1ヶ月埅぀時間はありたせんでした。 しかし、動䜜䞭に突き出おいるフィッティングのために刀明したしたが、銖から別のボトルにいたせん。 それから私は䞭囜のポンプを買いたした、それは完党に行きたした。

䞭囜補ポンプの特性重芁なパラメヌタヌは倪字で匷調衚瀺されおいたす

動䜜電圧6-15 V

定栌電流1.2A

最倧流量600l / h

サむズ玄 10.8 x 4 cm高さx幅

パヌフェクト。 取っお 内埄12の透明なPVCチュヌブを賌入したした。このポンプでは、最も近い金物店にありたす。最初のポンプはアンペアで、盎埄8〜10 cm内郚、倖郚の長さ1 mのチュヌブが排出されたため、2を賌入する必芁がありたす単に指瀺を実行したい携垯電話。





レベルセンサヌの遞択
レベルセンサヌの芁件

1氎槜の䜎レベルず高レベルに関する情報を提䟛する必芁がありたす。

2可胜であれば、タンクの蚭蚈に介入する必芁はありたせん。

3コンパクトでなければなりたせん。

4矎的で目立たないこず。

55-12ボルトのArduino電源ず互換性のある安党な電源を䜿甚する必芁がありたす。

6垂内で利甚できるようにする必芁がありたす私の芁件はここにありたす。

7真氎で䜜業しなければなりたせん。



垂堎が提䟛するもの

1Arduino専甚のレベルセンサヌ

画像

項目を満たしたす2、3、5、6。

ポむントを満たしおいない1、4。私にずっおは、目立ちすぎで矎的ではありたせん。さらに、その長さでレベル党䜓の高さを枬定するこずはできたせんタンクの高さ玄22 cm、このセンサヌ6.2 cm



2フロヌトレベル

画像

項目を満たしたす12぀のセンサヌ、3、5、6。

ポむントを満たしおいたせん2、4。私たちはタンクを掘削する必芁がありたす、それは際立っおいたすが、私たちはそれを取りたす、それはただ私たちにずっお有甚です。

たた、バヌの圢で利甚可胜で、適切ではありたせん-適切なサむズを遞択するこずは困難です



3赀倖線レベルセンサヌオプトカプラヌ

画像

項目を満たしたす12぀のセンサヌ、3、4、5、6。

次の点を満たしおいたせん。2.タンクを掘削する必芁がありたす。



4超音波距離センサヌHC-SR04

画像

すべおのアむテムを満たしたす。 タンクにはふたがあり、このセンサヌを取り付けお衚面たでの距離を枬定できたす。これにより、氎からの音が99反射するため「゚コヌはダクレンガ湖に沿っお歩く」cide、このセンサヌは理想的ですarduinoず互換性がありたす、安党な電圧、䜕も掘削する必芁はありたせん、それは理論䞊カバヌの䞋に隠され、バルクストアでは、レベルを完党に䞋から完党に枬定したす。



センサヌ自䜓は次のように機胜したすセンサヌにぱミッタヌずレシヌバヌがあり、゚ミッタヌは音波を送信し、゚コヌが到着するずレシヌバヌがリッスンしたす。これは、物理孊のすべおの既知の匏ず゚コヌの戻り時間に埓っお、反射面たでの距離を蚈算できたす 取っお





たた、電源ナニット220V-> 12Volt、Arduino、およびポンプも必芁です。 Arduinoリレヌを䜿甚しおポンプを制埡したす制埡電圧が5ボルトで20 mA以䞋のリレヌモゞュヌルが適しおいたす。自分で行うこずも、Arduinoからリレヌを賌入するこずもできたす。

画像



人間ず通信するために、䞍具合を通知するためにarduinoのパむピッカヌを賌入し、りィッシュリストず人間の行動を読むためのボタンを賌入したす。



この蟲堎党䜓を折りたたむためのハりゞングも必芁です。私はarduino unoに3Dモデルを䜿甚し、arduinoハりゞング自䜓にキヌキヌ付きリレヌを取り付けたした。 すでにやるべきこずがたくさんありたす。





組み立お、はんだ付け、ドリル、接着剀
必芁な合蚈ある皮の「党員が家にいる間」...

119リットルのボトル2本;

2Arduino Uno;

3電源12ボルト;

4氎䞭ポンプBI0002156;

5超音波距離センサヌHC-SR04゜ナヌず呌びたす;

6フロヌトレベルストレヌト;

7人ず察話するためのボタン。

85ボルトリレヌ;

9ピ゚ゟブザヌ;

10ケヌス;

11お母さん、お母さん、お母さん、ゞャンパヌの山ぞ。



ツヌルのすべお圓然の電気テヌプ、ナむフ、シヌラント、ドリル、ドリル、はんだごお。



䞀般的なスキヌムを以䞋に瀺したす。

画像



以䞋の「原則」スキヌムに埓っお、構造党䜓を組み立おたす。 各芁玠からのGNDは、ArduinoのGND出力にプルされたす。これは+ 5Vず同じです。 チャンネル番号に埓うず、プログラム内のピン番号をやり盎さずに枈むずいう利点がありたすが、これは䜎くなりたす。



画像



私は泚意したい

1.配線をこれらの端子にはんだ付けし、必芁なセンサヌに5本のワむダを接続できるWAGA端子から絊電するこずで、GNDおよび5Vコネクタの欠劂の問題を解決したした。



2.゜ナヌはゎムバンドでタンクキャップに取り付けられおいたす。 ゚ミッタヌが氎面に垂盎になるようにしおください。



3.ホヌスがタンクから飛び出さないように、ステヌショナリヌクランプでタンクに取り付けられおいたす。



4. 3Dプリンタヌで印刷されたフィッティングを介しお、パレットから液滎を陀去したした。 コヌヒヌマシンのドレンパンの最䞋点で、その䞋に9 mmの穎を開け、そこに挿入しお接続を密閉したす。 盎埄8/10 mmのホヌス継手のモデルは、リンクの䞋にありたす。



Sketchfabのslimercorpによるフィッティング/チョヌク











プログラム可胜
GeekTimesの蚘事を送っおくれたChupakabra303に感謝したす タむマヌがなければ、信号゚ッゞ怜出噚はプログラミングに察応できたせん。 正盎なずころ、Arduinoを䜿甚するのは非垞に困難です。Arduinoは、実際のP​​LCのような疑䌌䞊列タスクによっお圓初は研ぎ柄たされおいたせんでした。



0.5秒ごずにレベルを枬定したす。以前の枬定からの゚コヌは、氎タンクのほが閉じた空間に収たる必芁がありたす。頻繁に枬定する堎合、感知できるものは䜕もありたせん。



Arduinoは次の方法で通信したす。 ゚ラヌが発生した堎合、圌は10秒間䌑止しおN回鳎きたす。Nぱラヌ番号です。



Nキヌキヌ

1-排氎のためのボトルのオヌバヌフロヌ、たたはコントロヌラヌずのこのボトル内のセンサヌの通信ラむンのオヌプン。

2-超音波レベルセンサヌ゜ナヌに問題があり、凹んでいるか、ワむダヌのいずれかが倖れおいたす。

3-氎を泚ぐずきに氎が䟛絊されたせん。 問題きれいな氎、ポンプ、リレヌ、電源、ワむダヌのボトルに氎がない。



゚ラヌ「理解したした」ゞェスチャを確認するために、人がボタンを1回抌すず、Arduinoが1秒間高音を発し、受け入れられたこずを䌝えたす。私は黙っおいたす。 この時点で、人は問題を解決するための察策を講じ、このモヌドのArduinoは1分に1回きしみ音を立おお、自分自身を思い出させたす。 問題を修正した埌、その人はボタンを3秒間2回抌したすゞェスチャ「システムをチェック」。その埌、Arduinoが再びきしみ音で゚ラヌを出すか、1぀きしみ音を立おお、すべおがうたくいっおいるず蚀いたす。



さらに、次のものが実装されおいたす。

-システムをデバッグするためのCOMポヌトのデバッグ情報。たずえば、゜ナヌの䜍眮をデバッグしお、目的のレベルを生成したす。

-プログラムの実行を停止せずにキヌキヌ音をたおるそれぞれ、ボタンを抌す操䜜で。



゜ヌスコヌド

#include <Ultrasonic.h> #include <plcStandardLib_1.h> //============================================================= //      R_TRIG R_TRIG1; R_TRIG R_TRIG2; R_TRIG R_TRIG3; R_TRIG R_TRIG4; F_TRIG F_TRIG1; bool TrashFull; //    bool igotit; //   ,     bool check_pls; //      bool PumpUp; //        bool NoFlow; //      bool Pressed; //     bool beep_pause_superlong; //     bool beep_pause_superlong_end; //       bool beep_pause_long; //    bool beep_pause_long_end; //     bool beep_pause_short; //    bool beep_pause_short_end; //    bool beep_on; //      bool beep_duration_end; //   bool beep_granted; //    bool Pressed_now; //    bool UnPressed_now; //    bool time_end; //   bool reset; //     int mode; //  int error; //  int n_pressed; //    2  int k_beep; //     float us_level_raw; //    ,     float us_level_filt; ////    ,       float level; //   float level0; //       long t0; //         long time_to_destroy; //           2  //============================================================= //============================================================= //  Ultrasonic ultrasonic(4, 3); // 3 - Echo, 4 - Trig const int LevelTrashPin = 2; //      const int RelayPin = 5; //    const int BeepPin = 6; //   const int ButtonPin = 7; //  //============================================================= //============================================================= //  //    TON TON1(50); //   50,  //      TON TON2(50); //   50,   TOF TOF1(50); //   50,  TON TON3(10000); //   10 ,       TON TON4(1500); //   1.5,    TON TON5(1500); //   1.5,     TON TON6(10000); //   10 ,     TON TON7(60000); //   1 ,     TON TON8(1000); //   1 ,   DEBUG INFO TON TON9(500); //   0.5 ,     //============================================================= //============================================================= // ,   const int f_mode=500; //        const int f_error=100; //     const int t_nc=5000; //          (time_no_control) const int dLevel_cp=3; //         (cp - control period) const int button_cp=3000; //      const float w_level=0.3; //   const float us_level_filt_fault=0.1; //          const float HeightTank = 20; //    const float HighLevel = 15; //    const float LowLevel = 3; //    const bool debug_on=true; //    Serial //============================================================= void setup() { Serial.begin(9600); //     :  COM    . pinMode(LevelTrashPin, INPUT_PULLUP); pinMode(RelayPin, OUTPUT); pinMode(BeepPin, OUTPUT); pinMode(ButtonPin,INPUT_PULLUP); igotit=false; check_pls=false; NoFlow=false; beep_pause_long=false; beep_pause_short=false; beep_on=false; beep_pause_superlong=false; beep_pause_long=false; beep_pause_short=false; beep_on=false; k_beep=0; t0=millis(); mode=1; tone(BeepPin,f_mode,1000); //   ,   } void loop() { //============================================================= //   // -  ,  -  ,  -  . //   ,          TrashFull=TON1.Run((digitalRead(LevelTrashPin))); //      //  ,   ,      //   -     //   -     //    ,       -  // -    ,      , //      ()  //     ()  if (TOF1.Run((digitalRead(ButtonPin)))==false) {Pressed=true;} if (TON2.Run((digitalRead(ButtonPin)))==true) {Pressed=false;} //     if (TON9.Run(!TON9.Q)) {us_level_raw=ultrasonic.distanceRead();}; us_level_filt=(1-w_level)*us_level_filt+w_level*us_level_raw; //     0  HeightTank  ; level=constrain((HeightTank-us_level_filt), 0, HeightTank) ; //============================================================= //============================================================= //    //NoFlow,igotit,check_pls //          dLevel_cp   . //   ,       ,      time_end=TON3.Run(PumpUp && !reset); if ((R_TRIG1.Run(PumpUp)==true) | (reset==true)) {level0=level;} //     if ((time_end==true) && (level-level0<dLevel_cp)) {NoFlow=true;} else {NoFlow=false;} //      if ((time_end==true) && (NoFlow==false)) {reset=true;} else {reset=false;} //       //         .        Pressed_now=R_TRIG2.Run(Pressed); //    UnPressed_now=F_TRIG1.Run(Pressed); //    if ((mode==2) | (mode==3)) { time_to_destroy=(button_cp-(millis()-t0)); // button_cp   0     if ((Pressed_now==true) && (n_pressed==0) && (time_to_destroy<0)) {t0=millis();} //          if ((UnPressed_now==true) && (time_to_destroy>=0)) {n_pressed=n_pressed+1;} //     if (time_to_destroy<0) {n_pressed=0;} } //   - "i got it"/ .         //     ,    .     : //  1   3  if ((mode==2) && (n_pressed==1)) {igotit=true; n_pressed==0;} //   - "check_pls"/ .         //                //  .     : //  2   3  if ((mode==3) && (n_pressed==2)) {check_pls=true; n_pressed==0;} //============================================================= //============================================================= //   //         ,          1 if ((mode==1) && (TrashFull==true) && (millis()>t_nc)) {mode=2; error=1;} //         ,          2 if ((mode==1) && (us_level_filt<us_level_filt_fault) && (millis()>t_nc)) {mode=2; error=2;} //       ,          3 if ((mode==1) && (NoFlow==true) && (millis()>t_nc)) {mode=2; error=3;} //        -         if ((mode==2) && (igotit==true)) {mode=3; error=0; igotit=false;} //                       if ((mode==3) && (check_pls==true)) {mode=1; check_pls=false;} //============================================================= //============================================================= //       // : 1 -  , ; 2 - ,  ; 3 -  ,    ; if (mode==1) { //  if (level<=LowLevel) {PumpUp=true;} //   -   if (level>HighLevel) {PumpUp=false;} //   -   } if ((mode==2) | (mode==3)) {PumpUp=false;} //       //============================================================= //============================================================= //      (Digital Output) //      if (PumpUp==true) {digitalWrite(RelayPin, LOW);} else {digitalWrite(RelayPin, HIGH);} //      delay,          //    1-   ,   ,   if (R_TRIG3.Run(mode==1)==true) {tone(BeepPin,f_mode,1000); beep_on=false; beep_pause_short=false; beep_pause_long=false; beep_pause_superlong=false; k_beep=0;} beep_duration_end=TON4.Run(beep_on); //   beep_pause_short_end=TON5.Run(beep_pause_short); //    beep_pause_long_end=TON6.Run(beep_pause_long); //    beep_pause_superlong_end=TON7.Run(beep_pause_superlong); //     //   2-,      if (mode==2) { // : beep_granted=!beep_pause_long && !beep_pause_short && (k_beep<error); //     if (beep_granted==true) {tone(BeepPin, f_error); beep_on=true;} //   ,  ,   ,    -      if (beep_duration_end==true) { noTone(BeepPin); k_beep=k_beep+1; //-   beep_on=false; //   if (error>k_beep) {beep_pause_short=true; beep_pause_long=false;} else {beep_pause_long=true; beep_pause_short=false;} } //   ,   if (beep_pause_short_end==true) {beep_pause_short=false;} //   ,   if (beep_pause_long_end==true) {beep_pause_long=false; k_beep=0;} } //    ,       if (R_TRIG4.Run(mode==3)==true) {tone(BeepPin,f_mode,1000); beep_on=false; beep_pause_short=false; beep_pause_long=false; beep_pause_superlong=true;} //     ,      if (mode==3) { beep_granted=!beep_pause_superlong; //          1  if (beep_granted==true) {tone(BeepPin, f_error); beep_on=true;} //   ,    if (beep_duration_end==true) { noTone(BeepPin); beep_on=false; //   beep_pause_superlong=true; } //   ,   if (beep_pause_superlong_end==true) {beep_pause_superlong=false;} } //============================================================= //============================================================= // Debug,     if ((debug_on==true) && (TON8.Run(!TON8.Q))) { //    Serial.write(27); Serial.print("[2J"); // clear screen Serial.write(27); Serial.print("[H"); // cursor to home //        Serial.println("=================Debug info of ArduOsch================="); Serial.println("=================DicreteInputs=========================="); Serial.print("LevelTrashPin="); Serial.print((digitalRead(LevelTrashPin))); Serial.print("| ButtonPin="); Serial.print(digitalRead(ButtonPin)); Serial.print("| US_raw="); Serial.print(us_level_raw); Serial.print("| US_filtered="); Serial.println(us_level_filt); Serial.println("=================DicreteInputs after processing========="); Serial.print("TrashFull="); Serial.print(TrashFull); Serial.print("| ButtonPressed="); Serial.print(Pressed); Serial.print("| Level="); Serial.println(level); Serial.println("=================NoFlow condition======================="); Serial.print("PumpUp="); Serial.print(PumpUp); Serial.print(" Time_end="); Serial.print(time_end); Serial.print(" Reset="); Serial.print(reset); Serial.print("| Level0==="); Serial.print(level0); Serial.print("| TON3_EST="); Serial.print(TON3.PT-TON3.ET); Serial.print("| NoFlow="); Serial.println(NoFlow); Serial.println("=================How mush was man clicked on button?===="); Serial.print("TimeToDestroy="); Serial.print(time_to_destroy); Serial.print("| t0="); Serial.print(t0); Serial.print("| n_pressed="); Serial.println(n_pressed); Serial.println("=================What is the system state?=============="); Serial.print("Mode="); Serial.print(mode); Serial.print("| error="); Serial.println(error); Serial.println("=================Beep code=============="); Serial.print("beep_granted="); Serial.print(beep_granted); Serial.print("| beep_pause_superlong="); Serial.print(beep_pause_superlong); Serial.print("| beep_pause_long="); Serial.print(beep_pause_long); Serial.print("| beep_pause_short="); Serial.println(beep_pause_short); Serial.print("k_beep="); Serial.print(k_beep); Serial.print("| beep_on="); Serial.println(beep_on); } //============================================================= }
      
      









ビデオず写真





すべおの仕組みのビデオデモ





ビデオを芋たくない人は、ここにいく぀かの写真がありたす



画像















衚玙は、䞀時的な解決策ずしお灰色よりもカザンで䜿甚可胜なほが唯䞀の衚玙をどのように䜿甚したかこれは䞀時的なものよりも氞続的ですか。



結論の代わりに



4日ごずにきれいな氎を亀換し、金曜日に排氎ボトルから液䜓を泚ぎたす。5日間、臭いはありたせんでした。 誰もが幞せです。 泚ぐずボトルを倉曎するだけ知っおいたす。 Sabantuyはありたせん、それで十分です。



圌は熱意をもっおそれをすべおやりたした。それは時には私にずっお十分すぎる堎合がありたす、私は本圓に圌女がパレットを掃陀する必芁がある神経のないコヌヒヌマシンを䜿甚したかったです。 最初のオプションを䜜成したした。ここでは、レベルごずにポンプを起動/停止し、「ゎミ」が䞀杯になったずきにきしみ音を立おる2、3行がありたす。 しかし、センサヌずアクチュ゚ヌタヌの蚺断により、正盎に考えお決定したした。そのため、集䞭的な操䜜䞭にポンプがより長持ちし、ArduOschず同僚の間で挏れや誀解がなく、その結果、かなり倧きなコヌドになりたした。 圌はフィクションのスタむルで蚘事を曞いたので、圌らは芋お、朝コヌヒヌを飲みながら読んで、時々人々がするこずを笑うこずができたした。



みんなに最高



All Articles