使用 Arduino 和 Python在 Bluemix 上开发一个 IoT 应用程序之控制LED灯开关

上篇“【物联网(IoT)开发】Arduino 入门 Hello World(LED闪烁)”只是通过将一段程序烧录到Arduino开发板上控制LEC闪烁,没有任何连网动作,也就是说断开网络提供电源依然还可以工作。本文将介绍如何开发一个应用程序,以便使用适用于物联网 (Internet of Things, IoT) 的技术。我们的应用程序通过串口收集数据,将其存储在一个 Web 服务器上,然后在网页上实时显式结果,并可以在网页上控制LED的开关。

构建一个类似的应用程序的前提条件

对于第 1 部分,您需要:

一个 Bluemix 帐户,您还没有? 点击这里注册,已经有,点击这里登录;

对 HTML(超文本标记语言)的基本了解;

对CSS (层叠样式表)的基本了解;

对JavaScript(一种直译式脚本语言)的基本了解;

对Python 编程的基本了解;

对MySQL数据库及管理工具的基本了解;

对SQL语言的基本了解;

对于第 2 部分,您需要:

一个 Arduino NANO 或其他兼容 Arduino 的主板

可选:Arduino Ethernet Shield

一个LED灯(发光二极管)

一些母母跳线(female-female jumper wire)

Python 2.7.x

我提供了所有必要代码,但对这些技术的基本了解有助于您理解有关的细节,但不是必须如此。

也无需拥有使用 Arduino 或任何其他类型的微型控制器主板的经验。

步骤 1. 创建您的Python应用程序

  1. 1、在 Bluemix 用户界面中,转至“仪表板”。

  2. 0?wx_fmt=png

  3. 2、单击创建应用程序

  4. 0?wx_fmt=png

  5. 3、单击 Web,然后按照指导经验来选择入门模板,指定名称以及选择编码方式。

  6. 0?wx_fmt=png

  7. 输入应用程序名称

  8. 0?wx_fmt=png

  9. 应用程序名称是唯一的,接下来要通过它做为二级域名来访问你的应用!

  10. 点击完成之后,需要等待一会儿,然后可以看到下图的界面

  11. 0?wx_fmt=png

  12. 这时就可以访问你刚刚创建的应用了。如下图:

  13. 0?wx_fmt=png

步骤 2. 添加数据库服务

  1. 可以通过单击 Bluemix 用户界面中应用程序“概述”上的添加服务或 API,将服务添加到应用程序中。也可以使用 cf 命令行界面。请参阅处理应用程序的可用选项。

  2. 0?wx_fmt=png

  3. 在服务列表中选择数据库(ClearDB MySQL Database)

  4. 0?wx_fmt=png

  5. 您可以指定服务的名称,也可以使用默认的;

  6. 0?wx_fmt=png

如果你事先已经创建了数据库服务,也可以直接绑定:

0?wx_fmt=png

获取服务信息

进入自己的应用程序》概述页面,找到已经添加的服务,点击“显示凭证”,可以查看服务的具体信息:

0?wx_fmt=png

拿到凭证,我们就可以通过MySQL的客户端管理工具来连接管理数据库了:

1、连接数据库

如果你还没有安装Navicat for MySQL管理工具,请参考:MySQL学习(二)图形界面管理工具Navicat for MySQL安装和使用

0?wx_fmt=png

2、创建数据表

注意:我们是没有权限创建数据库的,只能用默认创建好的;

0?wx_fmt=png

只需要创建一张非常简单的表,来保存状态和控制命令

[sql] view plain copy

  1. SET FOREIGN_KEY_CHECKS=0;  

  2.   

  3. -- ----------------------------  

  4. -- Table structure for `led_status`  

  5. -- ----------------------------  

  6. DROP TABLE IF EXISTS `led_status`;  

  7. CREATE TABLE `led_status` (  

  8.   `id` bigint(20) NOT NULL,  

  9.   `status` varchar(10) DEFAULT NULL,  

  10.   `control` varchar(10) DEFAULT NULL,  

  11.   PRIMARY KEY (`id`)  

  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

  13.   

  14. -- ----------------------------  

  15. -- Records of led_status  

  16. -- ----------------------------  

  17. INSERT INTO `led_status` VALUES ('1''0''0');  

步骤 3. 准备开发环境及硬件环境

有关开发环境搭建的细节,请参考下面的文章:

《Python入门》Windows 7下Python Web开发环境搭建笔记

《Python入门》第一个Python Web程序——简单的Web服务器

《Python入门》Linux 下 Python Web开发环境搭建笔记

【物联网(IoT)开发】Arduino IDE(集成开发环境)下载及安装

【物联网(IoT)开发】Arduino NANO,UNO 驱动安装

本文使用的硬件环境非常简单,请参考:

【物联网(IoT)开发】Arduino 入门 Hello World(LED闪烁)

步骤 4.编写代码

1、下载初始Hello World示例代码

你可以下载入门示例参考,也可以完全自己写!

进入您的应用程序,点击左侧的开始编码,在右侧点击“下载入门模板代码”。

0?wx_fmt=png

也可以通过添加Git来下载代码。

2、使其在本地运行

1、将下载的入门模板代码解压到一个目录,打开命令行窗口,切换到这个目录下

0?wx_fmt=png

可以看出代码结构是很简单的;

2、执行命令:Python server.py

3、在浏览器中访问:http://localhost:8000/

3、编写代码

本文涉及到三部分代码

1)、烧录到Arduino开发板上的代码,用于接收串口的命令控制LED状态,并实时输出LED的状态

[plain] view plain copy

  1. String blink_flag = "1";  

  2.   

  3. // the setup function runs once when you press reset or power the board  

  4. void setup() {  

  5.   // initialize digital pin 13 as an output.  

  6.   pinMode(2, OUTPUT);  

  7.   Serial.begin(9600);  

  8. }  

  9.   

  10. // the loop function runs over and over again forever  

  11. void loop() {  

  12.   String rx_buffer;  

  13.   rx_buffer=Serial.readString();  

  14.   if (rx_buffer.length() == 1){  

  15.     blink_flag = rx_buffer;  

  16.   }  

  17.   

  18.   if (blink_flag.compareTo("1")){  

  19.     digitalWrite(2, LOW);   // turn the LED on (HIGH is the voltage level)  

  20.     //delay(1000);              // wait for a second  

  21.   }else{  

  22.     digitalWrite(2, HIGH);    // turn the LED off by making the voltage LOW  

  23.     //delay(1000);              // wait for a second  

  24.   }  

  25.   

  26.   Serial.print(",");  

  27.   Serial.print(blink_flag);  

  28.   delay(100);  

  29. }  

前端页面:index.html

[html] view plain copy

  1. <html>  

  2. <head>  

  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  

  4. <title>【物联网(IoT)开发】使用 Arduino 和 Python在 Bluemix 上开发一个 IoT 应用程序之控制LED灯开关 - 无知人生,记录点滴</title>  

  5. <style>  

  6. body {  

  7.     margin:0; padding:0;  

  8. }  

  9. a{  

  10. text-decoration:none;  

  11. color:black;  

  12. }  

  13.   

  14. div.div_id {  

  15.     float:left;  

  16.     clear:left;  

  17.     width:60px;  

  18.     height:27px;  

  19.     border-bottom:solid 1px #808080;  

  20.     text-align:center;  

  21.     line-height:27px;  

  22. }  

  23.   

  24. div.div_item {  

  25.     float:left;  

  26.     clear:none;  

  27.     width:260px;  

  28.     height:27px;  

  29.     border-bottom:solid 1px #808080;  

  30.     text-align:left;  

  31.     line-height:27px;  

  32. }  

  33.   

  34. div.div_radio {  

  35.     float:left;  

  36.     clear:none;  

  37.     width:60px;  

  38.     height:27px;  

  39.     border-bottom:solid 1px #808080;  

  40.     text-align:left;  

  41.     line-height:27px;  

  42.     display:none;  

  43. }  

  44.   

  45. div.div_num {  

  46.     float:left;  

  47.     clear:right;  

  48.     width:260px;  

  49.     height:27px;  

  50.     border-bottom:solid 1px #808080;  

  51.     text-align:left;  

  52.     line-height:27px;  

  53.     display:none;  

  54. }  

  55.   

  56. </style>  

  57. <script src="jquery.js" type="text/javascript"></script>  

  58. <SCRIPT language=javascript>  

  59.   

  60. $(document).ready(function(){  

  61.     setInterval(loadLedStatus,1000);  

  62. });  

  63.   

  64. //通过AJAX加载LED状态信息  

  65. function loadLedStatus(){  

  66.     $.ajax({  

  67.        type: "GET",  

  68.        url: "ledinfo",  

  69.        dataType:"html",  

  70.        async: false,  

  71.        success: function(data){  

  72.          if (data == "1"){  

  73.             $("#divctnr").html("<img src=\"led1.png\" />");  

  74.             $("#button1").hide();  

  75.             $("#button2").show();  

  76.          }else{  

  77.             $("#divctnr").html("<img src=\"led0.png\" />");  

  78.             $("#button2").hide();  

  79.             $("#button1").show();  

  80.          }  

  81.          console.log(data);  

  82.        },  

  83.        error: function(data){  

  84.          console.log(data);  

  85.          console.log( "加载LED信息失败: " + data.responseText );  

  86.        }  

  87.     });  

  88. }  

  89.   

  90. //通过AJAX调用后台保存LED信息  

  91. function execControl(status){  

  92.     $("#button1").hide();  

  93.     $.ajax({  

  94.        type: "POST",  

  95.        url: "ledcontrol",  

  96.        dataType:"html",  

  97.        data: {"id":status},  

  98.        success: function(data){  

  99.          console.log(data);  

  100.        },  

  101.        error: function(data){  

  102.          console.log(data);  

  103.          console.log( "命令发送失败: " + data.responseText );  

  104.        }  

  105.     });  

  106. }  

  107. </SCRIPT>  

  108. </head>  

  109.   

  110. <body>  

  111. <div>  

  112. <a href="http://blog.csdn.net/testcs_dn" target="_blank" title="无知人生,记录点滴 不积硅步,无以至千里;不积小流,无以成江海……">  

  113. <img src="banner.png" border=0 />  

  114. </a>  

  115. </div>  

  116. <div style="width:640px; height:40px; border-bottom:solid 1px #808080;text-align:center;">  

  117. <a href="http://blog.csdn.net/testcs_dn/article/details/49965993"><h3>您可以在这里监控和控制LED灯的点亮或关闭</h3></a>  

  118. </div>  

  119. <table id="Wrapper" style="padding: 0px; margin: 0px; min-height:300px; text-align: center; background-color: rgb(255, 255, 255);">  

  120. <tr>  

  121.     <td>  

  122.         <form>  

  123.             <div id="divctnr"></div>  

  124.         </form>  

  125.     </td>  

  126.     <td>  

  127.         <div style="width:640px; height:40px; text-align:center; float:left; clear:both; margin-top:15px;">  

  128.             <input type="button" id="button1" name="button1" value="点亮" onclick="execControl(1)" style="display:none; width:200px; height:45px; font-size:36px; font-weight:bold;" />  

  129.             <input type="button" id="button2" name="button2" value="关闭" onclick="execControl(0)" style="display:none; width:200px; height:45px; font-size:36px; font-weight:bold;" />  

  130.         </div>  

  131.     </td>  

  132. </tr>  

  133. </table>  

  134.   

  135. <hr />  

  136. <div style="margin:auto; text-align:center; line-height:28px;">  

  137. 云服务器:<a href="https://console.ng.bluemix.net/home/" target="_blank" title="IBM Bluemix 数字创新平台" style="">  

  138.     IBM Bluemix 数字创新平台  

  139. </a><br />  

  140. 服务提供:<a href="https://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/language-translation/api/v2/#introduction" target="_blank" title="IBM Watson Developer Cloud" style="">  

  141.     IBM Watson Developer Cloud  

  142. </a>  

  143. </div>  

  144.   

  145. <div style="margin:auto; text-align:center; line-height:28px;">  

  146. <a href="http://blog.csdn.net/testcs_dn" target="_blank" title="无知人生,记录点滴 不积硅步,无以至千里;不积小流,无以成江海……" style="">  

  147.     Powered by:testcs_dn(微wx笑)<br />  

  148.     无知人生,记录点滴 不积硅步,无以至千里;不积小流,无以成江海……  

  149. </a>  

  150. </div>  

  151. <br /><br /><br />  

  152. <div id="divout"></div>  

  153. </body>  

  154. </html>  

请点击左下角的“阅读原文”查看完整内容。

===========文档信息============ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值