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.

参考文章:

代码


Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐