第1步:簡介
什么是APEX?
APEX是一款智能(更不用說可愛)工廠監控設備。只需將其插入任何工廠即可顯示工廠的“幸福”級別!如果您有一種忘記給它們澆水的壞習慣,這是一個很好的提醒。
它是如何運作的?
魔術。開玩笑! APEX使用連接到濕度傳感器的Arduino,將其插入植物的土壤中。該傳感器將讀取土壤的水分含量,然后Arduino計算要顯示的面部。
但為什么?
為什么不呢?
第2步:收集零件和工具
讓我們進入吧!對于這個Instructable,您將需要相當多的零件和工具。幸運的是,它們都列在下面:
根據微控制器競賽的精神,這個項目完全由在亞馬遜上購買的部件制成! (未贊助)
零件清單:
Arduino Uno
8x8 LED顯示屏
電容式觸摸傳感器
濕度傳感器
9V電池連接器
9V電池
工具列表:
22 Gauge Wire
電工膠帶
剝線鉗
焊接熨斗
拆焊泵
收集完所有必要的設備后,是時候設置了Arduino軟件!
第3步:安裝Arduino IDE
為了使這個項目起作用,我們需要能夠對Arduino進行編程。這需要將Arduino集成開發環境(IDE)下載并安裝到您的計算機上。這是一個相當簡單的解釋,但我將引導您完成整個過程:
1。訪問Arduino網站
2。導航到下載頁面(軟件》下載)
第3。單擊操作系統的下載鏈接
側注意:該程序適用于Windows,Mac和Linux。
的 4。在Windows上安裝
雙擊下載的文件進行運行
點擊“同意“同意許可
按照提示的其余部分
現在應該安裝該程序!
(如果迷路,請務必查看截圖)
5。在Mac上安裝
單擊下載的文件
選擇“打開”
程序將自動安裝并運行!
(如果您感到困惑,請務必查看截圖)
6。就是這樣!
你已經完成了!您現在已將Arduino IDE下載到您的系統中!
第4步:代碼
此步驟完全是關于代碼。這是一個相當短的程序,所以我將與你一起討論并解釋它是如何工作的。首先,簡要概述,然后是深入解釋,最后是如何將其推送到Arduino!
簡要概述
對于那些你對代碼的詳細解釋不感興趣,我提供TL; DR段!這是基本的解釋。 Arduino每隔幾秒就從濕度傳感器中獲取值。然后,此信息用于計算和顯示某個面部!最后還有一些代碼,讓電容式觸摸按鈕打開和關閉顯示屏。非常簡單吧?
The Nitty Gritty
這部分教程適合那些對整個程序如何工作非常感興趣的人,一行一行。我將提供上面的截圖,以幫助您理解我正在談論的內容,并在此說明中包含一些代碼行。
此程序分為五個部分:
包括庫和創建變量
設置功能
面部表情的功能
在矩陣函數上寫Arduino
循環函數
包括庫和創建變量:
此代碼的第一部分是關于我們將使用的變量和庫。
#include “LedControlMS.h”
#define TouchSensor 7
LedControl lc=LedControl(12,11,10,1);
int sensorPin = A5;
int sensorValue = 0;
bool started = false;
bool on = true;
boolean pressed = LOW;
第一行包含一個名為LedControlMS的庫。該庫需要能夠向LED顯示器發送值。下一行是一個define語句,用于將觸摸傳感器的引腳設置為7.之后,我們還有三個變量,用于定義LED顯示屏的引腳,濕度傳感器及其值。最后三行是所有布爾值,用于調節觸摸按鈕和顯示屏的狀態。在此之后,我們有字節值:
byte smile[4]={B00000100,B00110010,B01100100,B01100000};
byte surprise[4]={B00001110,B00001010,B01101110,B10010000};
byte meh[4]={B00000100,B00100100,B00100100,B00100000};
byte sad[4]={B00000010,B01100100,B00110010,B00110000};
byte dead[6]={B00001010,B00100100,B00101010,B00100000,B01100000,B01101010};
byte error[8]={B00111100,B01000010,B10100001,B10010001,B10001001,B10000101,B01000010,B00111100};
//Evil Faces
byte esmile[4]={B00000010,B00101010,B01000100,B01000000};
byte elaugh[4]={B00000010,B00101010,B01100100,B01100000};
byte eplain[4]={B00000010,B00101010,B00100100,B00100000};
byte eyell[4]={B00000001,B01101001,B01100010,B01100000};
byte etalk[4]={B00000001,B00101001,B01100010,B01100000};
這些值代表APEX的所有面。每個字節是一個數組,其中包含多個位,用于指示給定行中每個像素的狀態。 “1”和“0”分別表示開/關。
設置功能:
轉到下一部分,我們有設置功能。
void setup() {
//MS Serial Output
Serial.begin(9600);
pinMode(TouchSensor, INPUT);
//LED Matrix Setup
lc.shutdown(0,false);
lc.setIntensity(0,4);
lc.clearDisplay(0);
}
這個名字很好地解釋了它。這是我們“設置”我們的觸摸傳感器和顯示器的地方。前兩行開始我們的串行輸出(用于調試)。第三行將觸摸傳感器引腳設置為輸入,最后四行啟動顯示。
面部表情的功能:
這可能是最長的部分,但它都非常簡單和重復。
void broken() {
lc.setRow(0,0,error[0]);
lc.setRow(0,1,error[1]);
lc.setRow(0,2,error[2]);
lc.setRow(0,3,error[3]);
lc.setRow(0,4,error[4]);
lc.setRow(0,5,error[5]);
lc.setRow(0,6,error[6]);
lc.setRow(0,7,error[7]);
}
void happy() {
lc.setRow(0,0,smile[0]);
lc.setRow(0,1,smile[1]);
lc.setRow(0,2,smile[2]);
lc.setRow(0,3,smile[3]);
lc.setRow(0,4,smile[3]);
lc.setRow(0,5,smile[2]);
lc.setRow(0,6,smile[1]);
lc.setRow(0,7,smile[0]);
}
void plain() {
lc.setRow(0,0,meh[0]);
lc.setRow(0,1,meh[1]);
lc.setRow(0,2,meh[2]);
lc.setRow(0,3,meh[3]);
lc.setRow(0,4,meh[3]);
lc.setRow(0,5,meh[2]);
lc.setRow(0,6,meh[1]);
lc.setRow(0,7,meh[0]);
}
void surprised(){
lc.setRow(0,0,surprise[0]);
lc.setRow(0,1,surprise[1]);
lc.setRow(0,2,surprise[2]);
lc.setRow(0,3,surprise[3]);
lc.setRow(0,4,surprise[3]);
lc.setRow(0,5,surprise[2]);
lc.setRow(0,6,surprise[1]);
lc.setRow(0,7,surprise[0]);
}
void dying() {
lc.setRow(0,0,dead[0]);
lc.setRow(0,1,dead[1]);
lc.setRow(0,2,dead[2]);
lc.setRow(0,3,dead[3]);
lc.setRow(0,4,dead[4]);
lc.setRow(0,5,dead[5]);
lc.setRow(0,6,dead[1]);
lc.setRow(0,7,dead[0]);
}
void crying() {
lc.setRow(0,0,sad[0]);
lc.setRow(0,1,sad[1]);
lc.setRow(0,2,sad[2]);
lc.setRow(0,3,sad[3]);
lc.setRow(0,4,sad[3]);
lc.setRow(0,5,sad[2]);
lc.setRow(0,6,sad[1]);
lc.setRow(0,7,sad[0]);
}
void evilsmile() {
lc.setRow(0,0,esmile[0]);
lc.setRow(0,1,esmile[1]);
lc.setRow(0,2,esmile[2]);
lc.setRow(0,3,esmile[3]);
lc.setRow(0,4,esmile[3]);
lc.setRow(0,5,esmile[2]);
lc.setRow(0,6,esmile[1]);
lc.setRow(0,7,esmile[0]);
}
void evillaugh() {
lc.setRow(0,0,elaugh[0]);
lc.setRow(0,1,elaugh[1]);
lc.setRow(0,2,elaugh[2]);
lc.setRow(0,3,elaugh[3]);
lc.setRow(0,4,elaugh[3]);
lc.setRow(0,5,elaugh[2]);
lc.setRow(0,6,elaugh[1]);
lc.setRow(0,7,elaugh[0]);
}
void evilplain() {
lc.setRow(0,0,eplain[0]);
lc.setRow(0,1,eplain[1]);
lc.setRow(0,2,eplain[2]);
lc.setRow(0,3,eplain[3]);
lc.setRow(0,4,eplain[3]);
lc.setRow(0,5,eplain[2]);
lc.setRow(0,6,eplain[1]);
lc.setRow(0,7,eplain[0]);
}
void evilyell() {
lc.setRow(0,0,eyell[0]);
lc.setRow(0,1,eyell[1]);
lc.setRow(0,2,eyell[2]);
lc.setRow(0,3,eyell[3]);
lc.setRow(0,4,eyell[3]);
lc.setRow(0,5,eyell[2]);
lc.setRow(0,6,eyell[1]);
lc.setRow(0,7,eyell[0]);
}
void eviltalk() {
lc.setRow(0,0,etalk[0]);
lc.setRow(0,1,etalk[1]);
lc.setRow(0,2,etalk[2]);
lc.setRow(0,3,etalk[3]);
lc.setRow(0,4,etalk[3]);
lc.setRow(0,5,etalk[2]);
lc.setRow(0,6,etalk[1]);
lc.setRow(0,7,etalk[0]);
}
這些函數用于使用第一部分中的字節值定義每個面部表情。每行定義 x 位置和字節值,然后將值應用于該列。某些函數需要更多行,因為有更多行用于顯示該面的值。每個面都是對稱的,這就是我們重復這些線條的原因。
WriteArduinoOnMatrix功能:
第四部分用于計算和寫入LED顯示屏上的正確面。它由一系列if語句組成,用于檢查水值,然后通過調用上一節中的不同函數來設置顯示。
void writeArduinoOnMatrix() {
if(sensorValue 》 0 && sensorValue 《= 30) {
broken();
} else if(sensorValue 》 30 && sensorValue 《= 100){
dying();
} else if (sensorValue 》 100 && sensorValue 《= 200) {
crying();
} else if (sensorValue 》 200 && sensorValue 《= 400) {
plain();
} else if (sensorValue 》 400 && sensorValue 《= 650) {
happy();
} else if (sensorValue 》 650 && sensorValue 《= 800) {
surprised();
} else {
broken();
}
}
您可能會注意到,為了防止傳感器超出工作范圍,我們添加了“破損”面。這可以防止發生一些奇怪的空錯誤,并讓我們更好地直觀地了解代碼中發生的事情。
循環函數:
最后但并非最不重要的是循環函數。這段代碼正是它的名字所說的,它循環!雖然這個函數有很多行,但它實際上相當簡單。代碼首先讀取按鈕狀態并查看顯示是否為“On”。如果它發現這是真的,它將調用 WriteArduinoOnMatrix 函數,然后在APEX上繪制一個面。由于此函數循環,它將根據需要隨時更新顯示。此延遲由 delaytime 變量決定。
void loop() {
if (started == true){
delaytime = 3000;
}
//Read Button
pressed = digitalRead(TouchSensor);
if (pressed) {
if (on == true) {
lc.clearDisplay(0);
on = false;
delay(delaytime);
} else {
on = true;
delay(delaytime);
}
}
sensorValue = analogRead(sensorPin);
delay(delaytime);
if (on == true) {
//Draw Faces
writeArduinoOnMatrix();
}
started = true;
}
這就是代碼的全部內容。希望現在你能更好地理解它是如何工作的,并且可以利用這些知識開始為你的項目定制它!
將代碼推送到Arduino
現在我們已經涵蓋了所有代碼,是時候把它推到Arduino了!幸運的是,IDE使這非常簡單。您只需使用USB線將Arduino插入計算機,然后只需單擊IDE左上角的右箭頭即可。讓代碼推送,如果你做得對,你應該在程序底部看到成功消息!
步驟5:電路圖
與代碼類似,電路圖并不太復雜。它只包含三個傳感器和Arduino,所以我會告訴你每個傳感器的引腳,如果你需要任何其他幫助,請參考上圖。
LED顯示屏:
VCC - 》 5V
GRD - 》 GRD
DIN - 》 Pin 12
CS - 》引腳10
CLK - 》引腳11
濕度傳感器:
正面 - 》 5V
負面 - 》 GRD
信號 - 》 A5
電容觸摸傳感器:
VCC - 》 5V
GRD - 》 GRD
SIG - 》 7
不太難,對吧?如果你對這個引腳有任何問題,請務必參考下面的視頻,我將指導你如何連線。
第6步:全部放在一起
這是很難解釋文本如何適合所有,所以我肯定建議查看這部分的視頻。我實際上并沒有準確地解釋我是如何把我放在一起的,這太難了。但為了模糊地解釋事情,我在電線連接上焊接并將它們包裹在電路板背面。然后我放置傳感器并使用電工膠帶將它們固定在一起。最后,我用9V電池對它進行了測試,然后一旦我知道它有效,就將電池放在背面并將其粘貼在上面。就像我之前說過的那樣,檢查這個步驟的視頻,它有一個很好的小焊接部分,它可以幫助你正確地包裹電線。如果迷路,請隨意暫停或以半速播放。
恭喜! 如果一切順利,您現在應該擁有一個功能齊全的APEX單元!
測試您的設備,找到澆灌的植物并插上它!您應該發現它既快樂又感到驚訝,這意味著它應該正常工作!完成項目的好工作!
-
傳感器
+關注
關注
2554文章
51580瀏覽量
757772 -
Arduino
+關注
關注
188文章
6478瀏覽量
188290
發布評論請先 登錄
相關推薦
VirtualLab Fusion應用:光波導k域布局可視化(“神奇的圓環”)
七款經久不衰的數據可視化工具!
光學系統的3D可視化
什么是大屏數據可視化?特點有哪些?
智慧能源可視化監管平臺——助力可視化能源數據管理

智慧樓宇可視化的優點
大屏數據可視化 開源

態勢數據可視化技術有哪些
智慧大屏是如何實現數據可視化的?

評論