arduino
1. 温控风扇
参考文章:https://blog.csdn.net/acktomas/article/details/116128584
薄膜矩阵键盘
参考1:4X4矩阵薄膜键盘模块
参考2:通过I2C链接薄膜矩阵键盘
代码
// include the library code:
#include <LiquidCrystal.h>
#include <Keypad.h> //https://www.arduinolibraries.info/libraries/keypad
#include "DHT.h" //https://github.com/adafruit/DHT-sensor-library/actions
#define DHT_PIN A4 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11
#define FAN_PIN 11
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns
// Define the Keymap
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 2, 3, 4, 5 };
// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 6, 7, 8, 9 };
// Create the Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 13, en = 12, d4 = A0, d5 = A1, d6 = A2, d7 = A3;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
DHT dht(DHT_PIN, DHTTYPE);
char key;
uint8_t r[4] = {2, 2, 3, 0};
uint8_t min_speed = 60;
uint8_t max_speed = 255;
uint8_t min_t = 22;
uint8_t max_t = 30;
uint8_t fan_speed;
float past_t, past_h;
unsigned long read_temp_interval = 5000; //5 second 测一次温度
unsigned long past_time_ms ;
void setup() {
// pinMode(DHT_PIN, INPUT);
// pinMode(FAN_PIN, OUTPUT);
// initialize LCD and set up the number of columns and rows:
// Serial.begin(9600);
lcd.begin(16, 2);
lcd.cursor();
// set the cursor to the top left
lcd.setCursor(0, 0);
dht.begin();
delay(2000);
past_t = dht.readTemperature();
past_h = dht.readHumidity();
delay(1000);
past_time_ms = millis();
}
void loop() {
key = kpd.getKey();
if (key != NO_KEY) {
if (key == '#') {
setTemp();
}
}
if (millis() - read_temp_interval > past_time_ms) {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
lcd.clear();
lcd.print("DHT Failed!");
} else {
lcd.setCursor(0, 0);
lcd.print("H:"); //lenth of string is 6
lcd.print(h);
lcd.setCursor(8, 0);
lcd.print("T: "); //lenth of string is 6
lcd.print(t);
if (t < min_t) {
analogWrite(FAN_PIN, 0);
fan_speed = 0;
} else {
fan_speed = map(t * 100, min_t * 100, max_t * 100, min_speed, max_speed);
// Serial.println(fan_speed);
analogWrite(FAN_PIN, fan_speed);
}
lcd.setCursor(0, 1);
lcd.print("Fan Speed:");
lcd.print(100.0 * fan_speed / max_speed);
lcd.print("%");
}
past_time_ms = millis();
}
}
void setTemp()
{
int i = 0;
int j = 4;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("set temperature!");
lcd.setCursor(0, 1);
lcd.print("Min:");
lcd.print(min_t);
lcd.print("; Max:");
lcd.print(max_t);
lcd.setCursor(j, 1);
while (1) {
key = kpd.getKey();
if (key != NO_KEY) {
if (key == '#')
{
key = 0;
min_t = r[0] * 10 + r[1];
max_t = r[2] * 10 + r[3];
break;
}
if (key == '*')
{
key = 0;
switch (j) {
case 4: j = 4; break;
case 12: j = 5; break;
default: j--; break;
}
lcd.setCursor(j, 1);
} else if (key != 'A' && key != 'B' && key != 'C' && key != 'D') {
lcd.print(key);
r[i] = key - 48;
i++;
j++;
switch (j) {
case 6: j = 12; break;
case 14: j = 4; break;
}
lcd.setCursor(j, 1);
}
delay(500);
}
}
}
2. 太阳追踪太阳能电池板
参考文章:https://blog.csdn.net/acktomas/article/details/116125227
代码
#include <Servo.h>
Servo lr_servo;//定义左右旋转舵机名称
Servo ud_servo;//定义上下旋转舵机名称
int lr_angle = 90;//设置初始角度为90度
int ud_angle = 90;//设置初始角度为0度,让太阳能板水平朝上,检测太阳光最强点
int l_state = A0;//定义光敏电阻模拟电压输入
int r_state = A1;
int u_state = A2;
int d_state = A3;
int lr_servopin = 3;//定义舵机控制信号引脚
int ud_servopin = 5;
void setup() {
Serial.begin(9600); //定义串口波特率
lr_servo.attach(lr_servopin); // 设置舵机控制针脚
ud_servo.attach(ud_servopin); // 设置舵机控制针脚
pinMode(l_state, INPUT); //设置引脚类型
pinMode(r_state, INPUT);
pinMode(u_state, INPUT);
pinMode(d_state, INPUT);
lr_servo.write(lr_angle);//恢复初始角度
delay(1000);
ud_servo.write(ud_angle);
delay(1000);
}
void loop() {
int L = analogRead(l_state);//读取传感器模拟电压值,0-1200
int R = analogRead(r_state);
int U = analogRead(u_state);
int D = analogRead(d_state);
int error = 20;//定义误差范围,防止抖动
int m_speed = 20;//设置舵机速度
/**********************左右调节程序**********************/
// abs()是求绝对值函数
if (abs(L - R) > error && L < R) { //判断误差是否在允许范围内,否者调整舵机
lr_angle--;//调小角度
if (lr_angle < 10) { //限制舵机转动角度
lr_angle = 10;
}
lr_servo.write(lr_angle); //输出舵机角度
delay(m_speed);
}
else if (abs(L - R) > error && L > R) { //判断误差是否在允许范围内,否者调整舵机
lr_angle++;//调大角度
if (lr_angle > 170) { //限制舵机转动角度
lr_angle = 170;
}
lr_servo.write(lr_angle); //输出舵机角度
delay(m_speed);
}
else if (abs(L - R) <= error) { //判断误差是否在允许范围内,在范围内,舵机静止,角度不做调整
lr_servo.write(lr_angle); //输出舵机角度
}
/**********************上下调节程序**********************/
if (abs(U - D) > error && U < D) { //判断误差是否在允许范围内,否者调整舵机
ud_angle--;//调小角度
if (ud_angle < 10) { //限制舵机转动角度
ud_angle = 10;
}
ud_servo.write(ud_angle); //输出舵机角度
delay(m_speed);
}
else if (abs(U - D) > error && U > D) { //判断误差是否在允许范围内,否者调整舵机
ud_angle++;//调大角度
if (ud_angle > 90) { //限制舵机转动角度
ud_angle = 90;
}
ud_servo.write(ud_angle); //输出舵机角度
delay(m_speed);
}
else if (abs(U - D) <= error) { //判断误差是否在允许范围内,在范围内,舵机静止,角度不做调整
lr_servo.write(lr_angle); //输出舵机角度
}
//串口显示光敏电阻阻值和舵机角度
Serial.print(" L ");
Serial.print(L);
Serial.print(" R ");
Serial.print(R);
Serial.print(" U ");
Serial.print(U);
Serial.print(" D ");
Serial.print(D);
Serial.print(" ud_angle ");
Serial.print(ud_angle);
Serial.print(" lr_angle ");
Serial.println(lr_angle);
delay(1000);//在测试时,串口数据接收过快,可以适当加延时调整
}
3.
参考文章:
代码
python
1.
参考文章:
代码