科技爱好者博客 http://blog.lxx1.com 开源知识分享博客,讨论树莓派、Arduino、Linux、服务器使用配置教程 Tue, 12 Dec 2017 16:54:41 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.9.1 树莓派存储温度数据并制作交互式图表 http://blog.lxx1.com/2914?pk_campaign=feed&pk_kwd=%25e6%25a0%2591%25e8%258e%2593%25e6%25b4%25be%25e5%25ad%2598%25e5%2582%25a8%25e6%25b8%25a9%25e5%25ba%25a6%25e6%2595%25b0%25e6%258d%25ae%25e5%25b9%25b6%25e5%2588%25b6%25e4%25bd%259c%25e4%25ba%25a4%25e4%25ba%2592%25e5%25bc%258f%25e5%259b%25be%25e8%25a1%25a8 http://blog.lxx1.com/2914?pk_campaign=feed&pk_kwd=%25e6%25a0%2591%25e8%258e%2593%25e6%25b4%25be%25e5%25ad%2598%25e5%2582%25a8%25e6%25b8%25a9%25e5%25ba%25a6%25e6%2595%25b0%25e6%258d%25ae%25e5%25b9%25b6%25e5%2588%25b6%25e4%25bd%259c%25e4%25ba%25a4%25e4%25ba%2592%25e5%25bc%258f%25e5%259b%25be%25e8%25a1%25a8#respond Sun, 01 Oct 2017 04:59:58 +0000 http://blog.lxx1.com/?p=2914 树莓派存储温度数据并制作交互式图表,首发于科技爱好者博客

Raspberry Pi的芯片系统(SoC)具有温度传感器,可用用命令行测量其温度。它可以提供芯片在运行期间产生多少热量的信息,并且还报告环境温度。该项目的目的是创建一个简单的Python脚本,可以在启动您的Raspberry Pi时自动运行,并以特定间隔从温度传感器 ...

树莓派存储温度数据并制作交互式图表,首发于科技爱好者博客

]]>
树莓派存储温度数据并制作交互式图表,首发于科技爱好者博客

Raspberry Pi的芯片系统(SoC)具有温度传感器,可用用命令行测量其温度。它可以提供芯片在运行期间产生多少热量的信息,并且还报告环境温度。该项目的目的是创建一个简单的Python脚本,可以在启动您的Raspberry Pi时自动运行,并以特定间隔从温度传感器进行测量,并将其写入日后可以查看的文件。您还可以以交互式绘制的图形来查看数据。

你会学到什么

通过完成温度项目,您将学习:

  • 如何在Python中运行系统命令
  • 如何将数据写入文件
  • 如何用matplotlib交互式绘制数据
  • 如何设置脚本以使用crontab自动运行

你会需要什么

软件

python3-matplotlib

软件安装

要安装所需的软件,请在终端中运行以下命令:

sudo apt-get install python3-matplotlib

温度记录

Raspberry Pi的芯片系统(SoC)具有温度传感器,可用于从命令行测量其温度。它可以提供关于芯片在运行期间产生多少热量的信息,并且还可以报告环境温度。该项目的目的是创建一个简单的脚本,可以在您启动Raspberry Pi时自动运行,并以特定间隔从温度传感器进行测量,并将其写入日后可以查看的文件。

创建一个Python脚本来监视温度

  • 通过 Menu > Programming > Python 3 (IDLE) 打开一个新的Python 3 shell。
  • 现在通过点击 File > New File 创建一个新的Python脚本。
  • 您可以使用GPIO Zero模块查找CPU温度。首先你需要导入CPUTemperature类:
      from gpiozero import CPUTemperature
  • 然后可以创建一个cpu对象:
      cpu = CPUTemperature()
    
  • 保存并运行此程序(按Ctrl + S,然后按F5),然后交换到shell。在这里,您可以轻松查询CPU温度。
>>> cpu.temperature
 32.552

将数据写入CSV文件

如果温度数据可以存储起来,这将非常有用。CSV(逗号分隔值)文件比较理想,因为它可以被Excel和LibreOffice等应用程序所使用。

  • 您将在获取CPU温度时记录日期和时间,因此需要一些额外的库。将其添加到您的导入:
      from time import sleep, strftime, time

    这些额外的模块让你暂停你的程序(sleep),将今天的日期作为一个字符串(strftime)获得,并在所谓的UNIX时间time)中获得确切的时间。

  • 要写入文件,您首先需要创建它。在文件末尾添加以下行:
      with open("cpu_temp.csv", "a") as log:

    这将创建一个名为“新文件” cpu_temp.csv的名称log。它也以附加模式打开它,因此行只会写入文件的末尾。

  • 现在,您将需要启动一个无限循环,直到您用Ctrl + C杀死程序:
      with open("cpu_temp.csv", "a") as log:
          while True:
  • 在循环中,您可以获取温度并将其存储为变量。
      with open("cpu_temp.csv", "a") as log:
          while True:
              temp = cpu.temperature
  • 现在,您要将当前日期和时间以及温度都写入CSV文件:
      with open("cpu_temp.csv", "a") as log:
          while True:
              temp = cpu.temperature
              log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str(temp)))
  • 那条命令有点复杂,所以让我们把它分解一下:
    • log.write() 将括号中的任何字符串写入CSV文件。
    • "{0},{1}\n" 是一个包含两个占位符的字符串,用逗号分隔,并以新行结束。
    • strftime("%Y-%m-%d %H:%M:%S")插入第一个占位符。这是当前的日期和时间作为一个字符串。
    • str(temp) 是将CPU温度转换为字符串,这是在逗号后写入第二个占位符。
  • 最后,您可以在文件的末尾添加一行,以便在写入之间暂停脚本。这里暂停一秒钟,当然您可以使用任何您想要的间隔:
      sleep(1)
  • 整个脚本现在应该如下所示:
     from gpiozero import CPUTemperature
      from time import sleep, strftime, time
    
      with open("cpu_temp.csv", "a") as log:
          while True:
              temp = cpu.temperature
              log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str(temp)))
              sleep(1)

 

实时绘制数据

您可以生成一个随着数据的记录CPU温度也更新的CPU温度图。为此,您需要使用matplotlib库。安装说明在这里

  • 首先,导入matplotlib库:
      import matplotlib.pyplot as plt
  • 您的导入后可以接下来三行。他们告诉matplotlib你会做交互式绘图,并创建两个列表,将保存要绘制的数据:
      plt.ion()
      x = []
      y = []
    
  • 下一行都进入你的while True循环,在CSV被写入之前,但temp = get_temp()在行之后。首先,将当前温度添加到y列表的末尾,并将列表的末尾添加到时间x
     y.append(temp)
     x.append(time())
    
  • 接下来,需要清除绘图,然后计算点和线:
     plt.clf()
     plt.scatter(x,y)
     plt.plot(x,y)
    
  • 最后,可以画出线:
      plt.draw()
    
  • 运行你的程序,你应该看到交互式绘制的图形。打开一些程序,如Minecraft或Mathematica,并观察CPU温度的升高。

本文翻译自:https://projects.raspberrypi.org/en/projects/temperature-log

原文:树莓派温度记录


树莓派存储温度数据并制作交互式图表,首发于科技爱好者博客

]]>
http://blog.lxx1.com/2914?pk_campaign=feed&pk_kwd=%25e6%25a0%2591%25e8%258e%2593%25e6%25b4%25be%25e5%25ad%2598%25e5%2582%25a8%25e6%25b8%25a9%25e5%25ba%25a6%25e6%2595%25b0%25e6%258d%25ae%25e5%25b9%25b6%25e5%2588%25b6%25e4%25bd%259c%25e4%25ba%25a4%25e4%25ba%2592%25e5%25bc%258f%25e5%259b%25be%25e8%25a1%25a8/feed 0
我的装备(硬件软件)介绍 http://blog.lxx1.com/2900?pk_campaign=feed&pk_kwd=%25e6%2588%2591%25e7%259a%2584%25e8%25a3%2585%25e5%25a4%2587%25ef%25bc%2588%25e7%25a1%25ac%25e4%25bb%25b6%25e8%25bd%25af%25e4%25bb%25b6%25ef%25bc%2589%25e4%25bb%258b%25e7%25bb%258d http://blog.lxx1.com/2900?pk_campaign=feed&pk_kwd=%25e6%2588%2591%25e7%259a%2584%25e8%25a3%2585%25e5%25a4%2587%25ef%25bc%2588%25e7%25a1%25ac%25e4%25bb%25b6%25e8%25bd%25af%25e4%25bb%25b6%25ef%25bc%2589%25e4%25bb%258b%25e7%25bb%258d#respond Sat, 30 Sep 2017 03:01:52 +0000 http://blog.lxx1.com/?p=2900 我的装备(硬件软件)介绍,首发于科技爱好者博客

工欲善其事,必先利其器 --《论语》 古人很早就说了,工匠想要使他的工作做好,一定要先让工具锋利,同样的道理,在现在社会,我们所使用的装备对工作效率和生活质量有着极其紧密的联系,这也是我一直以来钟爱新产品的原因。在这里介绍下我当前在使用 ...

我的装备(硬件软件)介绍,首发于科技爱好者博客

]]>
我的装备(硬件软件)介绍,首发于科技爱好者博客

工欲善其事,必先利其器

–《论语》

古人很早就说了,工匠想要使他的工作做好,一定要先让工具锋利,同样的道理,在现在社会,我们所使用的装备对工作效率和生活质量有着极其紧密的联系,这也是我一直以来钟爱新产品的原因。在这里介绍下我当前在使用的装备,结合自己的使用感悟,给大家做个参考。

个人介绍

我是李新星,科技爱好者博客的博主,2016年6月从大学毕业,毕业后在一家企业上班,平时上班时间比较忙,也很少使用电脑。虽然自己的生活没有那么的丰富多彩,但是一直在关注各类数码产品,也算一个数码爱好者。

硬件

  • Lenovo Ideapad Flex14 联想在2012年出的一款超极本,特点是支持触摸屏,可以将屏幕翻转270度,机身厚度只有17mm,比当时的绝大部分笔记本都薄。当时买就是冲着触摸屏去的,结果买来一个月就后悔了,因为触摸屏根本用不上啊。现在我已经想不起来这款笔记本支持触摸屏了,只有当同学用手指在屏幕上指东西不小心划到时,他就会惊奇的说,原来是可以触摸的啊,这才提醒了我,不然早都忘了是可以支持触摸的。私以为,笔记本形态的电脑,触摸屏非常多余,即使是现在windows 10对触摸屏的支持已经很好了,但使用起来还很不方便。
  • jumper EZpad 由于经常在外,笔记本不方便携带,这时发现了一款国产的二合一windows 平板电脑,它比较小巧,屏幕只有10.6英寸,非常适合在外使用。
  • hongmi Note3 大四寒假时购买,替换在大学使用了三年多的手机。这部手机到现在还很流畅,但可惜的是存储容量只有32G,每次都提醒我要清理空间,这个很烦。对了,使用的CPU是联发科X10,在打王者荣耀的时候比较卡,特别是在团战时,一卡一卡的,估计这就是导致我上不了王者的原因哈哈。
  • HHKB pro 2  贼贵的键盘,比较适合程序员,不是机械键盘,而是电容键盘,寿命比机械键盘更长,可以传给自己的孙子~
HHKB Professional 2打字体验
  • Kindle 8 上大学前军训一个月,这段时间没啥事,就天天看书,发现纸质书很贵,而且买书也不方便,需要等快递,看完之后不好处理,尤其是搬家的时候,几本书就特别沉,然后就买了这款神器,解决了上述纸书的所有问题。

  • Raspberry 2B 看我博客的人估计都知道树莓派,一款只有信用卡大小的小电脑,可以安装linux操作系统,方便我研究linux。

  • Arduino Uno 一款开源的嵌入式开发板,我的专业是电子信息工程,学习的方向是嵌入式开发,上大学在实验室的时候就很想买,虽然价格在100左右,但一直也没舍得买,直到工作后才买,也是很好玩,做东西也很简单。

  • Ticwatch E 出门问问团队出的一款智能手表,支持独立接打电话,具有NFC功能,能闪付,目前支持刷北京和深圳的地铁,缺点是手表续航时间太短了,像我正常使用,早上6点从充电器上摘下配带,下午进行30分钟的跑步,这样到晚上10点睡觉,大约剩60%电量。

  • 佳能700D.

软件

  • chrome 浏览器中的佼佼者,速度快还可以安装各种插件,最强大的功能是可以同步书签、配置、浏览记录、密码等等。
  • Typora markdown编辑器,在撰写的同时实现了实时预览,界面也很简洁。
  • Shad/ow/socks(防止屏蔽) 这是X樯软件,不多说,需要的可以在这里使用:我的科学上网方式分享——使用搬瓦工服务器科学上网 
  • Xshell 5 ssh远程连接软件,功能强大。
  • Git

Wish List

  • Macbook pro
  • Bose QC35降噪耳机
  • 感动牌800D单反
  • Kindle Voyage

 


我的装备(硬件软件)介绍,首发于科技爱好者博客

]]>
http://blog.lxx1.com/2900?pk_campaign=feed&pk_kwd=%25e6%2588%2591%25e7%259a%2584%25e8%25a3%2585%25e5%25a4%2587%25ef%25bc%2588%25e7%25a1%25ac%25e4%25bb%25b6%25e8%25bd%25af%25e4%25bb%25b6%25ef%25bc%2589%25e4%25bb%258b%25e7%25bb%258d/feed 0
树莓派搭建指示灯自动显示在空间站的人数 http://blog.lxx1.com/2861?pk_campaign=feed&pk_kwd=%25e6%25a0%2591%25e8%258e%2593%25e6%25b4%25be%25e6%2590%25ad%25e5%25bb%25ba%25e6%258c%2587%25e7%25a4%25ba%25e7%2581%25af%25e8%2587%25aa%25e5%258a%25a8%25e6%2598%25be%25e7%25a4%25ba%25e5%259c%25a8%25e7%25a9%25ba%25e9%2597%25b4%25e7%25ab%2599%25e7%259a%2584%25e4%25ba%25ba%25e6%2595%25b0 http://blog.lxx1.com/2861?pk_campaign=feed&pk_kwd=%25e6%25a0%2591%25e8%258e%2593%25e6%25b4%25be%25e6%2590%25ad%25e5%25bb%25ba%25e6%258c%2587%25e7%25a4%25ba%25e7%2581%25af%25e8%2587%25aa%25e5%258a%25a8%25e6%2598%25be%25e7%25a4%25ba%25e5%259c%25a8%25e7%25a9%25ba%25e9%2597%25b4%25e7%25ab%2599%25e7%259a%2584%25e4%25ba%25ba%25e6%2595%25b0#comments Tue, 04 Jul 2017 08:00:03 +0000 http://blog.lxx1.com/?p=2861 树莓派搭建指示灯自动显示在空间站的人数,首发于科技爱好者博客

本文翻译自:https://www.raspberrypi.org/ 使用Python requests模块访问People in Space API,并创建一个指示灯,以显示当前在空间中的人数。 2015年12月15日,英国欧空局宇航员蒂姆·帕克(Tim Peake)起飞到国际空间站,他将在那里工作六个月。作 ...

树莓派搭建指示灯自动显示在空间站的人数,首发于科技爱好者博客

]]>
树莓派搭建指示灯自动显示在空间站的人数,首发于科技爱好者博客

本文翻译自:https://www.raspberrypi.org/

使用Python requests模块访问People in Space API,并创建一个指示灯,以显示当前在空间中的人数。

2015年12月15日,英国欧空局宇航员蒂姆·帕克(Tim Peake)起飞到国际空间站,他将在那里工作六个月。作为Astro Pi项目的一部分,Tim还将在太空中进行科学研究,他还将使用由两名Raspberry Pis学生学习的Python代码进行实验。通过这个资源,你可以保持蒂姆和他的宇航员在国际空间站上的数量。

浏览太空人物API

API代表应用程序编程接口。一种形式的API是一种Web API,可用于从在线提供的服务中提取数据。一些API对公众开放,免费提供数据; 其他API需要登录才能访问它们,这可以通过应用程序获取,或者可以作为服务提供给客户收费。

通过API提供数据的目的是允许人们访问它以供自己使用或使用它来构建程序。一些API提供业务关键数据集或其他重要数据,例如天气,金融活动,甚至提供访问Twitter流或Flickr的照片等。其他API只是为了好玩,如口袋妖怪API星球大战API冒险时间API。虽然这些API是有趣的,但它们仍然可以用于有趣和有用的方式。您可以在Minecraft中建立一个宠物小精灵游戏,或在冒险时间内建立关于角色的问答游戏!

对于这个项目,您将使用Nathan Bergey免费维护和提供的People in Space API

  1. 首先打开网页浏览器并浏览以下网址:
    http://api.open-notify.org/astros.json
  2. 您应该看到一个白色页面,其中包含一些如下所示的文本:

    您正在查看API提供的数据。这是访问数据的手动方法。

  3. 观察所提供的数据。它应该看起来像这样:
    {
      "message": "success",
      "number": 6,
      "people": [
      {
        "craft": "ISS",
        "name": "Mikhail Kornienko"
      },
      ...
    }

    该数据的格式称为JSON(发音为“Jason”),代表JavaScript Object Notation。虽然这个名字是指JavaScript的编程语言,但它是一种标准的数据交换格式,可以在语言和应用程序之间移植。如果您熟悉Python的dictionary数据结构,您将看到相似之处。在其他语言中,嵌套数组可以以相同的方式使用。

  4. 请注意,API提供了三个数据:messagenumber,和people
    • message 是包含该单词的单个字符串 success
    • number 是整数值 6
    • people 是一群宇航员
  5. people阵列中,有六个对象。每个对象包含两个数据:
    • craft 是宇航员在哪里的航天器
    • name 是宇航员的全名

使用Python的请求模块

现在您将使用requestsPython中的模块来访问API。

  1. 从主菜单中打开Python 3:
  2. 在Python shell中,键入以下行,然后按Enter键
    >>> import requests

    (注意>>>不是键入,而是表示shell输入)

    您正在使用Python shell的REPL(Read-Eval-Print Loop),这意味着每一行都会立即执行,而不是写入一个文件,保存并一次运行所有命令

  3. 现在创建一个包含API的URL作为字符串的变量:
    url = "http://api.open-notify.org/astros.json"
  4. 输入以下内容,向API发出请求:
    r = requests.get(url)
  5. 现在只需键入r并按Enter键 ; 这与输入print(r)文件相同。REPL允许您以这种方式快速检查对象。您现在应该看到以下内容:
    <Response [200]>

    这表示r包含一个Response类型对象,并显示200。这是请求的状态代码,这意味着“成功”。其他状态代码包括404,这意味着“找不到文件”和500– “服务器错误”。

  6. 现在进入help(r)。这显示对象的docstring(文档字符串)Response。你应该看到:
    Help on Response in module requests.models object:
    
    class Response(builtins.object)
     |  The :class:`Response <Response>` object, which contains a
     |  server's response to an HTTP request.
     ...
  7. 观察docstring的部分Data descriptors defined here。您将看到可用属性及其描述的列表,包括:
    • apparent_encoding
    • content
    • is_permanent_redirect
    • is_redirect
    • links
    • ok
    • text

    这些属性本质上是一个对象内可访问的变量。例如,r.ok是包含请求(TrueFalse)的成功状态的变量。

  8. 通过在REPL中输入这些属性来尝试访问这些属性:
    >>> r.ok
    True
    >>> r.is_redirect
    False
    >>> r.text
    '{\n  "message": "success", \n  "number": 6...

    你会看到r.text似乎包含你需要的数据。然而,这被提供为使其难以使用的字符串。

  9. 观察Methods defined heredocstring 的部分,其中包括:
    json(self, **kwargs)
        Returns the json-encoded content of a response, if any.

    这可以让您以JSON格式访问URL请求的内容,这将使其更有用。

    一种方法是属于一个对象的函数。它以与属性相同的方式访问,但被称为像()例如函数r.json()

  10. 输入r.json()。你应该看到:
    {'number': 6, 'message': 'success', 'people': [{'craft': 'ISS', 'name': 'Mikhail Kornienko'}, {'craft': 'ISS', 'name': 'Scott Kelly'}, {'craft': 'ISS', 'name': 'Oleg Kononenko'}, {'craft': 'ISS', 'name': 'Kimiya Yui'}, {'craft': 'ISS', 'name': 'Kjell Lindgren'}, {'craft': 'ISS', 'name': 'Sergey Volkov'}]}
  11. 将其另存为变量:
    j = r.json()
  12. 检查新变量的数据类型 type(j)
    >>> type(j)
    <class 'dict'>

    你会看到这j是一个字典,它是Python中非常有用的数据结构,基本上与JSON格式相同。

  13. 要访问字典中的数据,请按以下名称对其进行索引[]
    >>> j['number']
    6

    而已!

  14. 回顾所使用的命令并将其放在一起,需要以下代码来检索空间中的人数:
    import requests
    
    url = "http://api.open-notify.org/astros.json"
    
    r = requests.get(url)
    j = r.json()
    n = j['number']
    print(n)

添加LED

接下来,您将连接一些LED到Pi的GPIO引脚,并使用它们来代表一个人在空间。

  1. 首先使用公母对跳线将Pi的接地引脚连接到面包板,并添加一个电阻将其连接到地面导轨上:

     

  2. 现在将单个LED连接到您的面包板,将较短的腿(阴极)连接到地面导轨,并将较长的腿(阳极)放置在面包板的中间。然后使用公母对跳线将LED的行连接到Pi上的GPIO引脚2:

  3. 从GPIO Zero库导入LED类开始:
    >>> from gpiozero import LED
  4. LED在引脚2上创建一个对象的实例:
    >>> led = LED(2)
  5. 尝试点亮LED:
    >>> led.on()

    LED现在应该点亮!

  6. 将第二个LED连接到引脚3:

  7. 以相同的方式将其余LED(总共10个)连接到连续的引脚(4,14,15,17,18,22,23,27)上:

  8. 确保您以前使用的针脚2上的LED已关闭:
    >>> led.close()
  9. 创建您使用的引脚号的列表:
    >>> pins = [2, 3, 4, 14, 15, 17, 18, 27, 22, 23]
  10. 使用这些引脚号创建LED列表:
    >>> leds = [LED(pin) for pin in pins]

    这被称为列表理解:在一行中生成列表而不是使用传统的循环。

  11. 检查leds列表:
    >>> leds
    [<gpiozero.LED object on pin=2, is_active=False>,
    <gpiozero.LED object on pin=3, is_active=False>,
    <gpiozero.LED object on pin=4, is_active=False>,
    <gpiozero.LED object on pin=14, is_active=False>,
    ...]

    这将打印列表中每个对象的表示,显示一些有用的信息。

  12. leds通过将它们全部打开来测试列表:
    >>> [led.on() for led in leds]

    这是列表理解的另一个用途:在列表中的每个项目上运行命令

  13. 关闭它们:
    >>> [led.off() for led in leds]

    提示:使用Alt + P(上一个)完成命令历史记录并编辑输入的最后一个命令。

制作指示标

现在,您将使用LED显示当前在空间中的人数。

  1. 现在是把它们一起放在一个文件中的时候了。点击File > New File
  2. 将您的文件保存为 astronauts.py
  3. 首先导入您使用的库:
    from gpiozero import LED
    import requests
  4. 添加LED设置:
    pins = [2, 3, 4, 14, 15, 17, 18, 27, 22, 23]
    leds = [LED(p) for p in pins]
  5. 添加requests代码:
    url = "http://api.open-notify.org/astros.json"
    
    r = requests.get(url)
    j = r.json()
    n = j['number']
  6. 现在,而不仅仅是打印n,您可以使用它来确定应该点亮多少个LED。考虑以下循环:
    for led in leds:
        led.on()

    这允许您依次访问每个LED。但是,我们需要知道什么时候我们应该停止这样做。

  7. 您需要能够比较n每个LED号码(序列中的顺序,而不是GPIO引脚号)的数字。您将需要使用该enumerate功能按顺序为每个LED分配一个数字。enumerate通过在shell中尝试它(而不是文件)来查看它的工作原理:
    >>> list(enumerate(leds))
    [(0, <gpiozero.LED object on pin=2, is_active=False>),
     (1, <gpiozero.LED object on pin=3, is_active=False>),
     (2, <gpiozero.LED object on pin=4, is_active=False>),
    ...]

    您可以看到,它提供了与索引号相关联的LED列表,从0

  8. 由于enumerate返回两个值,索引号和LED对象,您可以循环使用它并通过使用访问这两个值for i, led in enumerate(leds)。将以下循环添加到文件中的代码中:
    for i, led in enumerate(leds):
        if n > i:
            led.on()
        else:
            led.off()
  9. 保存并运行您的代码。假设API返回6,你应该有6个LED点亮!
  10. 您将需要定期检查API的变化。确保您没有对API提出太多请求非常重要。首先通过sleep在其他文件的顶部添加导入:
    from time import sleep
  11. 现在将循环中的代码requestsLED代码进行while循环,使其持续运行并不断更新LED:
    while True:
        r = requests.get(url)
        j = r.json()
        n = j['number']
        for i, led in enumerate(leds):
            if n > i:
                led.on()
            else:
                led.off()
        sleep(60)  # update every minute

    确保最后添加睡眠,所以它在API调用之间等待60秒钟,以便每分钟检查一次结果。

  12. 运行代码,它应该总是显示当前的空间人数。让它运行,它应该在将来更新,因为宇航员交付到和从国际空间站。

尝试用木头或纸板制作自己的指示器:

显示宇航员名字

最后,学习从API调用中获取宇航员名字。

  1. 当你最初检查了JSON对象时,它显示了所有的空间的人的名字以及数字。返回到Python shell并j['people']从字典检查:
    >>> type(j['people'])
    <class 'list'>
    >>> j['people']
    [{'craft': 'ISS', 'name': 'Mikhail Kornienko'}, {'craft': 'ISS', 'name': 'Scott Kelly'}, {'craft': 'ISS', 'name': 'Oleg Kononenko'}, {'craft': 'ISS', 'name': 'Kimiya Yui'}, {'craft': 'ISS', 'name': 'Kjell Lindgren'}, {'craft': 'ISS', 'name': 'Sergey Volkov'}]
  2. 你可以看到这j['people']是一个列表。现在进一步检查清单:
    >>> len(j['people'])
    6
    >>> type(j['people'][0])
    <class 'dict'>
    >>> j['people'][0]
    {'craft': 'ISS', 'name': 'Mikhail Kornienko'}
  3. 您可以看到该列表包含6个元素,并且每个元素是另一个字典。剩下的只是访问字典中的各个元素:
    >>> type(j['people'][0]['craft'])
    <class 'str'>
    >>> j['people'][0]['craft']
    'ISS',
    >>> type(j['people'][0]['name'])
    <class 'str'>
    >>> j['people'][0]['name']
    'Mikhail Kornienko'
    >>> j['people'][1]['name']
    'Scott Kelly'
  4. 尝试打印所有的宇航员名字:
    >>> for astronaut in j['people']:
            print(astronaut['name'])
    
    Mikhail Kornienko
    Scott Kelly
    Oleg Kononenko
    Kimiya Yui
    Kjell Lindgren
    Sergey Volkov
  5. 现在返回你的代码,并在保存后添加一行来保存宇航员列表作为变量n
    n = j['number']
    astronauts = j['people']
  6. 然后在循环开始之前添加一行以关闭所有LED:
    [led.off() for led in leds]
  7. if n > i声明内,之后led.on(),添加两行打印宇航员姓名,然后睡眠1秒,以便在每个光线之间暂停:
    if n > i:
        led.on()
        print(astronauts[i]['name'])
        sleep(1)
  8. 再次运行代码,LED一次一个,同时打印出宇航员的姓名。

接下来是什么?

现在,您已经创建了一个带LED指示灯的People in Space Indicator,尝试扩展您的项目:

  • 使用带有至少9个LED的附加板,而不是单个LED
  • 使用LED或LCD显示屏滚动宇航员的名称(例如Sense HATDisplay-O-Tron HAT
  • 使用PyGame Zero在屏幕上显示宇航员的数量或名称
  • 使用requests另一个API来查找有关每个宇航员的信息

重要的日子

请注意国际空间站航天员计划交付和离职的以下日期:

  • 201512月11日 – Oleg Kononenko,Kimiya Yui和Kjell Lindgren离开
  • 201512月15日 – 蒂姆·皮克,尤里·马伦琴科和蒂莫西·科普拉抵达
  • 20163月18日 – 阿列克谢Ovchinin,Oleg Skripochka和Jeffrey N. Williams到达
  • 20165月30日 – Anatoli Ivanishin,Takuy​​a Onishi和Kathleen Rubins抵达
  • 20169月30日 – Sergey N. Ryzhikov,Andrei Borisenko和Robert S. Kimbrough到达
  • 201611月30日 – Oleg Novitskiy,Thomas Pesquet和Peggy Whitson抵达

树莓派搭建指示灯自动显示在空间站的人数,首发于科技爱好者博客

]]>
http://blog.lxx1.com/2861?pk_campaign=feed&pk_kwd=%25e6%25a0%2591%25e8%258e%2593%25e6%25b4%25be%25e6%2590%25ad%25e5%25bb%25ba%25e6%258c%2587%25e7%25a4%25ba%25e7%2581%25af%25e8%2587%25aa%25e5%258a%25a8%25e6%2598%25be%25e7%25a4%25ba%25e5%259c%25a8%25e7%25a9%25ba%25e9%2597%25b4%25e7%25ab%2599%25e7%259a%2584%25e4%25ba%25ba%25e6%2595%25b0/feed 2
坚持写作的意义是什么? http://blog.lxx1.com/2852?pk_campaign=feed&pk_kwd=%25e5%259d%259a%25e6%258c%2581%25e5%2586%2599%25e4%25bd%259c%25e7%259a%2584%25e6%2584%258f%25e4%25b9%2589%25e6%2598%25af%25e4%25bb%2580%25e4%25b9%2588%25ef%25bc%259f http://blog.lxx1.com/2852?pk_campaign=feed&pk_kwd=%25e5%259d%259a%25e6%258c%2581%25e5%2586%2599%25e4%25bd%259c%25e7%259a%2584%25e6%2584%258f%25e4%25b9%2589%25e6%2598%25af%25e4%25bb%2580%25e4%25b9%2588%25ef%25bc%259f#comments Mon, 03 Jul 2017 06:37:37 +0000 http://blog.lxx1.com/?p=2852 坚持写作的意义是什么?,首发于科技爱好者博客

我从2014年开始写博客,至今已经坚持写了近3年。博客的热潮已经过去,好多独立博客已经不再更新或者关闭,博客网站也纷纷走向落幕,看到这种景象,不仅感叹不已,事物总是在不断的发展中,新生的事物不断冒出来,旧事物在新事物的取代下不断消融,渐渐走 ...

坚持写作的意义是什么?,首发于科技爱好者博客

]]>
坚持写作的意义是什么?,首发于科技爱好者博客

我从2014年开始写博客,至今已经坚持写了近3年。博客的热潮已经过去,好多独立博客已经不再更新或者关闭,博客网站也纷纷走向落幕,看到这种景象,不仅感叹不已,事物总是在不断的发展中,新生的事物不断冒出来,旧事物在新事物的取代下不断消融,渐渐走出人们的视野。作为坚持写博客3年的博主,也来谈谈为什么一直在坚持,为什么要一直坚持下去。

一、记录学习过程,分享我的知识

博客上写的最多的文章是关于技术方面的,每当我在编程、硬件开发设计中遇到问题,我都会尝试自己解决,采取的主要手段是在互联网上搜索,查找解决这个问题的办法。解决这个问题经常要花费大量的时间,需要综合好几篇文章,才能找到正确的解决方法。遇到的问题解决了,如果不写出来并分享,下次我遇到时,还得花费时间和精力查找,其他人可能也需要同样的时间去解决;如果我将验证过的解决方法通过博客分享出来,其他人遇到问题,只需要很少的时间就可以解决了。

不比其他论坛等,博客文章的字句都是经过斟酌写出来的,可以保证文章的质量。一篇博客文章为了让别人也能详细的了解,需要我深入分析问题,最后解决问题,在写出来的同时,也会总结经验,再提高自己的同时也方便了他人,可谓一举两得。

二、培养主动学习的兴趣

要坚持写博客,就要不断的学习,同时为了“有得”可写,就要不断的接触新技术、新理念。博客会驱动我接触新技术,再看别人博客的同时,也会让我找到下一步要学习的方向。为了将问题讲清楚,就需要了解各个点,然后才能动笔写作,这也是驱动我学习的一个方面。再写博客的同时,看到自己文章帮助了那么多的人,会提高我学习的热情,从而驱动我进步。

三、带动学习建站相关的知识

微信公众号、知乎专栏以及间书等等写作平台的成立,给写作的人带来了很大的方便。但是博客与这些写作平台最大的不同在于,博客的一切都需要自己动手。例如,博客的域名、网站服务器选择、博客环境搭建、https证书部署、网站性能提高、阅读体验的优化、防止黑客攻击等等,这些都需要自己动手去搞。在自己动手的同时,亲身感受了解了其中的知识,掌握了最基层,也是最实用的技术。

而且,看着自己一步步搭建起来的博客,内心也是充满了成就感。在维护优化中,凝聚了我的精力,看着博客越来愈高的访问量、博客真真切切对他们的帮助以及他们对博客的感谢,感到自己的付出的精力和时间没有白费,都用在了实事上。

四、锻炼思考写作的能力

遇到问题可以通过搜索、思考来解决,但是能能解决不一定代表理解了,通过将解决问题的思路、方法通过博客写出来,可以加深自己的理解。在做高数题时,可以解出正确的答案,但是不一定能给别人讲解明白,写博客就是为了解决这个问题,坚持写,就可以锻炼思考的能力。况且,也能锻炼写作的能力,这样遇到文档编写的任务,就能够可以出色的完成任务。


坚持写作的意义是什么?,首发于科技爱好者博客

]]>
http://blog.lxx1.com/2852?pk_campaign=feed&pk_kwd=%25e5%259d%259a%25e6%258c%2581%25e5%2586%2599%25e4%25bd%259c%25e7%259a%2584%25e6%2584%258f%25e4%25b9%2589%25e6%2598%25af%25e4%25bb%2580%25e4%25b9%2588%25ef%25bc%259f/feed 3
树莓派使用三极管实现温度控制风扇 http://blog.lxx1.com/2842?pk_campaign=feed&pk_kwd=%25e6%25a0%2591%25e8%258e%2593%25e6%25b4%25be%25e4%25bd%25bf%25e7%2594%25a8%25e4%25b8%2589%25e6%259e%2581%25e7%25ae%25a1%25e5%25ae%259e%25e7%258e%25b0%25e6%25b8%25a9%25e5%25ba%25a6%25e6%258e%25a7%25e5%2588%25b6%25e9%25a3%258e%25e6%2589%2587 http://blog.lxx1.com/2842?pk_campaign=feed&pk_kwd=%25e6%25a0%2591%25e8%258e%2593%25e6%25b4%25be%25e4%25bd%25bf%25e7%2594%25a8%25e4%25b8%2589%25e6%259e%2581%25e7%25ae%25a1%25e5%25ae%259e%25e7%258e%25b0%25e6%25b8%25a9%25e5%25ba%25a6%25e6%258e%25a7%25e5%2588%25b6%25e9%25a3%258e%25e6%2589%2587#comments Sat, 01 Jul 2017 15:17:57 +0000 http://blog.lxx1.com/?p=2842 树莓派使用三极管实现温度控制风扇,首发于科技爱好者博客

树莓派3使用的处理器芯片是博通的BCM2837,是一个1.2GHz 64位的四核ARMv8 处理器,在平时使用树莓派时CPU温度较高,这个问题在夏天使用时更加严重。虽然安装了散热片,温度也依然在50度左右。为了提高树莓派散热效果,我加装了一个强力散热风扇,效果非常 ...

树莓派使用三极管实现温度控制风扇,首发于科技爱好者博客

]]>
树莓派使用三极管实现温度控制风扇,首发于科技爱好者博客

树莓派3使用的处理器芯片是博通的BCM2837,是一个1.2GHz 64位的四核ARMv8 处理器,在平时使用树莓派时CPU温度较高,这个问题在夏天使用时更加严重。虽然安装了散热片,温度也依然在50度左右。为了提高树莓派散热效果,我加装了一个强力散热风扇,效果非常明显,但是也出现了一个问题,就是只要通电,散热风扇就一直转。为解决这个问题,使用了一个三极管来控制树莓派散热风扇。当树莓派CPU温度超过设定的值时,就开启风扇进行散热;当温度降到一定值时,就关闭风扇,既节省了电能,也减少风扇运转的噪音。

原理介绍

通过将树莓派的一个GPIO连接到三极管的基极,这样就可以通过这个GPIO控制风扇的开关了,再通过python脚本,检测树莓派CPU温度,当温度过高时开启风扇,过低就关闭风扇。

连接原理图

三极管的三个管脚分别为发射极、基极和集电极,我使用的时D8550,其封装图为:

三极管D8550和树莓派的连接如下图。

原理图如下图。

温度控制风扇python脚本

树莓派的15号引脚连接到了三极管的基极(编号参照:树莓派GPIO编号),当温度过高时,GPIO引脚输出低电平,可以开启风扇。python程序为:

#!/usr/bin/python2
#coding:utf8
 
#自动风扇控制程序,使用wiringPi的gpio命令来操作GPIO

import commands,time

#控制风扇的GPIO
FAN_GPIO = 15

commands.getoutput('sudo gpio mode '+str(FAN_GPIO)+' OUTPUT')

while True:
     # 获取CPU温度
    tmpFile = open( '/sys/class/thermal/thermal_zone0/temp' )
    cpu_temp_raw = tmpFile.read()
    tmpFile.close()
    cpu_temp = round(float(cpu_temp_raw)/1000, 1)
    print cpu_temp
 
    #如果温度大于48`C,就启动风扇
    if cpu_temp >= 48.0 :
        commands.getoutput('sudo gpio write '+str(FAN_GPIO)+' 0')
    #如果温度小于40`C,就关闭风扇
    if cpu_temp <= 40.0 :
        commands.getoutput('sudo gpio write '+str(FAN_GPIO)+' 1')
    
    time.sleep(10)


保存后,运行程序,当温度高于48度就开启风扇降温,温度降到40度以下时关闭风扇,这样可以防止风扇在临界点往复。

效果图

完成后的效果图如下。


树莓派使用三极管实现温度控制风扇,首发于科技爱好者博客

]]>
http://blog.lxx1.com/2842?pk_campaign=feed&pk_kwd=%25e6%25a0%2591%25e8%258e%2593%25e6%25b4%25be%25e4%25bd%25bf%25e7%2594%25a8%25e4%25b8%2589%25e6%259e%2581%25e7%25ae%25a1%25e5%25ae%259e%25e7%258e%25b0%25e6%25b8%25a9%25e5%25ba%25a6%25e6%258e%25a7%25e5%2588%25b6%25e9%25a3%258e%25e6%2589%2587/feed 1
安装python多版本导致yum命令错误(No module named yum)的解决办法 http://blog.lxx1.com/2830?pk_campaign=feed&pk_kwd=%25e5%25ae%2589%25e8%25a3%2585python%25e5%25a4%259a%25e7%2589%2588%25e6%259c%25ac%25e5%25af%25bc%25e8%2587%25b4yum%25e5%2591%25bd%25e4%25bb%25a4%25e9%2594%2599%25e8%25af%25af%25ef%25bc%2588no-module-named-yum%25ef%25bc%2589%25e7%259a%2584%25e8%25a7%25a3%25e5%2586%25b3%25e5%258a%259e%25e6%25b3%2595 http://blog.lxx1.com/2830?pk_campaign=feed&pk_kwd=%25e5%25ae%2589%25e8%25a3%2585python%25e5%25a4%259a%25e7%2589%2588%25e6%259c%25ac%25e5%25af%25bc%25e8%2587%25b4yum%25e5%2591%25bd%25e4%25bb%25a4%25e9%2594%2599%25e8%25af%25af%25ef%25bc%2588no-module-named-yum%25ef%25bc%2589%25e7%259a%2584%25e8%25a7%25a3%25e5%2586%25b3%25e5%258a%259e%25e6%25b3%2595#comments Tue, 27 Jun 2017 08:29:49 +0000 http://blog.lxx1.com/?p=2830 安装python多版本导致yum命令错误(No module named yum)的解决办法,首发于科技爱好者博客

最近在Centos上安装了Python2.7,这样linux系统上存在多个python版本,结果yum命令出现错误,提示为:“No module named yum”,通过修改yum命令文件,替换为python的正确路径解决了yum 无法使用的问题。

安装python多版本导致yum命令错误(No module named yum)的解决办法,首发于科技爱好者博客

]]>
安装python多版本导致yum命令错误(No module named yum)的解决办法,首发于科技爱好者博客

最近在Centos上安装了Python2.7,这样linux系统上存在多个python版本,结果yum命令出现错误,提示为:“No module named yum”,通过修改yum命令文件,替换为python的正确路径解决了yum 无法使用的问题。

yum命令具体的错误信息如下:

[root@10-8-69-125 ~]# yum
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

   No module named yum

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
2.7.3 (default, May 29 2017, 16:44:21) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)]

If you cannot solve this problem yourself, please go to 
the yum faq at:
  http://yum.baseurl.org/wiki/Faq
  

这是因为 yum 使用python编写,如果在Linux中安装多个python版本,则会出现“No module named yum”的错误,解决方法是更换Yum使用的python版本路径。

解决“No module named yum

1、查找python 的当前路径

使用whereis python 命令查找,可以看到目前centos系统中安装了两个python版本,分别为python2.6和python2.7。

[root@10-8-69-125 ~]# whereis python
python: /usr/bin/python /usr/bin/python2.6 /usr/lib/python2.6 /usr/lib64/python2.6 /usr/local/bin/python2.7 /usr/local/bin/python /usr/local/bin/python2.7-config /usr/local/lib/python2.7 /usr/include/python2.6 /usr/share/man/man1/python.1.gz

2、修改/usr/bin/yum文件

打开/usr/bin/yum文件,替换为python的正确路径,即可解决问题。将文件中的#!/usr/bin/python修改为

 #!/usr/bin/python2.6

然后保存即可。

修改后的/usr/bin/yum文件内容如下图:

这样yum无法使用的问题解决了,再次使用yum ,就可以正常使用了:


[root@10-8-69-125 ~]# yum 
已加载插件:fastestmirror
你需要给出命令
Usage: yum [options] COMMAND

List of Commands:

check          Check for problems in the rpmdb
check-update   检查是否有软件包更新
clean          删除缓存的数据
deplist        列出软件包的依赖关系
distribution-synchronization Synchronize installed packages to the latest available versions
downgrade      downgrade a package
erase          从系统中移除一个或多个软件包
groupinfo      显示组的详细信息
groupinstall   向系统中安装一组软件包
grouplist      列出可安装的组
groupremove    从系统中移除一组软件包
help           显示用法信息
history        Display, or use, the transaction history
info           显示关于软件包或组的详细信息
install        向系统中安装一个或多个软件包
list           列出一个或一组软件包
load-transaction load a saved transaction from filename
makecache      创建元数据缓存
provides       查找提供指定内容的软件包
reinstall      覆盖安装一个包
repolist       显示已配置的仓库
resolvedep     判断哪个包提供了指定的依赖
search         在软件包详细信息中搜索指定字符串
shell          运行交互式的 yum 外壳
update         更新系统中的一个或多个软件包
upgrade        更新软件包同时考虑软件包取代关系
version        Display a version for the machine and/or available repos.


安装python多版本导致yum命令错误(No module named yum)的解决办法,首发于科技爱好者博客

]]>
http://blog.lxx1.com/2830?pk_campaign=feed&pk_kwd=%25e5%25ae%2589%25e8%25a3%2585python%25e5%25a4%259a%25e7%2589%2588%25e6%259c%25ac%25e5%25af%25bc%25e8%2587%25b4yum%25e5%2591%25bd%25e4%25bb%25a4%25e9%2594%2599%25e8%25af%25af%25ef%25bc%2588no-module-named-yum%25ef%25bc%2589%25e7%259a%2584%25e8%25a7%25a3%25e5%2586%25b3%25e5%258a%259e%25e6%25b3%2595/feed 2
Alias 配置别名并且设置永久生效 http://blog.lxx1.com/2816?pk_campaign=feed&pk_kwd=alias-%25e9%2585%258d%25e7%25bd%25ae%25e5%2588%25ab%25e5%2590%258d%25e5%25b9%25b6%25e4%25b8%2594%25e8%25ae%25be%25e7%25bd%25ae%25e6%25b0%25b8%25e4%25b9%2585%25e7%2594%259f%25e6%2595%2588 http://blog.lxx1.com/2816?pk_campaign=feed&pk_kwd=alias-%25e9%2585%258d%25e7%25bd%25ae%25e5%2588%25ab%25e5%2590%258d%25e5%25b9%25b6%25e4%25b8%2594%25e8%25ae%25be%25e7%25bd%25ae%25e6%25b0%25b8%25e4%25b9%2585%25e7%2594%259f%25e6%2595%2588#respond Sat, 24 Jun 2017 08:02:02 +0000 http://blog.lxx1.com/?p=2816 Alias 配置别名并且设置永久生效,首发于科技爱好者博客

bash中有些命令的使用频率非常高,我们可以将这些命令配置别名,从而提高Linux下的使用效率。这篇文章讲解的alias命令用来设置指令的别名,将一些较长的命令进行简化,同时将其设置为永久生效。

Alias 配置别名并且设置永久生效,首发于科技爱好者博客

]]>
Alias 配置别名并且设置永久生效,首发于科技爱好者博客

bash中有些命令的使用频率非常高,我们可以将这些命令配置别名,从而提高Linux下的使用效率。这篇文章讲解的alias命令用来设置指令的别名,将一些较长的命令进行简化,同时将其设置为永久生效。


alias命令语法

alias (选项) (参数)

alias 的基本使用方法为: alias 新的命令='原命令 -选项/参数'

例如:

alias l=‘ls -lsh' #将重新定义ls命令,现在只需输入l ,就相当于输入了ls -lsh
alias #列出当前系统中所有已经定义的命令别名
unalias l #要删除一个别名l

 

配置alias永久生效

直接使用alias命令设置的别名只在当前登录有效,如果退出登录以及重启,别名会失效。那么怎样才能让alias别名永久生效呐。只要编辑当前目录下的.bashrc文件,加入alias别名,就可以永久生效。

[root@ubuntu ~]# nano .bashrc

加入:

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias l='ls -lh --color=auto'
alias ..='cd ..'
alias ...='cd ../..'

然后保存退出,重新载入.bashrc文件,即可让我们的环境生效

[root@ubuntu ~]# source .bashrc

Alias 配置别名并且设置永久生效,首发于科技爱好者博客

]]>
http://blog.lxx1.com/2816?pk_campaign=feed&pk_kwd=alias-%25e9%2585%258d%25e7%25bd%25ae%25e5%2588%25ab%25e5%2590%258d%25e5%25b9%25b6%25e4%25b8%2594%25e8%25ae%25be%25e7%25bd%25ae%25e6%25b0%25b8%25e4%25b9%2585%25e7%2594%259f%25e6%2595%2588/feed 0
Linux 下让进程在后台可靠运行的几种方法(nohup/setsid/&) http://blog.lxx1.com/2808?pk_campaign=feed&pk_kwd=linux-%25e4%25b8%258b%25e8%25ae%25a9%25e8%25bf%259b%25e7%25a8%258b%25e5%259c%25a8%25e5%2590%258e%25e5%258f%25b0%25e5%258f%25af%25e9%259d%25a0%25e8%25bf%2590%25e8%25a1%258c%25e7%259a%2584%25e5%2587%25a0%25e7%25a7%258d%25e6%2596%25b9%25e6%25b3%2595%25ef%25bc%2588nohupsetsid%25ef%25bc%2589 http://blog.lxx1.com/2808?pk_campaign=feed&pk_kwd=linux-%25e4%25b8%258b%25e8%25ae%25a9%25e8%25bf%259b%25e7%25a8%258b%25e5%259c%25a8%25e5%2590%258e%25e5%258f%25b0%25e5%258f%25af%25e9%259d%25a0%25e8%25bf%2590%25e8%25a1%258c%25e7%259a%2584%25e5%2587%25a0%25e7%25a7%258d%25e6%2596%25b9%25e6%25b3%2595%25ef%25bc%2588nohupsetsid%25ef%25bc%2589#respond Sun, 18 Jun 2017 03:20:35 +0000 http://blog.lxx1.com/?p=2808 Linux 下让进程在后台可靠运行的几种方法(nohup/setsid/&),首发于科技爱好者博客

我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口以及网络断开连接的干扰呢?下面举了一些例子, 可以针对不同的场景选 ...

Linux 下让进程在后台可靠运行的几种方法(nohup/setsid/&),首发于科技爱好者博客

]]>
Linux 下让进程在后台可靠运行的几种方法(nohup/setsid/&),首发于科技爱好者博客

我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口以及网络断开连接的干扰呢?下面举了一些例子, 可以针对不同的场景选择不同的方式来处理这个问题。

场景:

如果只是临时有一个命令需要长时间运行,什么方法能最简便的保证它在后台稳定运行呢?

hangup 名称的来由

在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hang up)电话。 同理,当 modem 断开连接时,就会给终端发送 hangup 信号来通知其关闭所有子进程。

解决方法:

我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

1. nohup

nohup 无疑是我们首先想到的办法。顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号。nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上“&”来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。

nohup 示例
[root@blog_lxx1_com ~]# nohup scp ./www_gitos_net root@23.91.45.94:/root/ 
nohup: ignoring input and appending output to ‘nohup.out’
[root@blog_lxx1_com ~]# ps -ef | grep scp
root 14758 1 0 Jun05 ? 00:00:01 scp www_lxx1_com.tar.gz root@23.91.45.94:/data/
[root@blog_lxx1_com ~]#

2。setsid

nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点。让我们先来看一下 setsid 的帮助信息:

SETSID(8)                 Linux Programmer’s Manual                 SETSID(8)

NAME
       setsid - run a program in a new session

SYNOPSIS
       setsid program [ arg ... ]

DESCRIPTION
       setsid runs a program in a new session.

可见 setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可

3。&

这里还有一个关于 subshell 的小技巧。我们知道,将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中,从而扩展出很多有趣的功能,我们现在要讨论的就是其中之一。

当我们将”&”也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。让我们来看看为什么这样就能躲过 HUP 信号的影响吧。

subshell 示例
[root@pvcent107 ~]# (ping www.ibm.com &)
[root@pvcent107 ~]# ps -ef |grep www.ibm.com
root     16270     1  0 14:13 pts/4    00:00:00 ping www.ibm.com
root     16278 15362  0 14:13 pts/4    00:00:00 grep www.ibm.com
[root@pvcent107 ~]#

从上例中可以看出,新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了。

Linux 下让进程在后台可靠运行的几种方法(nohup/setsid/&),首发于科技爱好者博客

]]>
http://blog.lxx1.com/2808?pk_campaign=feed&pk_kwd=linux-%25e4%25b8%258b%25e8%25ae%25a9%25e8%25bf%259b%25e7%25a8%258b%25e5%259c%25a8%25e5%2590%258e%25e5%258f%25b0%25e5%258f%25af%25e9%259d%25a0%25e8%25bf%2590%25e8%25a1%258c%25e7%259a%2584%25e5%2587%25a0%25e7%25a7%258d%25e6%2596%25b9%25e6%25b3%2595%25ef%25bc%2588nohupsetsid%25ef%25bc%2589/feed 0
Arduino uno 驱动Nokia5110显示屏 http://blog.lxx1.com/2784?pk_campaign=feed&pk_kwd=arduino-uno-%25e9%25a9%25b1%25e5%258a%25a8nokia5110%25e6%2598%25be%25e7%25a4%25ba%25e5%25b1%258f http://blog.lxx1.com/2784?pk_campaign=feed&pk_kwd=arduino-uno-%25e9%25a9%25b1%25e5%258a%25a8nokia5110%25e6%2598%25be%25e7%25a4%25ba%25e5%25b1%258f#respond Sat, 17 Jun 2017 12:14:26 +0000 http://blog.lxx1.com/?p=2784 Arduino uno 驱动Nokia5110显示屏,首发于科技爱好者博客

在树莓派使用Nokia5110显示屏显示系统信息中,学习了使用树莓派驱动Nokia5110显示屏。本篇文章教大家用Arduino驱动Nokia5110显示屏。

Arduino uno 驱动Nokia5110显示屏,首发于科技爱好者博客

]]>
Arduino uno 驱动Nokia5110显示屏,首发于科技爱好者博客

树莓派使用Nokia5110显示屏显示系统信息中,学习了使用树莓派驱动Nokia5110显示屏。本篇文章教大家用Arduino驱动Nokia5110显示屏。

一、硬件连接

#define PIN_SCE                 7
#define PIN_RESET             6
#define PIN_DC             5
#define PIN_SDIN            4
#define PIN_SCLK                3
VCC         3.3V
Gng            地
BL            5V

在BL和5V之间连接不用加入其他的电阻和电容,经过我的测试,直接连接就可以了。

二、下载Nokia5110驱动库

1、下载Arduino Nokia5110 驱动库.(科技爱好者博客下载:pcd8544-master

2、打开Arduino IDE

3、“项目” – “加载库” -” 添加一个.zip库”。

三、运行程序

选择File > Examples > PCD8544 > HelloWorld打开Nokia 5110屏幕测试程序。编译下载即可看到显示的信息。

四、Hello Word程序代码

 
/*
 * PCD8544 - Interface with Philips PCD8544 (or compatible) LCDs.
 *
 * Copyright (c) 2010 Carlos Rodrigues <cefrodrigues@gmail.com>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

/*
 * To use this sketch, connect the eight pins from your LCD like thus:
 *
 * Pin 1 -> +3.3V (rightmost, when facing the display head-on)
 * Pin 2 -> Arduino digital pin 3
 * Pin 3 -> Arduino digital pin 4
 * Pin 4 -> Arduino digital pin 5
 * Pin 5 -> Arduino digital pin 7
 * Pin 6 -> Ground
 * Pin 7 -> 10uF capacitor -> Ground
 * Pin 8 -> Arduino digital pin 6
 *
 * Since these LCDs are +3.3V devices, you have to add extra components to
 * connect it to the digital pins of the Arduino (not necessary if you are
 * using a 3.3V variant of the Arduino, such as Sparkfun's Arduino Pro).
 */


#include 

// A custom glyph (a smiley)...
static const byte glyph[] = { B00010000, B00110100, B00110000, B00110100, B00010000 };


static PCD8544 lcd;


void setup() {
  // PCD8544-compatible displays may have a different resolution...
  lcd.begin(84, 48);

  // Add the smiley to position "0" of the ASCII table...
  lcd.createChar(0, glyph);
}


void loop() {
  // Just to show the program is alive...
  static int counter = 0;

  // Write a piece of text on the first line...
  lcd.setCursor(0, 0);
  lcd.print("Hello, World!");

  lcd.setCursor(0, 1);
  lcd.print("Blog.lxx1.com");
  
  // Write the counter on the second line...
  lcd.setCursor(0, 3            );
  lcd.print(counter, DEC);
  lcd.write(' ');
  lcd.write(0);  // write the smiley

  
  // Use a potentiometer to set the LCD contrast...
  // short level = map(analogRead(A0), 0, 1023, 0, 127);
  // lcd.setContrast(level);

  delay(100);
  counter+=1;
}


/* EOF - HelloWorld.ino */

Arduino uno 驱动Nokia5110显示屏,首发于科技爱好者博客

]]>
http://blog.lxx1.com/2784?pk_campaign=feed&pk_kwd=arduino-uno-%25e9%25a9%25b1%25e5%258a%25a8nokia5110%25e6%2598%25be%25e7%25a4%25ba%25e5%25b1%258f/feed 0
WordPress 博客总字数统计 http://blog.lxx1.com/2760?pk_campaign=feed&pk_kwd=wordpress-%25e5%258d%259a%25e5%25ae%25a2%25e6%2580%25bb%25e5%25ad%2597%25e6%2595%25b0%25e7%25bb%259f%25e8%25ae%25a1 http://blog.lxx1.com/2760?pk_campaign=feed&pk_kwd=wordpress-%25e5%258d%259a%25e5%25ae%25a2%25e6%2580%25bb%25e5%25ad%2597%25e6%2595%25b0%25e7%25bb%259f%25e8%25ae%25a1#respond Sat, 17 Jun 2017 01:40:01 +0000 http://blog.lxx1.com/?p=2760 WordPress 博客总字数统计,首发于科技爱好者博客

This post has . 博客是一个记录自己成长的空间,科技爱好者博客已经坚持写了快3年,写了220篇文章。Wrodpress博客在编写文章的时候,可以通过编辑框下右侧看到字数统计,但只能看到这一篇文章的,我想统计下Wrodpress博客从开博到现在发表的所有文章 ...

WordPress 博客总字数统计,首发于科技爱好者博客

]]>
WordPress 博客总字数统计,首发于科技爱好者博客

This post has 521 Words .

博客是一个记录自己成长的空间,科技爱好者博客已经坚持写了快3年,写了220篇文章。Wrodpress博客在编写文章的时候,可以通过编辑框下右侧看到字数统计,但只能看到这一篇文章的,我想统计下Wrodpress博客从开博到现在发表的所有文章以及页面的字数总计,通过搜索发现网上只有解决一篇文章的字数,而没有整个博客的字数统计。后来终于发现一款Wrodpress博客插件,可以统计Wrodpress博客整站的字数统计,这个插件就是WP Word Count

下面是WP Word Count 插件介绍以及使用。

功能

用于统计博客文章、页面和自定义文章类型的字数统计信息。

特色

1、所有内容的字数总和和单篇文章计数

快速查看你创建了多少篇文章以及博客的总字数。可以将内容按照字数从最大值到最小值进行排序。

2、每月统计及作者字数统计

查看每个月的文字总数,按文章、页面和自定义文章类型细分。博客站点上的每个作者都会进行统计发表的总字数。

3、简单的下载和设置

方便的进行安装,不需要设置就可以开始对博客的字数进行统计。

显示文章的字数统计

WP Word Count 插件还可以方便的显示本篇文章的字数统计,要显示也很简单,只需要添加“ [/wpwordcount/] ”段代码就可以显示这篇文章的字数(去掉两个/),你可以将这个短代码加入到文章中去,从而让读者知道本篇文章的字数。

例如,文章开头的字数统计就是这么添加的:

This post has [/wpwordcount/] .#去掉两个/

WordPress 博客总字数统计,首发于科技爱好者博客

]]>
http://blog.lxx1.com/2760?pk_campaign=feed&pk_kwd=wordpress-%25e5%258d%259a%25e5%25ae%25a2%25e6%2580%25bb%25e5%25ad%2597%25e6%2595%25b0%25e7%25bb%259f%25e8%25ae%25a1/feed 0