我的arduino项目汇总

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.

参考文章:

代码


arduino项目课程是一门利用arduino开发板进行学习和实践的课程。这门课程旨在培养学生的创造力、动手能力和解决问题的能力。 在arduino项目课程中,学生将学习基本的电子元件知识、编程技巧和arduino开发环境的使用。他们将学会将各种传感器和执行器与arduino开发板连接,并编写相应的程序来实现特定的功能。例如,学生可以使用温度传感器来监测温度,并根据不同的温度值控制执行器的开关。通过这样的实践,学生可以理解电子元件的工作原理和编程的基本原理。 此外,arduino项目课程还可以激发学生的创新思维。学生可以根据自己的兴趣和需求设计和制作各种有趣的项目。例如,他们可以制作一个自动浇花的系统,或者设计一个能够追踪太阳的太阳能面板。通过这样的实践,学生可以锻炼自己的创造力和问题解决能力。 arduino项目课程的另一个重要目标是培养学生的团队合作能力。在这门课程中,学生通常需要分组来完成一些较复杂的项目。在团队合作中,学生将学会分工合作、沟通协调和共同解决问题。这对于他们日后的工作和生活中都是非常宝贵的能力。 总的来说,arduino项目课程是一门非常实用和有趣的课程。通过学习和实践,学生可以掌握arduino的基本知识和技能,并培养创造力、动手能力和解决问题的能力。这门课程对学生的综合素质提高有着积极的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔚蓝慕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值