37
本文作者: 江小片 | 2015-12-23 15:48 |
科技發(fā)展如此精尖的現(xiàn)代社會(huì),還會(huì)有多少人記得“漂流瓶”這個(gè)東西呢?就算有人知道,現(xiàn)在的科技讓漂流瓶也變成了虛擬的產(chǎn)物,殘存在微信、QQ等各種社交網(wǎng)絡(luò)中。在這個(gè)信息浮躁的世界,你有沒(méi)有想過(guò)向海里丟一個(gè)真正的漂流瓶來(lái)傾訴自己的苦惱呢?
如果你真的去丟瓶子了,當(dāng)瓶子飄走的時(shí)候你會(huì)不會(huì)后悔寫(xiě)在瓶子里的話呢?今天硬創(chuàng)邦的DIY教學(xué)就是教大家自制一個(gè)電子漂流瓶,有了這個(gè)電子漂流瓶后你就再也不用困擾這個(gè)問(wèn)題啦!你可以隨時(shí)發(fā)信息來(lái)更新你寫(xiě)下的話,有趣吧!
閑話不多說(shuō),教程開(kāi)始。
這個(gè)項(xiàng)目主要運(yùn)用了LinkIt One開(kāi)發(fā)板而研發(fā),在MediaTek的社區(qū)上,大多數(shù)的項(xiàng)目都是沒(méi)有外殼的,甚至像用于戶(hù)外的氣象站這樣的項(xiàng)目也沒(méi)有,所以我要展示一個(gè)簡(jiǎn)易的現(xiàn)成的(取材于廚房)的防水的外殼。
大概的主要部件如下:
· 蓄電池供電
· 太陽(yáng)能充電
· 放電或者充電狀態(tài)以一行16x2的字符顯示在液晶屏幕上
· 可以接收短信
· 信息可以滾動(dòng)在屏幕上
我原本打算設(shè)計(jì)一款獨(dú)立的、太陽(yáng)能的、可以連接WiFi的漂流瓶,這樣人們就可以在網(wǎng)上相互聯(lián)系、下載資料或者相互留言,但是目前LinkIt One還不支持允許WiFi接入模式。所以我接下來(lái)想做一個(gè)像商店里做的那種藍(lán)牙,當(dāng)你進(jìn)入商店你就可以接收信息(藍(lán)牙營(yíng)銷(xiāo)),但目前應(yīng)用界面程序好像還不允許……
1、Linkit One開(kāi)發(fā)板
聯(lián)發(fā)科的Linkit One是一款非??岬募嫒軦rduino 的開(kāi)發(fā)平臺(tái),你可以通過(guò)全球移動(dòng)通訊系統(tǒng)接收短信,也可以給電池充電。
2、一張SIM卡
一張交過(guò)費(fèi)并且可以接收短信的SIM卡,最好沒(méi)有PIN碼。
3、太陽(yáng)能電池板
我從廢舊的儀器上拿來(lái)了3個(gè)大約1W輸出量的細(xì)長(zhǎng)的8-10V的太陽(yáng)能板,如果你不怕等快遞的話,在Aliexpress網(wǎng)站上也能輕松買(mǎi)到。
4.電源轉(zhuǎn)換器
我選用了Power Trends PT78ST105S這款,規(guī)格如下:
輸入電壓:9-38V
輸出電壓:5V
輸出電流:1.5A
5、寬膠帶
我用寬膠帶把三個(gè)太陽(yáng)能板粘成可折疊的組合,再把各種模塊粘到太陽(yáng)能板的背面。折疊之后看起來(lái)相當(dāng)整齊。
6、一個(gè)瓶子
最好用腌制果醬的廣口瓶,但是我沒(méi)找到,所以用了一個(gè)1.5升的彈簧瓶。
簡(jiǎn)單的辦法
如果你不想自己設(shè)計(jì)電路,可以去Aliexpress這樣的網(wǎng)站買(mǎi)一個(gè)太陽(yáng)能手機(jī)充電器,付完錢(qián)等兩個(gè)月就ok了。
復(fù)雜的辦法
這有一個(gè)用太陽(yáng)能給你的LinkIt One充電的深入教程,要是想了解更多的話可以閱讀一下(全英文哦,學(xué)渣慎入)。
連接電池板
把電池板擺成三角管狀(像Toblerone三角巧克力,具體長(zhǎng)啥樣自行度娘),這個(gè)問(wèn)題有點(diǎn)復(fù)雜,但是你掌握以下幾點(diǎn)即可:
1.一組串聯(lián)電池中的輸出電流大小取決于電量最小的電池產(chǎn)生電流的能力。
2.照明度一定時(shí),輸出電壓是恒定的。
如果電池是串聯(lián)的,其中一個(gè)變暗,總電流會(huì)減小,如果是并聯(lián)的,能吸收光能的電池就可以無(wú)限的輸出電能。
選擇5V的轉(zhuǎn)換器
LinkIt One開(kāi)發(fā)板有一個(gè)內(nèi)置充電器,通過(guò)USB端口就可以給這個(gè)內(nèi)置充電器穩(wěn)定地輸入5V的電壓。太陽(yáng)能電池板的輸出電壓隨著吸收光能的變化在5V附近輕微浮動(dòng),所以我們需要一個(gè)開(kāi)關(guān)型穩(wěn)壓器降低電壓。
轉(zhuǎn)換器有許多種,你只需要選一個(gè)滿(mǎn)足下列要求的就可以了。
輸入電壓(電池板輸入端):
確保電池板的輸出電壓在開(kāi)關(guān)型穩(wěn)壓器的輸入電壓范圍內(nèi)。
輸出電壓(連到LinkIt One端)
5V(不能多不能少正正好好)
輸出電流
穩(wěn)壓器一定要能負(fù)載通過(guò)的電流,看一下電池板的額定電流(在電源上可以看見(jiàn)),這是最大允許的輸入電流。不計(jì)無(wú)用功,輸出電流=輸入電流*(輸入電壓/輸出電壓)。
穩(wěn)壓器示例(1)
我手邊有一個(gè)型號(hào)是Power Trends PT78ST105S的穩(wěn)壓器,規(guī)格如下:
輸入電壓:9-38V
輸出電壓:5V
輸出電流:1.5A
穩(wěn)壓器示例(2)
我把兩個(gè)8V的電池串聯(lián)起來(lái)組成了一個(gè)最小輸入電壓為14V的電池。
輸入電壓:14-28V
輸出電壓:5V
輸出電流:500mA
連接5V的轉(zhuǎn)換器
需要一個(gè)微型USB連接器,我從廢棄的電話充電器上取下來(lái)一個(gè)。
連接步驟如下:
電池板的正極連到穩(wěn)壓器的VIN端
電池板的負(fù)極連到穩(wěn)壓器的GND端
穩(wěn)壓器的輸出電壓端連接USB連接器的+5V端
穩(wěn)壓器的GND端連接到USB連接器的GND端
連接
我從舊家電上拿到了一個(gè)16x2的液晶顯示屏,如果你有16x4的或者任何帶有HD44780芯片的類(lèi)似的顯示屏都可以。
下表列出了所有接口的作用。
如果顯示器有背光源,那么這就是在15和15端口間的發(fā)光二極管。這種顯示器比較費(fèi)電。
想了解更多關(guān)于16x2顯示屏的信息請(qǐng)點(diǎn)擊連接Adafruit's well documented articles。
測(cè)試
充上電源連接好各端口之后,顯示屏上應(yīng)該就可以看到信號(hào)了,如果沒(méi)有的話一定是哪里出錯(cuò)了,檢查一下各連接處,調(diào)節(jié)對(duì)比電阻器,把端口3直接連到GND上可以設(shè)置最大對(duì)比度。
現(xiàn)在讓我們開(kāi)始寫(xiě)代碼控制顯示器吧。
注意:關(guān)于LiquidCrystal庫(kù)
就在寫(xiě)這個(gè)教程的時(shí)候,我用的這個(gè)1.6.5版本Arduino的LinkIt One硬盤(pán)驅(qū)動(dòng)器的LiquidCrystal庫(kù)崩潰了,如何修補(bǔ)LiquidCrystal文檔請(qǐng)參照Instructable。
簡(jiǎn)介:
我想你應(yīng)該能讓LinkIt One 和Arduino 硬盤(pán)驅(qū)動(dòng)器同時(shí)運(yùn)行了,如果沒(méi)有請(qǐng)點(diǎn)擊這里。
我已經(jīng)把最終版的代碼寫(xiě)在這里了,特別描述了其中比較重要的部分,這或許會(huì)讓你更好的理解這個(gè)程序 。
導(dǎo)庫(kù)
首先導(dǎo)入會(huì)用到的各種庫(kù)。
#include <LGSM.h>
#include <LiquidCrystal.h>
#include <LBattery.h>
定義變量
接下來(lái)我們定義整個(gè)程序中會(huì)用到的總體變量,大部分變量都會(huì)定義為“進(jìn)程名[x]”,也就是一系列X字符,可以用來(lái)儲(chǔ)存文本或狀態(tài)信息。
//these variables are for the sms
char smsContent[160];
int smsLength = 0;
char smsSender[20];
boolean newMessage = LOW;
//variables for battery status
char statusMessage[16];
// initialize the LCD library with the numbers of the interface pins
// lcd(RS, Enable, DataBus4, DataBus5, DataBus6, DataBus7)
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
int scrollInterval = 500;
unsigned long lastUpdate = 0;
int msgStartChar = 0;
int lcdStartChar = 0;
設(shè)置方法
主板導(dǎo)入的時(shí)候這個(gè)函數(shù)就會(huì)運(yùn)行。
void setup() {
lcd.begin(16, 2); // set up the LCD's number of columns and rows:
waitForSim(); //wait for simcard to be active
Serial.begin(9600); //start the serial port
}
等待SIM卡準(zhǔn)備就緒方法
如果SIM卡沒(méi)有初始化的話程序還不能正常運(yùn)行,所以你只能等SIM卡準(zhǔn)備就緒,這個(gè)時(shí)候你可以在界面上打出小點(diǎn)確保設(shè)備還是完好的。
void waitForSim() {
Serial.print("waiting for sim");
while (!LSMS.ready())
{
delay(250);
Serial.print('.');
}
Serial.println("Sim Ready");
}
接收短信方法
當(dāng)收到新消息時(shí),這個(gè)函數(shù)就可以自動(dòng)查看,一次讀取一個(gè)字符,并儲(chǔ)存在緩沖箱內(nèi),函數(shù)返回高檔(true/1),沒(méi)有新消息時(shí)返回低檔(false/0)。收到新消息時(shí),“新消息”boolean設(shè)置成True。讀取信息之后信息會(huì)被刪除。
boolean receiveSMS() {
//this function will store a new sms in the buffers
//or return false if there is no new sms
int v;
if (LSMS.ready() && LSMS.available()) // Check if there is new SMS
{
Serial.println("There is new message.");
newMessage = HIGH;
LSMS.remoteNumber(smsSender, 20); // store sender in buffer
smsLength = 0; //storing a new sms
while (true)
{
v = LSMS.read();
if (v < 0)
break;
smsContent[smsLength] = v;
smsLength++;
}
smsContent[smsLength] = '\0';
smsLength++;
LSMS.flush(); // delete message
return HIGH;
}
else {
return LOW;
}
}
充電狀態(tài)方法
這個(gè)函數(shù)由16個(gè)字符的文本組成。充電狀態(tài)用1表示,未充電狀態(tài)用0表示。剩余電量用0,33,66,100表示,電池的電流量水平?jīng)Q定了剩余電量。用sprintf函數(shù)把前兩個(gè)函數(shù)轉(zhuǎn)化成一行文本的格式,在此文本中,儲(chǔ)存的狀態(tài)信息字符用于下面的更新顯示函數(shù)中。
void chargeStatus() {
if(LBattery.isCharging()) {
sprintf(statusMessage,"%3d%% charging", LBattery.level() );
}
else {
sprintf(statusMessage,"%3d%% charged", LBattery.level() );
}
}
更新顯示函數(shù)
前面形成的文本內(nèi)容都要發(fā)送到液晶顯示屏上,通過(guò)顯示屏我們才能直觀的感受到信息以及查看評(píng)論。首先要說(shuō)的是計(jì)數(shù)器的作用,顯示屏一更新(以毫秒計(jì),Arduino millis函數(shù)提供)它就會(huì)記錄下來(lái),過(guò)一會(huì)兒可以再次更新。
儲(chǔ)存下面兩個(gè)變量可以使第二行上的信息滾動(dòng):
msgStartChar
這個(gè)變量會(huì)儲(chǔ)存先輸入的信息字符(因?yàn)橐膊荒馨?60個(gè)字全都輸在16個(gè)字符行里去)
lcdStartChar
這個(gè)變量?jī)?chǔ)存顯示屏上出現(xiàn)的信息,從右側(cè)開(kāi)始滾動(dòng)。
從右側(cè)開(kāi)始(位置15)減少lcdStartChar,一直到信息從第一個(gè)字符開(kāi)始(位置0)顯示的內(nèi)容就可以更新了,并且可以使信息滾動(dòng)到左邊。信息滾動(dòng)到最左邊以后,依次增加msgStartChar,就又重新滾動(dòng)回屏幕了。
void updateDisplay() {
//this function will scroll the message on one line and display battery status on the other
unsigned long currentMillis = millis();
if (currentMillis - lastUpdate > scrollInterval) {
lastUpdate = currentMillis;
//get battery status
chargeStatus();
lcd.clear(); //first we clear the whole lcd
lcd.setCursor(0, 0); //set cursor to first line
lcd.print(statusMessage);
//print sms on the 2nd line
if (newMessage == HIGH) {
msgStartChar = 0; //goto first line of new message
lcdStartChar = 15;
newMessage = LOW; //message dealt with
}
lcdStartChar = max(0,lcdStartChar - 1); //move one char along on the message (for scrolling)
lcd.setCursor(0, 1); //set cursor to bottom line
for (int j=0; j<= 15; j++) {
if (j < lcdStartChar) {
lcd.print(" ");
}
else if ((msgStartChar+(j-lcdStartChar)) < (smsLength-1)) {
lcd.print(smsContent[msgStartChar+(j-lcdStartChar)]);
}
else {
lcd.print(" ");
}
}
if (lcdStartChar <= 0) {
msgStartChar++; //move message to the left
}
if (msgStartChar >= smsLength) {
Serial.println("End of message");
//we have reached the end of the message, go back to the start
lcdStartChar = 15;
msgStartChar = 0;
}
}
}
這一步一點(diǎn)也不麻煩,只需要你選的電池板、液晶顯示屏和那個(gè)大瓶子。看看我的照片,我用膠布把三個(gè)電池板綁成三角管的形狀,便于折疊。
這個(gè)三角形的第四條邊,好吧,這已經(jīng)不是三角形了,這個(gè)第四條邊是一塊輕質(zhì)木頭,在中間鑿一個(gè)四邊形用來(lái)放顯示屏。
同樣,用膠布把這個(gè)木片粘好。沒(méi)連接起來(lái)的那邊用膠布粘一塊小磁鐵,這樣就方便打開(kāi)和折疊了???,就是這么簡(jiǎn)單!
圣誕節(jié)來(lái)了,硬創(chuàng)邦微信公眾號(hào)要給技術(shù)宅單身汪汪們發(fā)福利啦!12月25日將抽三名幸運(yùn)用戶(hù),每人送Arduino開(kāi)發(fā)板一塊!
雷鋒網(wǎng)在未來(lái)三個(gè)月內(nèi)選一個(gè)合適的時(shí)間,在北上深選擇一個(gè)地點(diǎn),舉辦創(chuàng)馬“火星救援”專(zhuān)場(chǎng)!詳情可點(diǎn)此處了解。
此外還可加入全球創(chuàng)客馬拉松主群(群號(hào):259592983),參與我們的互動(dòng)討論~
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。