0 前言
大家好!我叫乐创物联,我主要是做工业自动化方面和物联网方面的。了解熟悉工业自动化领域的,也开发过物联网相关的产品。我的初衷是做工业物联网的,但这个系统太过于庞大,后续也会自主去学习一下。所以就先做小的系统,例如构建一整套智能家居系统,从硬件到软件全系列。下面就开始这套智能家居系统是如何在物联网基础上构建。在这里你可以0开始,然后到1质变,仅仅需要一起跟我学乐创物联物联网架构的学习。
![e017965bdcf6017a3528c8720e39dfc7.png](https://i-blog.csdnimg.cn/blog_migrate/70c2aa7e619973a2af9aa06281bccf7f.jpeg)
乐创物联物联网学习路线
回顾一下上节《乐创物联物联网架构之硬件层中间件Arduino数字量》,从Arduino数字量(数字 I/O、时间函数、串口收发函数),然后介绍Blink例子、按钮控制LED例子,最后讲解了按键消抖原理。本节就来讲感知层下硬件层中间件Arduino模拟量。感知层是物联网最基础的部分,就像人的五官一样去感受世界。
1 Arduino 模拟量
模拟 I/O
int analogRead(pin) 模拟IO口读函数,pin表示为0~5(Arduino Diecimila为0~5,Arduino nano为0~7)。比如可以读模拟传感器(10位AD,0~5V表示为0~1023)。
analogWrite(pin, value) - PWM 数字IO口PWM输出函数,Arduino数字IO口标注了PWM的IO口可使用该函数,pin表示3, 5, 6, 9, 10, 11,value表示为0~255。比如可用于电机PWM调速或音乐播放。
![6fc997c5987a86904a4c56e20e86005c.png](https://i-blog.csdnimg.cn/blog_migrate/ecc04fbe3662a09153a40087e9aad7ef.jpeg)
Arduino
2 模数转换功能
步骤:
1) 定义需要的模拟量输入引脚,Arduino UNO 为 A0~A5;
2) 读取对应的模拟量,10位精度,2的10次方,0~1023;
3) 把对应的模拟量进行比例变换,使用map()函数或者用其他函数;
4) 把最终数据显示到串口、液晶、数码管等设备上。
3 PWM脉宽调制
PWM是英文“Pulse Width Modulation”的缩写,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种有效的技术手段,广泛应用于测量、通信、功率控制与变换等许多领域。PWM,频率不变(周期不变),脉冲高电平宽度可以调节,实际是调试做功时间(单位时间做功),从而达到调节电压、电流或者功率等参数。
PWM在一些情况下可以代替DAC(数模转换)功能。所以在Arduino里面使用函数analogWrite(pin, value) 写模拟量,Arduino的PWM是8位,换算数字量是0~255。PWM使用芯片内部自带的PWM发生器,只有主板上标有PWM标识的才能用。Arduino UNO的PWM引脚为3/5/6/9/10/11。
4 温度例子
该模块是基于热敏电阻(阻值随外界环境温度变化而变化)的工作原理,能够实时感知周边环境温度的变化,我们把数据送到 Arduino 的 analog IO,接来下我们只要经过简单的编程就能将传感器输出的数据转换为摄氏温度值,并加以显示,使用起来还是方便、有效的呢,借此广泛应用于园艺、家庭警报系统等装置中。与一般的温度传感器是一样的,都是 3 线封装,我们在使用时接好电源线后确定信号输入端就行了,因为模块输出的是模拟信号,我们要把信号输出端接到 Arduino 的模拟 IO上进行采样,这样才能正确读出温度值;热敏电阻之所以也能测量温度,就是因为它结合了 Steinhart-Hart Thermistor 方程,测试代码中的函数 double Thermister(int RawADC)就是该方程的体现。温馨提示:代码中有用到关于 Steinhart-Hart Thermistor 方程的应用。
请参阅http://en.wikipedia.org/wiki/Thermistor
#include
int val;
double Thermister(int RawADC) {
double Temp;
Temp = log(((10240000/RawADC) - 10000));
Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
Temp = Temp - 273.15; // Convert Kelvin to Celcius
return Temp;
}
void setup() {
Serial.begin(9600);
}
void loop() {
val=analogRead(A0);
Serial.print(Thermister(val)); // display Fahrenheit
Serial.println("C");
delay(5000);
}
5 土壤传感器例子
用于土壤的湿度检测。可通过电位器调节土壤湿度的阀值,顺时针调节,控制的湿度会越大,逆时针越小;湿度低于设定值时,DO输出高电平,模块提示灯亮;湿度高于设定值时,DO输出低电平,模块提示灯灭。工作电压3.3V-5V。3V时,在空气中AO读取的值最大为695 , 浸泡在水里的 最小值245;5V时,在空气中AO读取的值最大为1023 ,浸泡在水里的最小值 245。
#define PIN_AO 0
#define PIN_DO 2
void setup() {
pinMode(PIN_AO, INPUT);
pinMode(PIN_DO, INPUT);
Serial.begin(9600);
}
void loop() {
Serial.print("AO=");
Serial.print(analogRead(PIN_AO));
Serial.print(", DO=");
Serial.println(digitalRead(PIN_DO));
delay(5000);
}
![cf5840ac2f46d8f33a104ff33773244c.png](https://i-blog.csdnimg.cn/blog_migrate/db11f45e437eacae74191d76ae256565.jpeg)
土壤传感器例子
6 PWM调LED亮度例子
const int analogInPin = A0;//模拟量输入
const int analogOutPin = 9;//PWM输出引脚
int sensorValue = 0;//电位计电压值
int outputValue = 0;//模拟量输出值(PWM)
void setup() {
// 串口初始化
Serial.begin(9600);
}
void loop() {
// 读模拟量值
sensorValue = analogRead(A0);
//变换数据空间
outputValue = map(sensorValue, 0, 1023, 0, 255);
//输出对应的PWM值
analogWrite(analogOutPin, outputValue);
//打印到串口
Serial.print("sensor=");
Serial.print(sensorValue);
Serial.print(" output=");
Serial.println(outputValue);
delay(2000);
}
![f48de1c3f2f29343d15f73d98632235b.png](https://i-blog.csdnimg.cn/blog_migrate/5525787c1c6db5f340f44cc97f48a0fa.jpeg)
PWM调LED亮度例子
7 结论
这些都是经过实践检验的,本来想等开专栏,放专栏里的,现在不挣钱,交个朋友!跟我一起入门物联网吧!