科技發展如此精尖的現代社會,還會有多少人記得「漂流瓶」這個東西呢?就算有人知道,現在的科技讓漂流瓶也變成了虛擬的產物,殘存在微信、QQ等各種社交網絡中。在這個信息浮躁的世界,你有沒有想過向海裡丟一個真正的漂流瓶來傾訴自己的苦惱呢?
如果你真的去丟瓶子了,當瓶子飄走的時候你會不會後悔寫在瓶子裡的話呢?今天硬創邦的DIY教學就是教大家自製一個電子漂流瓶,有了這個電子漂流瓶後你就再也不用困擾這個問題啦!你可以隨時發信息來更新你寫下的話,有趣吧!
閒話不多說,教程開始。
這個項目主要運用了LinkIt One開發板而研發,在MediaTek的社區上,大多數的項目都是沒有外殼的,甚至像用於戶外的氣象站這樣的項目也沒有,所以我要展示一個簡易的現成的(取材於廚房)的防水的外殼。
大概的主要部件如下:
· 蓄電池供電
· 太陽能充電
· 放電或者充電狀態以一行16x2的字符顯示在液晶屏幕上
· 可以接收簡訊
· 信息可以滾動在屏幕上
我原本打算設計一款獨立的、太陽能的、可以連接WiFi的漂流瓶,這樣人們就可以在網上相互聯繫、下載資料或者相互留言,但是目前LinkIt One還不支持允許WiFi接入模式。所以我接下來想做一個像商店裡做的那種藍牙,當你進入商店你就可以接收信息(藍牙營銷),但目前應用界面程序好像還不允許……
1、Linkit One開發板
聯發科的Linkit One是一款非常酷的兼容Arduino 的開發平臺,你可以通過全球移動通訊系統接收簡訊,也可以給電池充電。
2、一張SIM卡
一張交過費並且可以接收簡訊的SIM卡,最好沒有PIN碼。
3、太陽能電池板
我從廢舊的儀器上拿來了3個大約1W輸出量的細長的8-10V的太陽能板,如果你不怕等快遞的話,在Aliexpress網站上也能輕鬆買到。
4.電源轉換器
我選用了Power Trends PT78ST105S這款,規格如下:
輸入電壓:9-38V
輸出電壓:5V
輸出電流:1.5A
5、寬膠帶
我用寬膠帶把三個太陽能板粘成可摺疊的組合,再把各種模塊粘到太陽能板的背面。摺疊之後看起來相當整齊。
6、一個瓶子
最好用醃製果醬的廣口瓶,但是我沒找到,所以用了一個1.5升的彈簧瓶。
簡單的辦法
如果你不想自己設計電路,可以去Aliexpress這樣的網站買一個太陽能手機充電器,付完錢等兩個月就ok了。
複雜的辦法
這有一個用太陽能給你的LinkIt One充電的深入教程,要是想了解更多的話可以閱讀一下(全英文哦,學渣慎入)。
連接電池板
把電池板擺成三角管狀(像Toblerone三角巧克力,具體長啥樣自行度娘),這個問題有點複雜,但是你掌握以下幾點即可:
1.一組串聯電池中的輸出電流大小取決於電量最小的電池產生電流的能力。
2.照明度一定時,輸出電壓是恆定的。
如果電池是串聯的,其中一個變暗,總電流會減小,如果是並聯的,能吸收光能的電池就可以無限的輸出電能。
選擇5V的轉換器
LinkIt One開發板有一個內置充電器,通過USB埠就可以給這個內置充電器穩定地輸入5V的電壓。太陽能電池板的輸出電壓隨著吸收光能的變化在5V附近輕微浮動,所以我們需要一個開關型穩壓器降低電壓。
轉換器有許多種,你只需要選一個滿足下列要求的就可以了。
確保電池板的輸出電壓在開關型穩壓器的輸入電壓範圍內。
5V(不能多不能少正正好好)
穩壓器一定要能負載通過的電流,看一下電池板的額定電流(在電源上可以看見),這是最大允許的輸入電流。不計無用功,輸出電流=輸入電流*(輸入電壓/輸出電壓)。
穩壓器示例(1)
我手邊有一個型號是Power Trends PT78ST105S的穩壓器,規格如下:
輸入電壓:9-38V
輸出電壓:5V
輸出電流:1.5A
穩壓器示例(2)
我把兩個8V的電池串聯起來組成了一個最小輸入電壓為14V的電池。
輸入電壓:14-28V
輸出電壓:5V
輸出電流:500mA
連接5V的轉換器
需要一個微型USB連接器,我從廢棄的電話充電器上取下來一個。
連接步驟如下:
電池板的正極連到穩壓器的VIN端
電池板的負極連到穩壓器的GND端
穩壓器的輸出電壓端連接USB連接器的+5V端
穩壓器的GND端連接到USB連接器的GND端
連接
我從舊家電上拿到了一個16x2的液晶顯示屏,如果你有16x4的或者任何帶有HD44780晶片的類似的顯示屏都可以。
下表列出了所有接口的作用。
如果顯示器有背光源,那麼這就是在15和15埠間的發光二極體。這種顯示器比較費電。
想了解更多關於16x2顯示屏的信息請點擊連接Adafruit's well documented articles。
測試
充上電源連接好各埠之後,顯示屏上應該就可以看到信號了,如果沒有的話一定是哪裡出錯了,檢查一下各連接處,調節對比電阻器,把埠3直接連到GND上可以設置最大對比度。
現在讓我們開始寫代碼控制顯示器吧。
注意:關於LiquidCrystal庫
就在寫這個教程的時候,我用的這個1.6.5版本Arduino的LinkIt One硬碟驅動器的LiquidCrystal庫崩潰了,如何修補LiquidCrystal文檔請參照Instructable。
簡介:
我想你應該能讓LinkIt One 和Arduino 硬碟驅動器同時運行了,如果沒有請點擊這裡。
我已經把最終版的代碼寫在這裡了,特別描述了其中比較重要的部分,這或許會讓你更好的理解這個程序 。
導庫
首先導入會用到的各種庫。
#include <LGSM.h>
#include <LiquidCrystal.h>
#include <LBattery.h>
定義變量
接下來我們定義整個程序中會用到的總體變量,大部分變量都會定義為「進程名[x]」,也就是一系列X字符,可以用來儲存文本或狀態信息。
//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;
設置方法
主板導入的時候這個函數就會運行。
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卡準備就緒方法
如果SIM卡沒有初始化的話程序還不能正常運行,所以你只能等SIM卡準備就緒,這個時候你可以在界面上打出小點確保設備還是完好的。
void waitForSim() {
Serial.print("waiting for sim");
while (!LSMS.ready())
{
delay(250);
Serial.print('.');
}
Serial.println("Sim Ready");
}
接收簡訊方法
當收到新消息時,這個函數就可以自動查看,一次讀取一個字符,並儲存在緩衝箱內,函數返回高檔(true/1),沒有新消息時返回低檔(false/0)。收到新消息時,「新消息」boolean設置成True。讀取信息之後信息會被刪除。
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;
}
}
充電狀態方法
這個函數由16個字符的文本組成。充電狀態用1表示,未充電狀態用0表示。剩餘電量用0,33,66,100表示,電池的電流量水平決定了剩餘電量。用sprintf函數把前兩個函數轉化成一行文本的格式,在此文本中,儲存的狀態信息字符用於下面的更新顯示函數中。
void chargeStatus() {
if(LBattery.isCharging()) {
sprintf(statusMessage,"%3d%% charging", LBattery.level() );
}
else {
sprintf(statusMessage,"%3d%% charged", LBattery.level() );
}
}
更新顯示函數
前面形成的文本內容都要發送到液晶顯示屏上,通過顯示屏我們才能直觀的感受到信息以及查看評論。首先要說的是計數器的作用,顯示屏一更新(以毫秒計,Arduino millis函數提供)它就會記錄下來,過一會兒可以再次更新。
儲存下面兩個變量可以使第二行上的信息滾動:
從右側開始(位置15)減少lcdStartChar,一直到信息從第一個字符開始(位置0)顯示的內容就可以更新了,並且可以使信息滾動到左邊。信息滾動到最左邊以後,依次增加msgStartChar,就又重新滾動回屏幕了。
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;
}
}
}
這一步一點也不麻煩,只需要你選的電池板、液晶顯示屏和那個大瓶子。看看我的照片,我用膠布把三個電池板綁成三角管的形狀,便於摺疊。
這個三角形的第四條邊,好吧,這已經不是三角形了,這個第四條邊是一塊輕質木頭,在中間鑿一個四邊形用來放顯示屏。
同樣,用膠布把這個木片粘好。沒連接起來的那邊用膠布粘一塊小磁鐵,這樣就方便打開和摺疊了。看,就是這麼簡單!
聖誕節來了,硬創邦微信公眾號要給技術宅單身汪汪們發福利啦!12月25日將抽三名幸運用戶,每人送Arduino開發板一塊!
雷鋒網(公眾號:雷鋒網)在未來三個月內選一個合適的時間,在北上深選擇一個地點,舉辦創馬「火星救援」專場!詳情可點此處了解。
此外還可加入全球創客馬拉松主群(群號:259592983),參與我們的互動討論~
雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。