📌 👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(September 04 第21期 )

朋友们好,CN区今日热帖附点评又来了。

说明:

  • 只列中文贴或者翻译良好的中英文帖子,纯英文或者机翻的就不在这里列了
  • 只列原创作品,转载的就不列了
  • 鉴于个人精力和能力有限,选贴及点评难免片面,敬请谅解
  • 往期内容只保留最近三期,感兴趣的可以查看我个人博客 @oflyhigh

hota939d.jpg

📌 广告时间

有玩开源硬件、IOT之类的朋友嘛,一起来玩啊:)

今日热帖附点评


flog_small491d1.png
SteemitPhotoChallenge Round 7: Introducing Helix Bridge - 3 entries in 1 post - 螺旋桥 by @ace108)
作者: @ace108
点评: 新加坡的螺旋桥

flog_small491d1.png
Real-Time Update of RobinHood Whale Project 罗宾鲸火贴实时更新 04-09
作者: @laonie
点评: 好人好事哦

flog_small491d1.png
A Sunday $5 SBD giveaway if you can recognize this nice cafe!! 週日咖啡廳猜謎再來一次!
作者: @deanliu
点评: 你们城里人真会玩:)话说我在另外一个人的帖子里猜三维立体画,为啥作者不理我了呢。我的钱呢😂

flog_small491d1.png
The world wonders - spectacular qiantang tide / 世界奇观,浙江杭州钱塘江大潮
作者:@myfirst
点评: 世界三大涌潮之一的钱塘江大潮,值得一观,注意安全。

flog_small491d1.png
The opened cage drawing, 打開門的鳥籠, 열린 새장
作者: @yangyang
点评: 为什么不能隨意地在任何時候離開走向世界,因为有闲的没钱,有钱的没时间,既没钱又没时间的在写点评贴呢。

flog_small491d1.png
传销脱险惊魂记 19
作者: @rivalhw
点评: 小说哦

flog_small491d1.png
惟贤惟德,能服于人
作者: @rivalhw
点评: 虽然我这么说有点不合时宜,但是现在是惟权惟钱,能服于人吧,好吧,这样不够正能量,我错了:)

flog_small491d1.png
Two fishing madman did 4 days and 4 nights / 两个钓鱼疯子干了4天4夜
作者: @fishingvideos
点评: 有各种各样的发烧友,音响的、摄影的、旅游的,作者这算是专业的垂钓发烧友了吧:)

flog_small491d1.png
I’ve Been Writing Too Much, Not Reading Enough
作者: @thornybastard
点评:尽管是纯英文贴,但是这个标题吸引了我。

flog_small491d1.png
这个 程序员+ BYD 车主 的智商要充值啊
作者: @xiaohui
点评: 还好不是伟大的PHP程序员。

flog_small491d1.png
How to make a delicious Glutinous Rice Red Jujube(Too soft hearted) / 怎样制做糯米红枣(心太软)
作者: @elfkitchen
点评: 看起来就很好吃哦

flog_small491d1.png
Snipe and Geoduck An old story in China / 鹤蚌相争,渔翁得利
作者: @myfirst
点评: 大西瓜自比渔翁?中国还有个寓言“螳螂捕蝉黄雀在后”哦。还是老老实实的吃点仙鹤肉吧。


往期内容

👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(September 03第20期 )
👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(September 02第19期 )
👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(September 01第18期 )


This page is synchronized from the post: 📌 👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(September 04 第21期 )

[Translate/翻译]A quick introduction to BLE (BLE简介)

It’s my first time to play with BLE when I begin to study Arduino/Genuion 101.
I am still confused about what’s BLE and how it works.

接触Arduino/Genuion 101, 也是我第一次接触BLE
做完官网上的所有可做的例子后,还是有些云山雾罩的

Eventually, I found a useful article about it.
https://www.arduino.cc/en/Reference/CurieBLE

幸好一篇文章及时的解答了我的各种疑惑
https://www.arduino.cc/en/Reference/CurieBLE

I Translated it into Chinese, and shared it with you.

好东西不敢独享,英语渣渣费了九牛二虎之力翻译了这篇文章。
翻译之后,觉得虽然自己大致理解文中的内容,但是对于一些术语如何翻译,还是无法叫准。
鼓足勇气贴出来,欢迎各位专家批评指正。


A quick introduction to BLE (BLE简介)

Bluetooth 4.0 includes both traditional Bluetooth, now labeled “Bluetooth Classic”, and the new Bluetooth Low Energy (Bluetooth LE, or BLE). BLE is optimized for low power use at low data rates, and was designed to operate from simple lithium coin cell batteries.

蓝牙4.0包含传统的蓝牙(现在叫做”Bluetooth Classic”)以及新的蓝牙低功耗(Bluetooth LE, or BLE). BLE针对低功耗优化,使用。。。

Unlike standard bluetooth communication basically based on an asynchronous serial connection (UART) a Bluetooth LE radio acts like a community bulletin board. The computers that connect to it are like community members that read the bulletin board. Each radio acts as either the bulletin board or the reader. If your radio is a bulletin board (called a peripheral device in Bluetooth LE parlance) it posts data for all radios in the community to read. If your radio is a reader (called a central device in Blueooth LE terms) it reads from any of the bulletin boards (peripheral devices) that have information about which it cares. You can also think of peripheral devices as the servers in a client-server transaction, because they contain the information that reader radios ask for. Similarly, central devices are the clients of the Bluetooth LE world because they read information available from the peripherals.

不像标准蓝牙通信主要基于异步串行连接 (UART) ,BLE radio 像社区公告板那样工作。连接其上的计算机设备像社区成员阅读公告板。每一个 无线设备或作为公告板或作为读者。如果你的无线设备作为公告板(按Bluetooth LE的说法叫做外围设备),那么它张贴数据供社区内其它无线设备阅读。如果你的无线设备作为一名读者(按Blueooth LE 的术语叫做中心装置),那么它从公告板(外围设备)读取内容并获取它关心的信息。你可以认为外围设备好比客户端-服务器传输(client-server transaction)中的服务器,因为它包含读者设备需要的信息。同样,在Bluetooth LE的世界,中心装置就是客户端,因为它们从外围设备那读取可用的信息。

Think of a Bluetooth LE peripheral device as a bulletin board and central devices as viewers of the board. Central devices view the services, get the data, then move on. Each transaction is quick (a few milliseconds), so multiple central devices can get data from one peripheral.

想象Bluetooth LE 外围设备作为公告板,中心装置作为公告板的浏览者。中心装置查看服务,获取数据,然后离开。每一次传输都很快(几毫秒),所以多个中心装置可以从一个外围设备获取数据。

The information presented by a peripheral is structured as services, each of which is subdivided into characteristics. You can think of services as the notices on a bulletin board, and characteristics as the individual paragraphs of those notices. If you’re a peripheral device, you just update each service characteristic when it needs updating and don’t worry about whether the central devices read them or not. If you’re a central device, you connect to the peripheral then read the boxes you want. If a given characteristic is readable and writable, then the peripheral and central can both change it.

由外围设备呈现的信息构成服务(s),每个服务被拆分成特性(s)。你可以把服务 想象成公告板上的通知(s),把特性想象成这些通知的各个段落(s)。如果你是一个外围设备,你只需在需要更新的时候更新每个服务特性,而不必关心是否有 中心装置读取它们。如果你是一个中心装置,连接到外围设备然后读取你需要的信息(boxes)。如果一个给定的特性可读并且可写,那么外围设备和中心装置 都可以修改它。

Notify (通知)

The Bluetooth LE specification includes a mechanism known as notify that lets you know when data’s changed. When notify on a characteristic is enabled and the sender writes to it, the new value is automatically sent to the receiver, without the receiver explicitly issuing a read command. This is commonly used for streaming data such as accelerometer or other sensor readings. There’s a variation on this specification called indicate which works similarly, but in the indicate specification, the reader sends an acknowledgement of the pushed data.

Bluetooth LE 规范包含一种机制叫做通知,就是当数据改变时让你知道。当一项特性使能了通知机制,发送者向它写数据,新值会自动发送给接收者,而不用接收者显式地发起一个读取命令。这通常被用于流数据比如加速度计或其它传感器的读取。规范中有一个叫做指示的变体,有相似的工作方式,区别是在指示规范中阅读者对推送数据发送一个确认。

The client-server structure of Bluetooth LE, combined with the notify characteristic, is generally called a publish-and-subscribe model.
Bluetooth LE的客户端-服务器结构,连同通知特性在一起,通常被叫做发布和订阅模型。

Update a characteristic (更新特性)

Your peripheral should update characteristics when there’s a significant change to them. For example, when a switch changes from off to on, update its characteristic. When an analog sensor changes by a significant amount, update its characteristic.

当特性有显著变化发生时,外围设备应该更新它。例如,当开关从关闭到打开,更新其特性。当模拟传感器发生明显变化,更新其特性。

Just as with writing to a characteristic, you could update your characteristics on a regular interval, but this wastes processing power and energy if the characteristic has not changed.

Central and Peripheral Devices (中心装置和外围设备)

Central devices are clients. They read and write data from peripheral devices. Peripheral devices are servers. They provide data from sensors as readable characteristics, and provide read/writable characteristics to control actuators like motors, lights, and so forth.

中心装置作为客户端,从外围设备读写数据。外围设备作为服务器,将传感器数据作为可读特性提供,同时提供读/写特性用于控制执行器,比如电机、灯、等等。

Services, characteristics, and UUIDs (服务s、特性s、UUIDs)

A BLE peripheral will provide services, which in turn provide characteristics. You can define your own services, or use standard services.
Services are identified by unique numbers known as UUIDs. You know about UUIDs from other contexts. Standard services have a 16-bit UUID and custom services have a 128-bit UUID. The ability to define services and characteristics depends on the radio you’re using and its firmware.

外围设备提供服务(s),服务提供特性(s)。你可以定义自己的服务,或者使用标准服务。 服务由唯一的编号标识,叫做UUIDs。You know about UUIDs from other contexts. (你从其它语境知道UUID,你知道其它背景的UUID?)标准服务有16位UUID,自定义服务有128位UUID。定义服务和特性的能力取决于你使用 的无线设备以及它的固件。

Service design patterns (服务设计模式)

A characteristic value can be up to 20 bytes long. This is a key constraint in designing services. Given this limit, you should consider how best to store data about your sensors and actuators most effectively for your application.The simplest design pattern is to store one sensor or actuator value per characteristic, in ASCII encoded values.

每个特性值最多可以有20个字节长,这是设计服务的关键约束。鉴于此限制,你应该考虑如何更好地存储你的传感器以及执行器数据,以便于最有效的服务于你的应用。最简单的设计模式是每个特性存储传感器或者执行器的一个值,使用ASCII编码保存。

Characteristic Value
Accelerometer X 200
Accelerometer Y 134
Accelerometer Z 150

This is also the most expensive in memory terms, and would take the longest to read. But it’s the simplest for development and debugging.
You could also combine readings into a single characteristic, when a given sensor or actuator has multiple values associated with it.

从内存的角度来看,这也是最耗费内存的方式,将会占用更长的时间来读取。但是对于开发和调试,这是最简单的。
当一个指定的传感器或者执行器关联有多个值,你也可以把所有的读取放到单个的特性里。

Characteristic Value
Motor Speed, Direction 150,1
Accelerometer X, Y, Z 200,133,150

This is more efficient, but you need to be careful not to exceed the 20-byte limit. The accelerometer characteristic above, for example, takes 11 bytes as a ASCII-encoded string.

这样更高效,但是你需要注意别超出20字节限制。以上述加速度计为例,占用了11字节的ASCII编码字符串。

Read/write/notify/indicate (读/写/通知/指示)

There are 4 things a central device can do with a characteristic:

  • Read: ask the peripheral to send back the current value of the characteristic. Often used for characteristics that don’t change very often, for example characteristics used for configuration, version numbers, etc.
  • Write: modify the value of the characteristic. Often used for things that are like commands, for example telling the peripheral to turn a motor on or off.
  • Indicate and Notify: ask the peripheral to continuously send updated values of the characteristic, without the central having to constantly ask for it.

对于一项特性,中心装置可以做四件事:

  • 读: 请求外围设备发送回特性的当前值。通常用于不经常改变的特性,例如用于配置的特性、版本号等等。
  • 写: 修改特性值。 通常用于那些像命令的东西,例如告诉外围设备打开或者关闭电机。
  • 指示或通知: 要求外围设备持续发送更新的特性值, 无需中央装置不断的请求它.

Advertising and GAP (通告以及GAP)

BLE devices let other devices know that they exist by advertising using the General Advertising Profile (GAP). Advertising packets can contain a device name, some other information, and also a list of the services it provides.

BLE设备使用通用通告配置 (GAP)通过通告来让其他设备知道。通告包包含设备名,一些其他信息,以及它所提供的服务列表。

Advertising packets have a limited size. You will only be able to fit a single 128-bit service UUID in the packet. Make sure the device name is not too long, or you won’t even be able to fit that.

通告包有长度限制。你将只能在其中包含单个的128位UUID。确保设备名称不要太长,否则你将无法包含它。

You can provide additional services that are not advertised. Central devices will learn about these through the connection/bonding process. Non-advertised services cannot be used to discover devices, though. Sometimes this is not an issue. For example, you may have a custom peripheral device with a custom service, but in your central device app you may know that it also provides the Battery Service and other services.
你可以提供不被通告的附加服务。中心装置将通过连接/绑定过程来了解这些服务。非通告服务不能用于发现设备,然而很多时候这不是问题。例如,你有一个自定义外围设备带一项自定义服务,但是在你的中心装置应用中,你知道它同时提供电量服务以及其他服务。

GATT (GATT)

The Bluetooth LE protocol operates on multiple layers. General Attribute Profile (GATT) is the layer that defines services and characteristics and enables read/write/notify/indicate operations on them.When reading more about GATT, you may encounter GATT concepts of a “server” and “client”. These don’t always correspond to central and peripherals. In most cases, though, the peripheral is the GATT server (since it provides the services and characteristics), while the central is the GATT client.

蓝牙LE协议在多个层上操作。通用属性配置(GATT)是定义服务和特性并允许读/写/通知/指示在其上操作的层。当阅读更多关于GATT的内容,你可能 遇到“服务器”和“客户端”的GATT概念。它们并不总是对应中心装置和外围设备,大多数情况下,外围设备是GATT服务器(因为它提供服务和特性),而 中心装置作为GATT客户端。


This page is synchronized from the post: [Translate/翻译]A quick introduction to BLE (BLE简介)

📌 👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(September 03 第20期 )

朋友们好,CN区今日热帖附点评又来了。

说明:

  • 只列中文贴或者翻译良好的中英文帖子,纯英文或者机翻的就不在这里列了
  • 只列原创作品,转载的就不列了
  • 鉴于个人精力和能力有限,选贴及点评难免片面,敬请谅解
  • 往期内容只保留最近三期,感兴趣的可以查看我个人博客 @oflyhigh

hota939d.jpg

📌 广告时间

有玩开源硬件、IOT之类的朋友嘛,一起来玩啊:)

今日热帖附点评


flog_small491d1.png
CLANNAD Cosplay Photography - Eposide 3 / CLANNAD cosplay 摄影作品集 终结篇
CLANNAD Cosplay Photography - Special Edition / CLANNAD cosplay 摄影作品集 特别篇
作者: @kyleb15
点评: cosplay 摄影作品

flog_small491d1.png
7 major anti-inflammatory food: eating a healthy save beer belly
作者: @dabaisha
点评: 抗炎食品哦,我们的目标是没有蛀牙!哦,不对,是吃出美味,吃出健康。看了一下列表,七项中有一项是水,这我就放心了:)

flog_small491d1.png
Real-Time Update of RobinHood Whale Project 罗宾鲸火贴实时更新 03-09
作者: @laonie
点评: 这个帖子没促销就火了,看来为人民服务,终究会受到人民群众的欢迎。加油。

flog_small491d1.png
The Delicious Food Smoked Roast Fish – 舌尖上的新疆,喀什烟熏烤鱼
作者:@elfkitchen
点评: 舌尖上的美味系列。草鱼和鲤鱼也没少吃啊,但是看起来都没作者文中的新疆烤鱼好吃。回头我也用烤箱试做一次。

flog_small491d1.png
Dezhou Museum of China 德州博物馆,华夏文明博大精深,区区一小城亦有灿烂历史
作者: @lyj
点评: 作者举牌拍照的德州博物馆,好多珍宝展品哦。

flog_small491d1.png
A Classic French Apple Tart Recipe / 经典法式苹果馅饼
作者: @rea
点评: 烘焙达人,只晒成品的都不厚道,只知道馋人。作者的作品比较讲究,全部工序都有,还有诱人的成品照,大赞。帖子已经收藏,改天配够了原料也做来试试。

flog_small491d1.png
A nice cafe, a good memory and a weekend giveaway! 美好的咖啡廳與週末猜謎
作者: @deanliu
点评: 作者说猜中是哪个咖啡厅有奖,我偷偷的告诉你们答案:星巴克。快去点赞、回复、领奖吧。

flog_small491d1.png
传销脱险惊魂记 18
作者: @rivalhw
点评: 原创小说哦

flog_small491d1.png
Practice writing brush calligraphy / 学写字
作者: @userlogin
点评: steemit藏龙卧虎,大师级的书法家啊。1024个赞!

flog_small491d1.png
Steemit two new features / Steemit的两个新的变化
作者: @myfirst
steemit即将到来的更新预告
作者: @jademont
点评: 引用一句广告词康师傅方便面,好吃看得见,steemit的改变,我们看得见,加油steemit! 只有每天5票是不是有点少?:)

flog_small491d1.png
【AFTER CREATION】(Chapter 13)(Chinese Original Fantasy Novel.)/【创世之后】(第13章 永恒国度)(原创玄幻小说)
作者: @cnfund
点评: 原创小说哦

flog_small491d1.png
请给我打上标签–时代的歌之三十七
作者: @lemooljiang
点评: 请坚持创作,尽管未必得到认可,时代飞速发展,多少黄金埋入沙河。额,编不下去了。写诗不容易,坚持写诗不容易,坚持每天写诗更不容易。PS: 为啥就想起来,做人难,做名人难,做一名名老女人更难呢:) 调侃一下,作者的作品是我喜欢的风格,大赞。

flog_small491d1.png
[2016-09-01]CN区发帖作者列表(信誉、钱包)、文章链接、收益排行/Active authors & posts under the CN tag
作者: @chinadaily
点评: 混CN区的常看看吧,不用多说啦。


往期内容

👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(September 02第19期 )
👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(September 01第18期 )
👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(August 31 第17期 )


This page is synchronized from the post: 📌 👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(September 03 第20期 )

【Arduino/Genuion UNO R3 】 如何使用Watchdog (看门狗)

Arduino

说明

我会陆续放一些Arduino、Raspberry Pi、Banana Pi、Curie、Edison、Mbed、ESP8266等开源硬件以及IOT相关的内容。

有些是我新写的,有些是我以前写的,希望在steemit上找到同好。

我会将其统一放置到 #iot 分类下。

何谓Watchdog?

ATmega48A/PA/88A/PA/168A/PA/328/P has an Enhanced Watchdog Timer (WDT). The WDT is a timer counting cycles of a separate on-chip 128kHz oscillator. The WDT gives an interrupt or a system reset when the counter reaches a given time-out value. In normal operation mode, it is required that the system uses the WDR - Watchdog Timer Reset - instruction to restart the counter before the time-out value is reached. If the system doesn’t restart the counter, an interrupt or system reset will be issued.
*取自手册

如何在Arduino/Genuion UNO R3中使用?

1
2
3
4
5
6
7
8
9
10
11
12
//example by Joytag
#include <avr/wdt.h>

void setup ()
{
wdt_enable (WDTO_1S);
} // end of setup

void loop ()
{
wdt_reset ();
} // end of loop

可以选择的定时时长:

(请参考avr/wdt.h获取更详细信息)

Threshold value Constant name Supported on
15 ms WDTO_15MS ATMega 8, 168, 328, 1280, 2560
30 ms WDTO_30MS ATMega 8, 168, 328, 1280, 2560
60 ms WDTO_60MS ATMega 8, 168, 328, 1280, 2560
120 ms WDTO_120MS ATMega 8, 168, 328, 1280, 2560
250 ms WDTO_250MS ATMega 8, 168, 328, 1280, 2560
500 ms WDTO_500MS ATMega 8, 168, 328, 1280, 2560
1 s WDTO_1S ATMega 8, 168, 328, 1280, 2560
2 s WDTO_2S ATMega 8, 168, 328, 1280, 2560
4 s WDTO_4S ATMega 168, 328, 1280, 2560
8 s WDTO_8S ATMega 168, 328, 1280, 2560

示例一

目的:启用看门狗,不喂狗,观察Arduino重启
结论:通过串口监视器,我们会看到每五组数据后会输出一个”restart”,亦即看门狗起作用了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//example by Joytag
#include <avr/wdt.h>

void setup() {
Serial.begin(9600);
wdt_enable(WDTO_4S);
Serial.println("restart");
}

void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
delay(1000);
}

示例二

目的:启用看门狗,并喂狗,了解喂狗的作用
结论:我们在loop中不断的喂狗,狗吃饱了,所以Arduino不重启。通过串口监视器,我们看到Arduino持续输出数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//example by Joytag
#include <avr/wdt.h>

void setup() {
Serial.begin(9600);
wdt_enable(WDTO_4S);
Serial.println("restart");
}

void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
delay(1000);
wdt_reset();
}

其它问题

国外论坛上有不少关于Arduino使用看门狗的讨论,其实一个有意思的地方就是说wdt_enable是对寄存器进行操作,而掉电后寄存器的值依然保存。
假设这样一种情况:我们在一段arduino代码中启用了2秒的看门狗并下载执行。然后我们去下载并执行另外一个程序,这个新程序中没有使用看门狗,也没有喂狗,那么因为之前的寄存器配置依然存在,看门狗还是会起作用的,arduino会2秒重置一次。

实际情况是,因为我们平时使用arduino,是通过bootloader下载和启动的,而新版本的bootloader中已经对这个情况做了修复,查看bootloader的代码,我们会发现类似部分:

1
2
3
4
void appStart() {
watchdogConfig(WATCHDOG_OFF);
...
}

亦即在启动我们的程序之前,关掉watchdog.
(需要注意的是,可能部分版本的bootloader,没有对此问题进行修复)

感兴趣的朋友,可以使用ISP工具直接对arduino下载应用,来测试watchdog的这个特点。本人比较懒,就不测试了。

关于禁用watchdog

继续假设上一种情况,我们启用的看门狗,bootloader中又没禁用,在我们的新程序中,我们又不想使用看门狗,该如何操作。
为了这个问题,我走了一些弯路:

(1)查找芯片的技术手册,找到了一个函数来关掉看门狗:

1
2
3
4
5
6
7
8
9
10
11
12
13
void WDT_off(void)
{
__disable_interrupt();
__watchdog_reset();
/* Clear WDRF in MCUSR */
MCUSR &= ~(1<<WDRF);
/* Write logical one to WDCE and WDE */
/* Keep old prescaler setting to prevent unintentional time-out */
WDTCSR |= (1<<WDCE) | (1<<WDE);
/* Turn off WDT */
WDTCSR = 0x00;
__enable_interrupt();
}

(2)编译代码时,无法找到以下函数,
disable_interrupt(); watchdog_reset(); __enable_interrupt();
即便我包含了这个文件:#include
为此我查找了avr-libc手册,分别使用cli();wdt_reset();sei();来替换对应的函数

(3)编译通过,测试也通过。使用WDT_off(),可以关闭watchdog功能。

按说这是一件令人高兴的事,可是吐血的是,我浏览avr/wdt.h的时候,发现这个函数:wdt_disable
(注:实际上是一个宏定义,为了方便,就都叫函数了)

补充(来自网络)

In Interrupt mode, the WDT gives an interrupt when the timer expires. This interrupt can be used to wake the device from sleep-modes, and also as a general system timer. One example is to limit the maximum time allowed for certain operations, giving an interrupt when the operation has run longer than expected. In System Reset mode, the WDT gives a reset when the timer expires. This is typically used to prevent system hang-up in case of runaway code. The third mode, Interrupt and System Reset mode, combines the other two modes by first giving an interrupt and then switch to System Reset mode. This mode will for instance allow a safe shutdown by saving critical parameters before a system reset.
(问题:Arduino中如何使用Interrupt mode?)

The Watchdog always on (WDTON) fuse, if programmed, will force the Watchdog Timer to System Reset mode. With the fuse programmed the System Reset mode bit (WDE) and Interrupt mode bit (WDIE) are locked to 1 and 0 respectively.

If the Watchdog is accidentally enabled, for example by a runaway pointer or brown-out condition, the device will be reset and the Watchdog Timer will stay enabled. If the code is not set up to handle the Watchdog, this might lead to an eternal loop of time-out resets. To avoid this situation, the application software should always clear the Watchdog System Reset Flag (WDRF) and the WDE control bit in the initialization routine, even if the Watchdog is not in use.

文成仓促,错漏难免,欢迎各位行家批评指导。
转载请注明出处。


This page is synchronized from the post: 【Arduino/Genuion UNO R3 】 如何使用Watchdog (看门狗)

📌 👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(September 02 第19期 )

朋友们好,CN区今日热帖附点评又来了。

说明:

  • 只列中文贴或者翻译良好的中英文帖子,纯英文或者机翻的就不在这里列了
  • 只列原创作品,转载的就不列了
  • 鉴于个人精力和能力有限,选贴及点评难免片面,敬请谅解
  • 往期内容只保留最近三期,感兴趣的可以查看我个人博客 @oflyhigh

hota939d.jpg

📌 广告时间

今日热帖附点评


flog_small491d1.png
A Chinese twist on Japanese Cuisine. 舌尖上的西安创意料理。
作者: @sweetsssj
点评: 甜心妹纸的美食帖,无论照片还是配文都让人垂涎三尺呀。另外文末还可以学到知识,话说也吃这么多年鸳鸯锅了,每次都满头大汗光顾吃了,咋就没注意这其实是个太极图案呢😂

flog_small491d1.png
Real-Time Update of RobinHood Whale Project 罗宾鲸火贴实时更新 02-09
作者: @laonie
点评: 支持!

flog_small491d1.png
Let Our Steemian Nation Unite! / 让 我们 Steemian 民族团结起来!
作者: @rea
点评: 说的很好,少些抱怨、多些包容、提高自己。学学技术,聊聊天,交交朋友,不是很好吗:)

flog_small491d1.png
steemit的局限性:缺乏好的组织形式,无法产生高质量的内容
作者: @laoyao
点评: 文青老妖思考人生系列,哦,不多,思考steemit系列。 爱之深,责之切啊。steemit的未来不是看到的,是我们每个个体努力创造的,加油!

flog_small491d1.png
My Travel Photos The Yangtse Gorges
作者: @myfirst
点评: 大西瓜长江三峡游记&照片。大西瓜的帖子图文并茂,质量越来越好啦。然而这并没有什么用,没有大胸妹纸,想火有些难。另外,作为一个吃货,美食元素居然寥寥数笔带过,这不是大西瓜的风格呀?

flog_small491d1.png
Holding Hand drawing. 手牽手.손을 잡고
作者: @yangyang
点评: 谁言寸草心,报得三春晖。

flog_small491d1.png
传销脱险惊魂记 17
作者: @rivalhw
点评: 小说哦

flog_small491d1.png
Yangtse Gorges The Love Of Boat Tracker
作者: @myfirst
点评: 《纤夫的爱》吗?想起《伏尔加河上的纤夫》那篇课文啦。啥时候语文教材也收录大西瓜这篇著作呢?不过老外对光屁股的男士图片不感兴趣哦,这个帖子还是没火起来。

flog_small491d1.png
Trip to Belgium Part 4 / 比利时之旅-4
作者: @ace108
点评: 作者的比利时之旅系列。

flog_small491d1.png
Life Road(An Original Poem)/人生路(原创小诗)
作者: @btshuang
点评: steemit催生了无数的诗人,改天我也写诗: 钱,钱在哪里?点赞收益,只有几厘!

flog_small491d1.png
Zhouzhuang – China’s little Venice
作者: @alina1
点评: 非常漂亮的一组图片,这就是传说中的江南梦里水乡吗?原则上我是不列纯英文帖子的,奈何景致太美!

flog_small491d1.png
教大家如何查看是谁promote steemit post, boost payment
作者: @fundurian
点评: 尽管读这个帖子时,我的心在滴血。但是也许有需要的,去看看吧:)

flog_small491d1.png
[2016-08-31]CN区发帖作者列表(信誉、钱包)、文章链接、收益排行/Active authors & posts under the CN tag[2016-08-31]
作者: @chinadaily
点评: 每天看到这个帖子,我都要点进去看看,自己信誉分又涨了多少?自己有没有变身土豪?尽管每次看完都很失望😂


往期内容

👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(September 01第18期 )
👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(August 31 第17期 )
👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(August 30 第16期 )


This page is synchronized from the post: 📌 👾大嘴蛙点评:CN区今日热帖附点评,排名不分先后(September 02 第19期 )

【Arduino/Genuion 101 亲密接触】 查看芯片温度/ Intel Curie, BMI160

Arduino 101

说明

我会陆续放一些Arduino、Raspberry Pi、Banana Pi、Curie、Edison、Mbed、ESP8266等开源硬件以及IOT相关的内容。

有些是我新写的,有些是我以前写的,希望在steemit上找到同好。

我会将其统一放置到 #iot 分类下。

简介

阅读Arduino/Genuion 101的库资料,偶然发现Intel Curie中竟然内置了温度传感器。
温度传感器隶属6轴加速度计/陀螺仪(BMI160),它包含在Intel Curie核心中。
本文介绍如何读取Intel Curie内置温度传感器获取芯片的温度。并在使用过程中发现官网手册中的一处失误,并予以纠正。

温度传感器资料

BMI160

Arduino/Genuion 101 BMI160代码中读取温度的片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/** Get current internal temperature as a signed 16-bit integer.
* The resolution is typically 1/2^9 degrees Celcius per LSB, at an
* offset of 23 degrees Celcius. For example:
*
* <pre>
* Value | Temperature
* ---------+----------------
* 0x7FFF | 87 - 1/2^9 degrees C
* ... | ...
* 0x0000 | 23 degrees C
* ... | ...
* 0x8001 | -41 + 1/2^9 degrees C
* 0x8000 | Invalid
*
* @return Temperature reading in 16-bit 2's complement format
* @see BMI160_RA_TEMP_L
*/
int16_t BMI160Class::getTemperature() {
uint8_t buffer[2];
buffer[0] = BMI160_RA_TEMP_L;
serial_buffer_transfer(buffer, 1, 2);
return (((int16_t)buffer[1]) << 8) | buffer[0];
}

Arduino官网的函数手册

在Intel CurieIMU 库中,对上述函数进行了简单的封装

1
2
3
4
int CurieIMUClass::readTemperature()
{
return getTemperature();
}

Arduino站上关于此函数链接:
http://www.arduino.cc/en/Reference/CurieIMUreadTemperature

所以我们不必去了解寄存器的信息,直接调用上述函数就可以得到原始的温度信息。
因为读出的是原始的温度数据,我们需要对其进行转换,才能变成我们所熟悉的摄氏温度,转换公式如下:

`Celsius=(raw/32767.0)+23 `

(:来自上述链接函数手册,这里有个巨大的坑!)

读取芯片温度的程序

根据上述信息,我们可以实现一个简单的程序通过串口读取芯片的温度。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// http://forum.godpub.com/thread-118-1-1.html
#include "CurieIMU.h"

void setup() {
Serial.begin(9600); // initialize Serial communication
while (!Serial); // wait for the serial port to open

// initialize device
Serial.println("Initializing IMU device...");
CurieIMU.begin();
}


void loop() {
// Returns the raw value of the temperature value read by the built-in motion sensor
int rawTemp = CurieIMU.readTemperature() ;

<font color="Red">float Temp = (rawTemp/32767.0)+23 ;</font>
Serial.println(Temp);
delay(5000);
}

打开串口监视器,可以看到每五秒输出当前芯片的温度值。效果如下:

掉进大坑里

看起来似乎很完美呢,23度,基本上和我当前室温相当。看来Curie发热很低啊,几乎不发热啊。
用手摸摸Curie的芯片,果然不是很热。
等等,哪里不对?按说体温36-7度,摸芯片,温度该有些变化呀,总不能我体温也23度吧?
到底差哪呢?好吧,姑且怀疑是我体表温度太低了吧,冷血动物

那么就想办法提高一下芯片温度试试。
本来想拿电烙铁烙丫一下,又怕烙坏,搞个温柔的方式,用电吹风吹吹吧
找来电吹风,调成高档,一顿吹呀,手都要烫掉了,发现温度只上升了零点几度,这不科学。

到底哪里出错了呢,官方的库,官方的算法。

对照文档,回头一步一步追查。
寄存器地址没错

1
2
#define BMI160_RA_TEMP_L            0x20
#define BMI160_RA_TEMP_H 0x21

读取寄存器的值代码没错

1
2
3
4
5
6
int16_t BMI160Class::getTemperature() {
uint8_t buffer[2];
buffer[0] = BMI160_RA_TEMP_L;
serial_buffer_transfer(buffer, 1, 2);
return (((int16_t)buffer[1]) << 8) | buffer[0];
}

CurieIMU的封装更是直接返回:

1
2
3
4
int CurieIMUClass::readTemperature()
{
return getTemperature();
}

那么除了硬件本身不对,就是以下转换有可能出错啦:

`float Temp = (rawTemp/32767.0)+23 ;`

硬件一般很少有问题即便有问题我也没法调试不是,而这个温度转换是Arduino官网手册中提供的,那么就看看它有没有错误吧。
那么我们来分析为什么这么转换呢?
让我们回头看温度传感器的资料:

1
2
3
4
5
6
7
8
* Value | Temperature
* ---------+----------------
* 0x7FFF | 87 - 1/2^9 degrees C
* ... | ...
* 0x0000 | 23 degrees C
* ... | ...
* 0x8001 | -41 + 1/2^9 degrees C
* 0x8000 | Invalid

当数值为0 温度为23,所以转换公式后边+23,这没问题。
0x0000到0x7FFF总计为32767步,那么原始数据/32767表达的啥意思?!大坑原来在这里。
看上边引用的内容,0x0000到0x7FFF对应的温度变化从23度到(87 - 1/2^9)度,也就是说大致变化了87-23 = 64度
那么由原始数据变化成温度的计算公式应该为:(rawTemp/(32767.0/64))+23 ; 亦即:(rawTemp/512.0)+23;

再回头看BMI160的手册,人家都说了解析度是 1/2^9,Arduino官网手册害死人,浪费我大量精力。

修正后的代码与效果

针对上述结论,对代码进行修改。
修正后的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// http://forum.godpub.com/thread-118-1-1.html
#include "CurieIMU.h"

void setup() {
Serial.begin(9600); // initialize Serial communication
while (!Serial); // wait for the serial port to open

// initialize device
Serial.println("Initializing IMU device...");
CurieIMU.begin();
}


void loop() {
// Returns the raw value of the temperature value read by the built-in motion sensor
int rawTemp = CurieIMU.readTemperature() ;

float Temp = (rawTemp/512.0)+23 ;
Serial.println(Temp);
delay(5000);
}

执行效果如下:

这还是比较合理的,用电吹风一吹数值变化明显,电吹风吹的就不截图啦,累了。

亲爱的读者,这里还有个无比巨大的坑,你们能否看出来?
这个大坑说严重很严重的哦,会导致一些条件下数据完全出错。
(小提示,和数据类型有关)

总结

本文介绍如何读取Intel Curie内置温度传感器获取芯片的温度。并在使用过程中发现官网手册中的一处失误,并予以纠正。
文末作者挖了一个大坑,希望细心的读者能够发现,猜对没有奖励哦。
谨以本文抛砖引玉,希望大家折腾出更好玩的东西。


This page is synchronized from the post: 【Arduino/Genuion 101 亲密接触】 查看芯片温度/ Intel Curie, BMI160

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×