数字信号
高低电平的数字信号中国不是高电平就是低电平,两种状态
LED只能亮或着灭
想实现亮度变化的话,只能调节电阻大小
模拟信号
就是尽可能的将数字信号中没有用到的电平利用起来
引脚图
模拟引脚(一般前面标记有波浪线) : ~D1 ~D2 ~D3 ~D4 ~D5 ~D6 ~D7
这些引脚其实也可以输出数字信号
const int pinLed = 12; //看引脚图对应 ~D6
void setup() {
pinMode(pinLed, OUTPUT);
}
void loop() {
digitalWrite(pinLed,HIGH);
delay(1000);
digitalWrite(pinLed,LOW);
delay(1000);
}
下面进行模拟信号的读取和根据输出模拟信号
灯的亮度由D5输入的电压强度决定
const int sensor = 14; // ~D5
const int pinLed = 12; // ~D6
int sensorRead = 0;
int sensorData = 0;
void setup() {
Serial.begin(9600);
pinMode(sensor, INPUT);
pinMode(pinLed, OUTPUT);
}
void loop() {
//digitalWrite(pinLed,HIGH);
analogWrite(pinLed,sensorData); //输出模拟量,范围为0~255
sensorRead = analogRead(sensor);
//8266中模拟信号大小为0~1023
//map方法转换为0~255
sensorData = map(sensorRead,0,1023,0,255);
Serial.print("Sersor: ");
Serial.print( sensorRead);
Serial.print("--- ");
Serial.println( sensorData);
delay(500);
//digitalWrite(pinLed,LOW);
//delay(200);
}
问题来了
但是在D5连上可变电阻我的读取值不是0就是1023.起初我以为是我的电阻变化刻度太大了。。。后来我用小电阻串联尝试发现tmd,不对劲,然后发现这玩意
ADC(数模转换器)
然后看看开发板上唯一的ADC接口不是D5,而是A0-TOUT
然后调整下战斗方案,用A0进攻,然后滑动变阻器变为光敏电阻(我的滑动变阻器估计是从床头灯拆下来的。。太大个了)
const int pinLed = 12; // ~D6
int light = 0;
void setup() {
Serial.begin(9600);
pinMode(A0,INPUT);
pinMode(pinLed, OUTPUT);
}
void loop() {
light = analogRead(A0);
analogWrite(pinLed,light);
Serial.println(light);
delay(1000);
}
效果
简易版呼吸灯
线性变亮在线性变灭,稍微延迟了一会
(非线性才是美的呼吸灯,但是这里力求简单)
const int pinLed = 12; // ~D6
void setup() {
Serial.begin(9600);
pinMode(pinLed, OUTPUT);
}
void loop() {
for(int i =0;i<255;i++)
{
analogWrite(pinLed,i);
Serial.println(i);
}
for(int i =255;i>0;i--)
{
analogWrite(pinLed,i);
Serial.println(i);
}
delay(300);
}