リバースベンディングマシン(RVM):DIYスマートリサイクルシステムキット
必要な部品と材料
| Arduino Mega 2560 | ×1 |
| NodeMCU ESP8266 ブレイクアウトボード | ×1 |
| 誘導型近接センサー 15mm | ×2 |
| 静電容量型近接センサー 12mm | ×1 |
| SG90 マイクロサーボモーター | ×2 |
| 英数字LCD 16×2 | ×1 |
| 超音波距離センサー HC-SR04 | ×2 |
| GPSモジュール(汎用) | ×1 |
| ピエゾブザー | ×1 |
| 単回転ポテンショメーター 100kΩ | ×1 |
| スイッチアクチュエーター(プッシュボタン用) | ×1 |
| 5mm LED 赤 | ×2 |
| ジャンパーワイヤー(汎用) | ×1 |
| 12Vバッテリー | ×1 |
| 9V電池(汎用) | ×1 |
| ブレッドボード(汎用) | ×2 |
必要な工具と機器
- はんだごて(汎用)
- デジタルマルチメーター
- ワイヤーストリッパー&カッター
使用するアプリとオンラインサービス
- Arduino IDE
- Blynk
- ThingSpeak API
このプロジェクトについて
動機
ペットボトルはどこへ行くのか? 埋め立て地、海洋、河川、歩道に捨てられています。海上の1平方マイルあたり約46,000個のプラスチックゴミが漂っていると推定されています。このプラスチックは動物を殺し、化学物質を漏出させ、生態系を破壊しています。1本のボトルが分解されるには最大1000年かかり、その間に発がん性や生殖障害を引き起こす有害化学物質が漏れ出します。プラスチックの焼却は一酸化炭素、塩素、塩酸、フラン、亜硝酸塩などの有毒ガスを発生させます。残念ながら、リサイクルの効果も限定的で、年間350億本使用されるうち、リサイクルされるのはわずか12%。リサイクルボックスに入れたものの半分しか実際にはリサイクルされていません。
アイデア
プラスチックボトルと金属缶を受け入れ、リサイクルした利用者にポイントを付与するスマートマシンです。リバースベンディングマシンは近接センサーでボトルの種類を判別し、利用者がWebサイトでコードを入力することでポイントを獲得できます。この発明は、環境中のプラスチック・金属廃棄物の管理とリサイクルに関するものです。プラスチック廃棄物のポイ捨てとリサイクルへの意欲の低さは、環境と全ての生物にとって継続的な問題となっています。
動作原理
リバースベンディングマシンは、使用済み飲料容器を受け入れ、利用者に返金する装置です(通常の自動販売機の逆のサイクル)。容器預かり金制度がある地域で普及しています。
基本動作:
- 利用者が空きボトル/缶を投入口に入れる
- 水平搬入システムで1本ずつ搬送
- 静電容量型と誘導型近接センサーで自動スキャン
- 誘導センサー値が1なら金属、0で静電容量センサーが1ならプラスチックと判定
報酬システム:従来はコインやクーポンを発行していましたが、環境意識の高まりとペーパーレス化の観点から、プラスチック検出時にLCDに暗号化コードを表示し、機械のQRコードをスキャンしてWebサイトでコードを入力することでポイントを還元する方式を採用しています。
ユーザーデータベースをWebサイトで管理し、アカウント登録必須でポイントを交換できます。
追加機能:超音波センサーとNodeMCUでゴミ箱の満杯レベルを監視し、満杯になると収集業者に通知。GPSで機械の正確な位置情報も送信します。
ソースコード
廃棄物分別制御(C/C++)
#include <LiquidCrystal.h>
#include <Servo.h>
LiquidCrystal lcd(1, 2, 4, 5, 6, 7);
const int knapp = 3;
int ButtonState = 0;
int oldButtonState = 0;
const int ledPin1 = 10;
const int ledPin2 = 11;
const int buzz1 = 12;
const int buzz2 = 13;
const int plasticsensor = A0;
int metalsensor = A1;
int metalsensor_M = A2;
Servo myservo;
Servo myservo_M;
int pos = 90;
int pos_M = 360;
void setup() {
pinMode(knapp, INPUT);
digitalWrite(knapp, LOW);
lcd.begin(16, 2);
lcd.clear();
myservo.attach(9);
myservo_M.attach(8);
pinMode(plasticsensor, INPUT_PULLUP);
pinMode(metalsensor, INPUT_PULLUP);
pinMode(metalsensor_M, INPUT_PULLUP);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(buzz1, OUTPUT);
pinMode(buzz2, OUTPUT);
Serial.begin(9600);
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("INSERT METAL ON");
lcd.setCursor(0, 1);
lcd.print(" RIGHT SIDE ");
delay(6000);
lcd.clear();
int sensor_read = digitalRead(plasticsensor);
Serial.println("plastic sensor");
Serial.println(sensor_read);
int sensor_read_m = digitalRead(metalsensor);
Serial.println("metal sensor1");
Serial.println(sensor_read_m);
int sensor_read_mm = digitalRead(metalsensor_M);
Serial.println(sensor_read_mm);
// プラスチック検出時の処理
if ((sensor_read == 1) && (sensor_read_m != 1)) {
for (pos = 90; pos <= 240; pos += 1) {
myservo.write(pos);
digitalWrite(ledPin1, HIGH);
digitalWrite(buzz1, HIGH);
}
for (pos = 240; pos >= 90; pos -= 1) {
myservo.write(pos);
}
} else {
myservo.write(pos);
digitalWrite(ledPin1, LOW);
digitalWrite(buzz1, LOW);
}
// 金属検出時の処理
if ((sensor_read_mm == 1) && (sensor_read == 0)) {
for (pos_M = 360; pos_M >= 50; pos_M -= 1) {
myservo_M.write(pos_M);
digitalWrite(ledPin2, HIGH);
digitalWrite(buzz2, HIGH);
}
for (pos_M = 50; pos_M <= 360; pos_M += 1) {
myservo_M.write(pos_M);
}
} else {
myservo_M.write(pos_M);
digitalWrite(ledPin2, LOW);
digitalWrite(buzz2, LOW);
}
}
ゴミ箱レベル監視(C/C++)
#include "ThingSpeak.h"
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#define BLYNK_PRINT Serial
#define TRIGGER2 5
#define ECHO2 4
WiFiClient client;
static const int RXPin = 4, TXPin = 5;
static const uint32_t GPSBaud = 9600;
unsigned long myChannelField = 1067056;
const int ChannelField = 1;
const char * myWriteAPIKey = "FMV95MD2A1J7Y8SP";
TinyGPSPlus gps;
WidgetMap myMap(V0);
SoftwareSerial ss(RXPin, TXPin);
BlynkTimer timer;
char auth[] = "YVvgHBx9fIM1-yR_2XrGXXkKdIuEmrYL";
char ssid[] = "diksha";
char pass[] = "diksha19";
unsigned int move_index = 1;
void setup() {
Serial.begin(115200);
ss.begin(GPSBaud);
Blynk.begin(auth, ssid, pass);
pinMode(TRIGGER2, OUTPUT);
pinMode(ECHO2, INPUT);
pinMode(BUILTIN_LED, OUTPUT);
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, pass);
Serial.print(".");
delay(100);
}
Serial.println("\nConnected.");
}
while (ss.available() > 0) {
if (gps.encode(ss.read())) {
Serial.println("GPS Connected");
if (gps.location.isValid()) {
float latitude = gps.location.lat();
float longitude = gps.location.lng();
Serial.print("LAT: ");
Serial.println(latitude, 6);
Serial.print("LONG: ");
Serial.println(longitude, 6);
ThingSpeak.setField(3, latitude);
ThingSpeak.setField(4, longitude);
ThingSpeak.writeFields(myChannelField, myWriteAPIKey);
Blynk.virtualWrite(V1, String(latitude, 6));
Blynk.virtualWrite(V2, String(longitude, 6));
myMap.location(move_index, latitude, longitude, "GPS_Location");
}
}
}
long duration2, distance2;
digitalWrite(TRIGGER2, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER2, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER2, LOW);
duration2 = pulseIn(ECHO2, HIGH);
distance2 = (duration2 / 2) / 29.1;
if (distance2 <= 5) {
Blynk.notify("Please!! empty the dustbin");
}
Serial.println("2 ultrasonic Centimeter:");
Serial.println(distance2);
Blynk.virtualWrite(V6, distance2);
ThingSpeak.writeField(myChannelField, ChannelField, distance2, myWriteAPIKey);
delay(100);
Blynk.run();
timer.run();
}
回路図
製造プロセス
- ミシン:19世紀革新から現代自動化までの進化と製造
- スマートフォンのBluetooth近接検知でスマートオートロックドアを構築
- Raspberry Pi、MCP9808、InfluxDB、Grafanaで作る家庭温度モニター
- フライドポテト自動販売機の仕組みと導入メリット徹底解説
- 生乳自動販売機(ミルクATM)の仕組み・メリット・衛生管理の全知識
- チップ自動販売機:熱々フライドポテトをオンデマンドで提供する仕組み
- 麺類自動販売機を発見:仕組みと購入可能商品
- 革新的な茶・コーヒー・スープ自動販売機を探る
- ミールプレップ自販機:いつでも新鮮・ヘルシーな食事を提供
- CNC旋盤の基礎と応用:構造・制御・工具・自動化で実現する高精度旋削加工
- 利益を解き放つ:アイスキャンディー自販機のビジネスポテンシャル