Arduino UNO 学习 (三) 4x4薄膜按键、9G舵机、超声波传感器、人体传感器、1位数码管、四位数码管

(一) 4×4薄膜按键

代码如下:

 1 const int numRows = 4;
 2 const int numCols = 4;
 3 const int debounceTime = 20;
 4 const char keymap[numRows][numCols] = {
 5   {'1','2','3','A'},
 6   {'4','5','6','B'},
 7   {'7','8','9','C'},
 8   {'*','0','#','D'}
 9 };
10 const int rowPins[numRows] = {4,5,6,7};
11 const int colPins[numCols] = {8,9,10,11};
12 
13 void setup() { // all keymap level = HIGH
14   // put your setup code here, to run once:
15   Serial.begin(9600);
16   for(int row = 0; row < numRows; row++){
17     pinMode(rowPins[row], INPUT);  //输入
18     digitalWrite(rowPins[row], HIGH);  //上拉电阻,
19   }
20   for(int column = 0; column < numCols; column++){
21     pinMode(colPins[column], OUTPUT);  //写出,只有列能写(8,9,10,11)口
22     digitalWrite(colPins[column], HIGH);
23   }
24 }
25 
26 void loop() {
27   // put your main code here, to run repeatedly:
28   char key = getkey();
29   if(key != 0){
30     Serial.print("Got key ");
31     Serial.println(key);
32   }
33 }
34 
35 char getkey(){
36   char key = 0;
37   for(int column = 0; column < numCols; column++){  //
38     digitalWrite(colPins[column], LOW);
39     for(int row = 0; row < numRows; row++){
40       if(digitalRead(rowPins[row]) == LOW){  // touch keyboard ?
41         delay(debounceTime);
42         while(digitalRead(rowPins[row]) == LOW){
43           key = keymap[row][column];
44         }
45       }
46     }
47     digitalWrite(colPins[column], HIGH);
48   }
49   return key;
50 }

           

(二) 9G舵机

代码

#include <Servo.h>
Servo myservo;

void setup() {
  // put your setup code here, to run once:
  myservo.attach(9);
}

void loop() {
  // put your main code here, to run repeatedly:
  for(int pos = 0; pos < 180; pos++){
    myservo.write(pos);
    delay(15);
  }
  for(int pos = 180; pos >= 1; pos--){
    myservo.write(pos);
    delay(15);  
  }  
}

(三) 超声传感器

代码

const int trig = 8;
const int echo = 9;

void setup() {
  // put your setup code here, to run once:
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  long IntervalTime = 0;
  while(1){
    digitalWrite(trig, HIGH);
    delayMicroseconds(15);
    digitalWrite(trig, LOW);
    IntervalTime = pulseIn(echo, HIGH);
    float S = IntervalTime/58.00;
    Serial.println(S);
    S = 0; IntervalTime = 0;
    delay(500);
  }
}

(四) 人体传感器

代码

int ledpin = 12;
int inpin = 13;
int buttonState;

void setup() {
  // put your setup code here, to run once:
  pinMode(ledpin, OUTPUT);
  pinMode(inpin, INPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  buttonState = digitalRead(inpin);
  
  if(buttonState == HIGH){
    digitalWrite(ledpin, HIGH);
    delay(100);
    buttonState = digitalRead(inpin);

    if(buttonState == LOW){
      digitalWrite(ledpin, LOW);
      Serial.println(buttonState);
    }
  }
}

(五) 1位数码管

代码

int LEDCount = 8;
const unsigned char dofly_DuanMa[16] = {0x3f,0x06,0x5b,0x4f,0x66,
                                        0x6d,0x7d,0x07,0x7f,0x6f,
                                        0x77,0x7c,0x39,0x5e,0x79,0x71};
int LEDPins[] = {0,1,2,3,4,5,6,7};

void setup() {
  // put your setup code here, to run once:
  for(int i = 0; i < LEDCount; i++){
    pinMode(LEDPins[i], OUTPUT);
  }
}

void deal(unsigned char value){
  for(int i = 0; i < 8; i++){
    digitalWrite(LEDPins[i], bitRead(value, i));
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  for(int i = 0; i < 16; i++){
    deal(dofly_DuanMa[i]);
    delay(1000);
  }
}

(六) 四位数码管

  1 int LEDCount = 8;
  2 int SEGCount = 4;
  3 long previousMillis = 0;
  4 const unsigned char dofly_DuanMa[16] = {0x3f,0x06,0x5b,0x4f,0x66,
  5                                         0x6d,0x7d,0x07,0x7f,0x6f,
  6                                         0x77,0x7c,0x39,0x5e,0x79,0x71};
  7 int LEDPins[] = {12,8,5,3,2,11,6,4};
  8 int SegPins[] = {13,10,9,7};
  9 unsigned char displayTemp[4];
 10 
 11 void setup() {
 12   // put your setup code here, to run once:
 13   for(int i = 0; i < LEDCount; i++){
 14     pinMode(LEDPins[i], OUTPUT);
 15   }
 16   for(int j = 0; j < SEGCount; j++){
 17     pinMode(SegPins[j], OUTPUT);
 18     //digitalWrite(SegPins[j], HIGH);
 19   }
 20 }
 21 
 22 void deal(unsigned char value){
 23   for(int i = 0; i < 8; i++){
 24     digitalWrite(LEDPins[i], bitRead(value, i));
 25     //bitRead(value, i);
 26   }
 27 }
 28 
 29 // Static code
 30 //void loop() {
 31 //  // put your main code here, to run repeatedly:
 32 //  
 33 //  static unsigned int num;
 34 //  static unsigned long lastTime = 0;
 35 //
 36 //  if(millis() - lastTime >= 1000){
 37 //    lastTime = millis();
 38 //    num++;
 39 //  }
 40 //
 41 //  // static display 1 2 3 4
 42 //  displayTemp[0] = dofly_DuanMa[1];
 43 //  displayTemp[1] = dofly_DuanMa[2];
 44 //  displayTemp[2] = dofly_DuanMa[3];
 45 //  displayTemp[3] = dofly_DuanMa[4];
 46 //
 47 //  static int i = 0;
 48 //  unsigned long currentMillis = millis();
 49 //
 50 //  if(currentMillis - previousMillis > 0){
 51 //    previousMillis = currentMillis;
 52 //    deal(0);
 53 //   
 54 //    for(int a = 0; a < 4; a++){
 55 //      digitalWrite(SegPins[a], HIGH);
 56 //    }
 57 //    
 58 //    digitalWrite(SegPins[i], LOW);
 59 //    deal(displayTemp[i]);
 60 //    delay(500);
 61 //    i++;
 62 //    if(i == 4) { i = 0; }
 63 //  }
 64 //}
 65 
 66 // Dynamic code
 67 void loop() {
 68   // put your main code here, to run repeatedly:
 69   
 70   static unsigned int num;
 71   static unsigned long lastTime = 0;
 72 
 73   if(millis() - lastTime >= 1000){
 74     lastTime = millis();
 75     num++;
 76   }
 77 
 78   // static display 1 2 3 4
 79   displayTemp[0] = dofly_DuanMa[num/1000];
 80   displayTemp[1] = dofly_DuanMa[(num%1000)/100];
 81   displayTemp[2] = dofly_DuanMa[((num%1000)%100)/10];
 82   displayTemp[3] = dofly_DuanMa[((num%1000)%100)%10];
 83 
 84   static int i = 0;
 85   unsigned long currentMillis = millis();
 86 
 87   if(currentMillis - previousMillis > 0){
 88     previousMillis = currentMillis;
 89     deal(0);
 90    
 91     for(int a = 0; a < 4; a++){
 92       digitalWrite(SegPins[a], HIGH);
 93     }
 94     
 95     digitalWrite(SegPins[i], LOW);
 96     deal(displayTemp[i]);
 97     i++;
 98     if(i == 4) { i = 0; }
 99   }
100 }

总结:

(1)舵机不能转到逆时针的180°,不知道是不是机器的原因;

(2)四位数码管,位引脚低电位有效。

(3)总的来说,代码仔细点,保证硬件有效连接,都还是可以完成的!

原文地址:https://www.cnblogs.com/heze/p/12790344.html