洗車中のArduino

おそらく多くの人がすでにセルフサービスの洗車を見てきました。 Arduinoでそのようなデバイスを作成することは可能ですか?









...経済災害の次の波...は、中流階級レベルでの多くの良い仕事を廃止する自動化の急速なステップの結果である( B.オバマ


仕組み



  1. お客様がシンクに到着します
  2. 請求書受領者を通じてお金を稼ぎます(金額は掲示板に表示されます)
  3. 必要な機器のボタンを押す
  4. クライアントは独立して車を洗う
  5. 必要に応じて、停止ボタンを押すか、他の機器を選択します
  6. スコアボードはサービスの量を計算します(含まれる機器に依存)
  7. ゼロ調整すると、機器の電源が切れます
  8. 必要に応じて、手順2から繰り返します


同時に、デバイスのネットワーク機能により、次のことが可能になります。





機器の構成





すべてをAliexpressで購入しました(請求書受領者およびシールドを除く)。



組立図



ネットワークシールドは単に上部に貼り付けられています。 さらに、すべてがそれを通して収集されます。



Arduino-キャッシュコード

A0-11(TxD TTL)

A1-16(RxD TTL)

GND-4(GND)


Arduino-MAX7219

A4-CLK

A3-CS

A2-DIN

GND-GND

+ 5V-VCC


Arduino-リレー

2-7-in1-in6

GND-GND

+ 5V-VCC


ボタンは分圧回路に従って組み立てられ、A5に接続されます。 200Ωから3.2KΩの抵抗器があります。







プログラミング



ボードとリレーの初期化:



#define DIN 16 #define CS 17 #define CLK 18 #define max7219_reg_decodeMode 0x09 #define max7219_reg_intensity 0x0a #define max7219_reg_scanLimit 0x0b #define max7219_reg_shutdown 0x0c #define max7219_reg_displayTest 0x0f const unsigned char alf[] = {0, 28, 34, 34, 34, 34, 34, 34, 28, 8, 24, 8, 8, 8, 8, 8, 28, 28, 34, 2, 4, 8, 16, 32, 62, 28, 34, 2, 4, 2, 2, 34, 28, 34, 34, 34, 34, 62, 2, 2, 2, 62, 32, 32, 60, 2, 2, 2, 60, 28, 32, 32, 60, 34, 34, 34, 28, 62, 2, 2, 4, 8, 16, 32, 32, 28, 34, 34, 28, 34, 34, 34, 28, 28, 34, 34, 30, 2, 2, 2, 28 }; void setup() { pinMode(DIN,OUTPUT); pinMode(CS,OUTPUT); pinMode(CLK,OUTPUT); digitalWrite(CS, HIGH); initLed(); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode (A5, INPUT); } void setCommand(byte command, byte value) { digitalWrite(CS, LOW); for (int i=0; i<4; i++) { shiftOut(DIN,CLK, MSBFIRST, command); shiftOut(DIN,CLK, MSBFIRST, value); } digitalWrite(CS, HIGH); } void initLed() { setCommand(max7219_reg_scanLimit, 0x07); setCommand(max7219_reg_decodeMode, 0x00); setCommand(max7219_reg_shutdown, 0x01); setCommand(max7219_reg_displayTest, 0x00); setCommand(max7219_reg_intensity, 1); }
      
      





ボード上の番号の表示(停電の場合の現在の値は、セルEEPROM 10および11に保存されます):



 int printNumber(int add) { int n=EEPROM.read(10)+EEPROM.read(11)*256; if(add!=0) { n+=add; EEPROM.write(10, n%256); EEPROM.write(11, n>>8); } int k; for (char i=1; i<=8; i++) { digitalWrite(CS, LOW); for (char j=3; j>=0; j--) { k=n/pow(10,j); shiftOut(DIN,CLK, MSBFIRST,i); shiftOut(DIN,CLK, MSBFIRST,alf[i+(k%10)*8]); } digitalWrite(CS, HIGH); } return n; }
      
      





ボタンの読み取り(キーダウンはボタンの元への戻りを追跡してリレーのバウンスをなくし、条件の数値は経験的に選択されます):



 int key = analogRead (5); if(keydown && key<100) keydown=0; if((EEPROM.read(10)>0 || EEPROM.read(11)>0) && !keydown) { if(key>910 && key<980) setRele(1); if(key>810 && key<880) setRele(2); if(key>710 && key<760) setRele(3); if(key>550 && key<690) setRele(4); if(key>400 && key<500) setRele(5); if(key>330 && key<400) setRele(0); }
      
      





リレー操作(1分あたりのサービス価格はセルEEPROM 1-9に保存されます):



 void setRele(char r) { rele=r; keydown=1; for(char i=1;i<6;i++) digitalWrite(i+1, HIGH); if(rele) { digitalWrite(rele+1, LOW); timeRele=millis(); timeAllRele=60000/EEPROM.read(rele); } }
      
      





マネーカウンター(リレーがオンの場合、および設定値のミリ秒のカウンターを超えた場合は、1を引きます):



  if(rele>0 && rele<=5 && (millis()-timeRele)>timeAllRele) { if(printNumber(-1)==0) setRele(0); timeRele+=timeAllRele; }
      
      





ネットワーククライアントとサーバーは、標準のArduinoライブラリから取得されます。 Bill AcceptorはCCNETプロトコルで動作します。



UPD:

ネットワークと請求書受領者のパート2の説明。

7インチスクリーンとタッチスクリーンを備えたシングルボードオレンジPiの次世代デバイス



All Articles