如果你家有小孩,一定能懂我做这个项目的初衷。我们每天都会玩着手机,敲着键盘跟朋友聊天,小孩子看见了就想模仿,但出于保护眼睛等一系列考虑,我们又不能让他们过早的接触电子设备。所以我就想到,能不能做一个小玩意让他们也尝试着学习阅读和书写呢?不过项目刚开始时确实挺困难,所以我又不断添加新功能以保持它对孩子的吸引力。
在开始写教程之前,我想感谢http://www.rinkydinkelectronics.com,我从上面汲取了很多营养,从各种库到代码,有了它们我才能玩转这块tft触摸屏。
所需零配件:
·arduino mega 2560开发板。
·一块3.2英寸的触摸屏和保护壳,别忘了触控笔。
·一张sd卡,用来保存孩子的涂鸦。
·esp8266 wifi模块,以便设备连接互联网。
·ds1703时钟模块。
·电池适配器(找适合你所用电池的哦)。
·一个漂亮的壳子
·设定好一个互联网接入点,这样即使你不在家也可连上热点使用设备。
·在服务器上创建一个随时能通过php访问的数据库。
·为不同的孩子创建不同的电邮地址。
第一步:连接硬件
由于屏幕和外壳占据了mega 2560的所有接口,所以我不得不在mega开发板两边又焊接了几个接口,虽然看起来丑了点,但至少管用了。这样我们准备的 ds1703和esp8266模块,甚至电池都可以顺利连接了。
说到esp8266 wifi模块,这次我算是走了狗屎运,连接时我直接将esp8266模块的rx和tx接口连上了mega开发板上的tx和rx接口,幸运的是,它居然运行无误。其实这不是正确的连接方法,我推荐你们还是参考下下面这个网页的连接方法吧:
随后你就可以将触摸屏连上mega开发板并套上保护壳了。对了,别忘了插入准备好的sd卡。
第二步:载入软件
想要运行该设备,你需要两个软件组件。第一个是arduino sketch,第二个则是运行在你服务器上的php脚本和来自arduino的http get请求。esp8266上使用的http 1.0协议有些过时,用起来有些不舒服,你只能通过它发送http get请求和http post请求。所以你需要将来自arduino的http get请求转换成stmp(简单电子邮件协议)或其他格式,而这正是php脚本的一部分。
arduino
在arduino 1.5.6 beta上,该sketch的运行和测试都进行的很顺利,但升级到最新的1.6.0就不行了(出现了tft校准错误)。所以在你加载这个sketch之前,请对其进行编辑并根据你的互联网接入点设置相应参数。下面是范例:
#define dest_host “www.your_own_host.de”
#define ssid_home “fritzboxhome”
#define pass_home “abcdefghijklmnopqrstuvwxyz”
记住,dest_host并不是你在服务器上的ip地址,所以你的php脚本不会在那里运行。在你的根目录里,sketch会建立一个名为“scripts”的文件夹,而你的php脚本最终会上传到这里。
ssid_home 和pass_home则是互联网接入点的设置。想要通过路由器上网(我用的是德国的fritz box路由),你就要进入路由器设置中心对其进行配置。想使用移动热点的话,你就要进入设置-》更多设置-》wlan热点-》移动热点对其进行配置(安卓系统)。
下载了sketch之后记得先阅读详细步骤并做出正确的配置调整。如果一切运行正常,在加载了sketch之后,你就会看到主界面,上面会显示键盘,一些图标和wifi状态栏(绿色为已连接,红色则为断开)。
php
php脚本在这个项目中起了很重要的作用,它是arduino开发板和smpt服务器之间的接口,你可以通过它收发邮件。它可以将开发板上反馈来的http get请求转换成相应的动作,完成阅读邮件,发送邮件和图片等工作。
第三步:使用应用程序:用户和邮件设置
用户
该程序可供三个不同用户使用,每个用户都可设定自己的头像(.c文件,和sketch一起上传到ram中)。这个格式比较少见,你可以通过网站jpg_to_c converter将一张32x32的jpg图片转换成一个.c文件。
创建三个用户时可使用下列代码(三个用户分别为samira,kilian和keanu):
#define sender_cnt 3
//photo .c files:
extern unsigned int keanu[0x1024];
extern unsigned int kilian[0x1024];
extern unsigned int samira[0x1024];
char *key_sendername[sender_cnt] = { “samira”, “kilian”, “keanu” };
unsigned int *icon_sendername[sender_cnt] = {samira, kilian, keanu};
你在创建用户时只需修改用户名和图片就行了,其他代码完全相同。
更换用户时,你只需点击logged user图标并选择要使用的用户就好。登陆的用户可以发送邮件或阅读收到的邮件,每个用户在sd卡的根目录上都会有自己专用的信箱文档,你的邮件和邮件中的附图都会保存在这里。未来,我想让该设备能定期扫描邮箱并下载邮件供用户阅读。
设定邮件发送人和收件人
选择好用户后,http get请求就会记录用户的相关信息,随后便会在服务器上生成用户的邮件地址。
想要改变收件人,只需点击mail to图标并在其中进行选择就好。与上一步相同,设备会记录收件人的相关信息,然后通过php转换出正确的邮件地址。
更多详细信息请参阅第六步:发送邮件。
第四步:使用应用程序:涂鸦
想要画画,点击彩虹图标就行,该图标在作画前是红色的。
所有的画作都会保存在sd卡上,用户可以找到它们并将其添加到邮件中。
由于http 1.0的限制,你无法采用二进制发送图片,所以孩子的涂鸦会转换成一种特有格式并保存在一个文本文档中,发送后服务器便会将其重新转换为图片。
为了避免发送的图片体积过于庞大,在屏幕中央右侧还会显示一个彩色图标,它会根据图片的大小不断变色。如果该图标变红,就说明图片体积已达上限,自此sd卡就不会继续记录信息了。最大图片体积为3k,这对孩子的涂鸦来说绝对足够了。
彩色图标还会充当确认键,画图完成时你需要点击它进行确认。随后彩虹图标就会显现出来,这时你就可以将图片添加进邮件了。如果你暂时不想发送,该图片会被保存在sd中,随后你可以通过图片浏览器回看这些图片。
第五步:使用应用程序:发送邮件
发邮件也很简单,只要点击信封图标,就可以发出一封邮件(原始邮件是http get请求,随后会转换为可读邮件)。如果系统工作正常,发送状态栏会呈绿色,若wifi连接出现问题,状态栏则会变成红色。
http get请求包含了许多服务器端的邮件信息,包括用户的姓名和收件人的姓名。而php脚本则会收到一条包含请求和配置值的信息。当然,我们必须在php脚本上传到服务器前搞定这些设置,这样邮件系统才能正常工作。
下面是php脚本中很有趣的一部分:
/*****************************************/
/* send mail */
/*****************************************/
if( (strlen($send_mail_from) 》 0 && strlen($send_mail_to) 》 0)
|| strlen($get_image) 》 0 || strlen($_post[“mailimage”])》0
|| strlen($end_image) 》 0 || strlen($get_image_name) 》 0
|| strlen($give_me_image) 》 0 )
{
$handy_light = 0;
$to = ‘mama@your_domain.com’;
if( strcmp($send_mail_to, “papa”) == 0 )
$to = ‘papa@your_domain.com’;
else if( strcmp($send_mail_to, “keanu”) == 0 )
{
$to = ‘keanu@your_domain.com’;
$handy_light = 1;
}
else if( strcmp($send_mail_to, “kilian”) == 0 )
{
$to = ‘kilian@your_domain.com’;
$handy_light = 1;
}
else if( strcmp($send_mail_to, “samira”) == 0 )
{
$to = ‘samira@your_domain.com’;
$handy_light = 1;
}
else if( strcmp($send_mail_to, “mami”) == 0 )
$to = ‘gradnma@hotmail.com’;
else if( strcmp($send_mail_to, “juanito”) == 0 )
$to = ‘oncle@hotmail.com’;
else if( strcmp($send_mail_to, “javier”) == 0 )
$to = ‘myfriend@gmail.com’;
$subject = ‘de: ’ 。 $send_mail_from;
$message = $mailbody;
$headers = ‘from: ’ 。 $send_mail_from 。 ‘@your_domain.com’ 。 “
” 。
‘reply-to: ’ 。 $send_mail_from 。 ‘@your_domain.com’ 。 “
” 。
‘x-mailer: php/’ 。 phpversion();
你只需要将我的发件人mama,papa等改成你想要的名字就好。
mama@your_domain.com
papa@your_domain.com.。 etc
此外你还可以修改邮箱地址。
php 脚本需要获知是否收件人已经通过pc,手机或mailduino收到了邮件。只有这样,它才能决定是否执行对图片的转换工作,以便收件人在不同的设备上看到正常的图片(普通设备会转换为jpg,mailduino则会直接读取.c格式的文档)。所以,请将php变量$handy_light设为true或 false(应对不同的收信设备)。
第六步:使用应用程序:接收邮件
想阅读邮件的话,你需要点击卡车图标,这样就能进入邮件界面了。不过屏幕上只会显示最近的四封邮件,所有收到的邮件都保存在邮箱文档里。该设备无法读取采用html代码的邮件,所以在正式使用前我推荐你先在pc上做下测试,将设定改为“仅文本”。
想要看看是否收到了新邮件?很简单,只需点击主界面上部的卡车图标就好。只要用户在两分钟内没有活动,系统就会自动检查并下载新邮件。在整个过程中,开发板会发送一个http get请求,随后php脚本便会开始检查新邮件,所有新邮件都会以较为简单的格式回传到arduino开发板。如果收到了新邮件,界面右下方就会出现一个蓝色的m图标来提醒你。
在邮件域中,标准文本呈白色,发送人地址则为红色。为了保证发送域包含一个已知人的标识符,屏幕上会显示发送人的头像。
如果邮件内含有图片,那么收到的邮件会包含图片的名字,arduino会通过http get再次向服务器发起请求,这时设备就会开始新的下载,你就能看到原始的全像素图片了。此外,你可以通过接收状态栏来了解下载的状态。
如果邮件内含有图片,你会在邮件域的右边看到一片彩虹,点击它就能打开图片。
php配置
如果你想随时查看账户,服务器端也有些设置需要改变。来自arduino的http get请求包含了账户的名字,这些会保存在一个名为$get_mails_for的变量php脚本中。请参考下列代码并修改你想查看的邮件地址和密码。
/*****************************************/
/* receive mails */
/*****************************************/
else
{
if( strcmp($get_mails_for,“keanu”) == 0 )
{
$user_name=“keanu@your_domain.com”;
$user_pass=“a123456b”;
}
else if( strcmp($get_mails_for,“kilian”)==0 )
{
$user_name=“kilian@your_domain.com”;
$user_pass=“a123456b”;
}
else if( strcmp($get_mails_for,“samira”) == 0 )
{
$user_name=“samira@your_domain.com”;
$user_pass=“a123456b”;
}
else
$user_name=“default@your_domain.com”;
echo “reading mails for ” 。 $get_mails_for 。 “ from server with php”;
$inbox = imap_open (“{”。 $mail_host 。 “:143}inbox”, $user_name, $user_pass) or die(“can‘t connect imap-server!”);
第七步:使用应用程序:图片浏览器
用户的所有画作都会存储在sd卡上,只要点击时钟图标左边的图标就可进入图片浏览模式,图片浏览器中的图片会按名字呈九宫格排列。
想要看原始大小的图片,你只需点击它就行。看完之后,随便点击以下图片就能回到刚刚的浏览界面。
如上图所示,手型图标可以让你进入下一页。
确认图标则可以让你回到主界面。
第八步:时钟界面
想要激活该设备的时钟功能,你需要先对你的ds1307时钟模块进行设置。只需加载下列arduino sketch并调好时间就行(记得用unix格式):
/* t(string_utctime) */
#include
#include
#include // a basic ds1307 library that returns time as a time_t
void setup()
{
serial.begin(9600);
setsyncprovider(rtc.get); // the function to get the time from the rtc
if(timestatus()!= timeset)
serial.println(“unable to sync with the rtc”);
else
serial.println(“rtc has set the system time”);
}
void loop()
{
if(serial.available())
{
time_t t = processsyncmessage();
if(t 》0)
{
rtc.set(t); // set the rtc and the system time to the received value
settime(t);
}
}
digitalclockdisplay();
delay(1000);
}
void digitalclockdisplay(){
// digital clock display of the time
serial.print(hour());
printdigits(minute());
printdigits(second());
serial.print(“ ”);
serial.print(day());
serial.print(“ ”);
serial.print(month());
serial.print(“ ”);
serial.print(year());
serial.println();
}
void printdigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
serial.print(“:”);
if(digits 《 10)
serial.print(’0‘);
serial.print(digits);
}
/* code to process time sync messages from the serial port */
#define time_msg_len 11 // time sync to pc is header followed by unix time_t as ten ascii digits
#define time_header ’t‘ // header tag for serial time sync message
time_t processsyncmessage() {
// return the time if a valid sync message is received on the serial port.
while(serial.available() 》= time_msg_len ){ // time message consists of a header and ten ascii digits
char c = serial.read() ;
serial.print(c);
if( c == time_header ) {
time_t pctime = 0;
for(int i=0; i 《 time_msg_len -1; i++){
c = serial.read();
if( c 》= ’0‘ && c 《= ’9‘){
pctime = (10 * pctime) + (c - ’0‘) ; // convert digits to a number
}
}
return pctime;
}
}
return 0;
}
设定好你的ds1307后,只需点击主界面上的时钟图标就可以用该设备查看当前时间了。
一个diy的儿童电脑就完成啦,大家快试试吧!
锐龙52600和酷睿i5-8400哪个性价比最高
解析STM32的库函数-1
高通是否要重回数据中心市场?
你知道Linux内核调试关键技术之一的printk?
以80C196MC单片机为控制核心的步进电机恒转矩斩设计
基于Arduino自制儿童小电脑
美国高调表态重回新能源汽车战场
独角兽企业是什么意思_中国的独角兽公司都分布在哪些行业呢?
蓝厂vivo要发全面屏手机vivox20,绿厂oppo又来搞事情OPPOFind9也要搞全面屏
电动汽车智能充电桩设计方案及其设计要求探索
iPhone8什么时候上市?iPhone8最新消息:外观创新无边框设计,内置指纹识别与无线充电!iPhone8有这4大黑科技?
气体检测仪的使用寿命是多久
禾多科技参加MEET2024智能未来大会
多功能充电器的设计与制作,Multi-function battery charger
不同Pi-pad衰减器的电路方程案例
中国移动正式公布了2019-2020年基站天线集中采购项目中标候选人结果
5G时代即将来临 但仍面临多项挑战
最常见的7805集成稳压电路介绍
三星note7翻新机即将开卖,价格真狠!
中教照明:专注于校园健康照明领域