GREEN HAND(1)--blink; open lights; water&breath lights; seven segment led; button controls seven seg

通过网络查找自己做题学习arduino;

blink; open lights; water&breath lights; seven segment led; button controls seven segment led;


first:blink

Arduino uno连上PC,板子上的灯,自己会闪,这是出厂时已经烧录在板子上的。Arduino IDE自带例程


void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}


学会看代码来学习代码:

1、pinmode();

pinMode(pin, mode);

https://www.arduino.cc/en/Reference/pinMode

2、digitalWrite();

digitalWrite(pin, value);

https://www.arduino.cc/en/Reference/DigitalWrite

3、delay();

3、delay(ms);

https://www.arduino.cc/en/Reference/Delay


second: open lights

学习将数字引脚和GND连接,构成回路,通过更改例程里的引脚,和delay时间,自己copy一个灯


third: water&breath lights

题目要求三个灯,实现流水和呼吸。

int timer = 150;                   // 数字越大,时间越久
int pins[] = {3,5,6,9,10};        // 端口名
int num_pins = 5;                 // 端口个数
//
int slowlyshine(int i)
{
  int j = 0;
  for(int j=0;j<255;j++)
  {
  delay(2);
  analogWrite(i, j);    
  }
  for(int j=255;j>=0;j--)
  {
  delay(2);
  analogWrite(i, j);    
  }
  return 0;
}
///
void setup()
{
  int i;
  for (i=0; i<num_pins; i++){
    pinMode(pins[i], OUTPUT);
  }
}
// 
void loop()
{
  int i;
  for(i=0;i<num_pins-1;i++)
  {
    slowlyshine(pins[i]);
  }
  for(i=num_pins-1;i>=1;i--)
  {
    slowlyshine(pins[i]);
  }
}

analogWrite函数是再百度搜索时搜到并且自己写上的。


analogWrite(pin, value);

https://www.arduino.cc/en/Reference/AnalogWrite

同时,简要的了解一下自己理解的pwm波


如果想要呼吸,电压要一点点上来。由于电压一般是5V或者0V,所以通过调节单位时间内5V所占的时间,可以达到效果,因为人眼有视觉暂留效应。


forth: seven segment led

要求四位八段数码管显示0——0.9,然后从1——99,其中的质数要闪烁三次。

最初的构想是:

改一下 在淘宝购买的四位八段数码管的例程,来实现这一功能,但是实在困难,而且代码冗余度高,复杂不利于维护,同时增加了自己的工作量。

原始代码如下:

//设置阴极接口
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int f = 6;
int g = 7;
int p = 8;
//设置阳极接口
int d4 = 9;
int d3 = 10;
int d2 = 11;
int d1 = 12;
//设置变量
long n = 0;
long n10 = 0;
long n100 = 0;
long n1000 = 0;
int x = 100;
int del = 55;  //此处数值对时钟进行微调
int flag=0;
int savesushu[26];
int l=0;
const int W=100;
int truenum=0;
byte segs[7] = { a, b, c, d, e, f, g };
byte mdzz[7] = { 0,0,0,0,0,0,0 };
byte seven_seg_digits[10][7] = { { 0,0,0,0,0,0,1 },  // = 0
                                 { 1,0,0,1,1,1,1 },  // = 1
                                 { 0,0,1,0,0,1,0 },  // = 2
                                 { 0,0,0,0,1,1,0 },  // = 3
                                 { 1,0,0,1,1,0,0 },  // = 4
                                 { 0,1,0,0,1,0,0 },  // = 5
                                 { 0,1,0,0,0,0,0 },  // = 6
                                 { 0,0,0,1,1,1,1 },  // = 7
                                 { 0,0,0,0,0,0,0 },  // = 8
                                 { 0,0,0,0,1,0,0 }   // = 9
                             }; 


void setup()
{
  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  pinMode(d3, OUTPUT);
  pinMode(d4, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(p, OUTPUT);
  FindZhishu();
}
 
void loop()
{
 
        long w = millis()/1000;
//这个是调用时间的函数
        shownum(w);
}
 
void pickDigit(int x)  //定义pickDigit(x),其作用是开启dx端口
{
  digitalWrite(d1, LOW);
  digitalWrite(d2, LOW);
  digitalWrite(d3, LOW);
  digitalWrite(d4, LOW);
 
  switch(x)
  {
  case 1: 
    digitalWrite(d1, HIGH); 
    break;
  case 2: 
    digitalWrite(d2, HIGH); 
    break;
  case 3: 
    digitalWrite(d3, HIGH); 
    break;
  default: 
    digitalWrite(d4, HIGH); 
    break;
  }
}
 
void dispDec(int x)  //设定开启小数点
{
  digitalWrite(p, LOW);
}
 
void clearLEDs()  //清屏
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(p, HIGH);
  
}
 
 
// 点亮对应数字的数码管
void lightSegments(int x,int shineflag) {
  if(shineflag==1)
  {
    for (int i = 0; i < 7; i++) {
    digitalWrite(segs[i], seven_seg_digits[x][i]);
    for(int j=0;j<25;j++)
    {
    //digitalWrite(segs[i], mdzz[7]); 
         clearLEDs();
         digitalWrite(segs[i], seven_seg_digits[x][i]); 
    }
    digitalWrite(segs[i], seven_seg_digits[x][i]);    
    for(int j=0;j<25;j++)
    {
    //digitalWrite(segs[i], mdzz[7]);
    clearLEDs();      
    }
    digitalWrite(segs[i], seven_seg_digits[x][i]);
      }
  }
  else{
   for (int i = 0; i < 7; i++) {
    digitalWrite(segs[i], seven_seg_digits[x][i]);
  }   
  }
}
 
void shownum (int x)
{
  long x1,x10,x100,x1000;
if(flag==0){
   x1 = x/1000%10;
   x10 = x/100%10;
   x100 = x/10%10;
   x1000 = x/1%10;//个位数  
}
else{
   x1 = (x-9)/1000%10;
   x10 = (x-9)/100%10;
   x100 = (x-9)/10%10;
   x1000 = (x-9)/1%10;//个位数
   truenum=x1000+x100*10+x10*100+x1*1000;
}

 int shineflag=0;
 if(truenum==savesushu[l])
 {
  shineflag=1;
  l++;
 }
 else
 {
  shineflag=0;
 }

  clearLEDs();
  pickDigit(1);
  lightSegments(x1,shineflag);
  //delayMicroseconds(del);
 
  clearLEDs();
  pickDigit(2);
  lightSegments(x10,shineflag);
  //delayMicroseconds(del);
 
  clearLEDs();
  pickDigit(3);
  if(flag==0)
  {
    dispDec(3); 
    if(x100==1&&x1000==0)
   {
      flag=1;
    }
  }
  lightSegments(x100,shineflag);
 //delayMicroseconds(del);
 
  clearLEDs();
  pickDigit(0);
  lightSegments(x1000,shineflag);
  //delayMicroseconds(del);
  
}



这段代码里存在大量错误。后来才知道原来arduino也有库。于是最后GITHUB上找到了一个库


/* SevSeg Counter Example
 
 Copyright 2017 Dean Reading
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at 
 http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
 
 This example demonstrates a very simple use of the SevSeg library with a 4
 digit display. It displays a counter that counts up, showing deci-seconds.
 */

#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object
int pointflag=0;
const int W=100;
void setup() {
  byte numDigits = 4;
  byte digitPins[] = {2, 3, 4, 5};
  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_ANODE; // See README.md for options
  bool updateWithDelays = false; // Default. Recommended
  bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
  
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros);
  sevseg.setBrightness(1);
  FindZhishu();
}
  static unsigned long timer=0;
  int savesushu[26];
  int l=0;
  static unsigned long temp=0;
int FindZhishu()
{
  int i,j,k,n;
  int t=0;
  int s[W+3];
    s[0]=1;
    s[1]=1;
    for(i=2;i<W;i++)//列出2以后的所有序列
    {
        s[i]=i;
    }
    i=2;
    for(;;)
    {n=2;
        while(n*i<W)
        {
            s[n*i]=0;
            n++;
        }
        if(i*i>W)
        {
            break;
        }
        for(j=i+1;j<W;j++)
        {
            if(s[j]!=0)
            {
                i=j;
                break;
            }
        }
    }
    k=0;
    for(i=2;i<W;i++)
    {
        if(s[i]!=0)
        {
            k++;
            savesushu[t]=s[i];
            t++;
        }
    }
}
void loop() {

  static int deciSeconds = 0;
    for(int i=1;i<=9;i++)
    {
      sevseg.setNumber(i,1); 
      for(int j=1;j<=15000;j++)
      {
      sevseg.refreshDisplay();  
      }
    }
    for(int i=1;i<=99;i++)
    {
                    if(i==savesushu[l])
                    {
                      l++;
        for(int x=1;x<=3;x++)
        {
          sevseg.setNumber(i,-1);
              for(int y=1;y<=5000;y++)
              {
                  sevseg.refreshDisplay();
              }
              for(int z=1;z<=5000;z++)
              {
                  sevseg.blank();
              }          
        }
                    }
                    else
                    {
        for(int x=1;x<=5000;x++)
        {
             sevseg.setNumber(i,-1); 
                  sevseg.refreshDisplay();
        }
                    }

    }

}
/// END ///

最终通过,

在这个过程中。强调几点

1、显示与刷新是两个不同的概念,這就是为什么用for循环,而不是用delay延迟的原因

2、在获取秒数的时候,尝试用mills()函数来获取是不可行的,因为1s闪三下,人的肉眼看不出来这么快的闪烁速度。

3、学会调用库文件,很多我们现在遇到的问题,都是别人已经解决过的了。

4、学会给一个大任务划分为数个小任务,在网上搜索资料时,精确到小任务是很容易的,看到每一个资料要看到它离我想实现的目标的距离



fifth:button controls seven segment led;

要求功能是:三个按钮,分别为 + - res,对应实现 加 减 复位 的功能,在四位八段数码管上显示数字,要求复位后数字变为零,不考虑负数;

通过网络链接:http://www.whatled.com/post-1634.html

参考学会开关的使用方法,混合四位八段数码管,写下如下代码

#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object
int ledpin=5;//定义数字11 接口
int plus=4;//定义数字7 接口
int res=3;//定义数字7 接口
int mins=2;//定义数字7 接口
  int resState;
  int plusState;
  int minsState; 
  int num=0;
  char c='a';
void setup()
{
  byte numDigits = 1;
  byte digitPins[] = {13};
  byte segmentPins[] = {12, 10, 7, 8, 9, 11, 6, };
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_ANODE; // See README.md for options
  bool updateWithDelays = false; // Default. Recommended
  bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
  
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros);
  sevseg.setBrightness(99);
//pinMode(ledpin,OUTPUT);//定义小灯接口为输出接口
pinMode(plus,INPUT);//定义按键接口为输入接口
pinMode(res,INPUT);//定义按键接口为输入接口
pinMode(mins,INPUT);//定义按键接口为输入接口
}
void loop()
{
plusState=digitalRead(plus);//读取数字7 口电平值赋给val
minsState=digitalRead(mins);//读取数字7 口电平值赋给val
resState=digitalRead(res);//读取数字7 口电平值赋给val
sevseg.setNumber(num,-1);
sevseg.refreshDisplay();  
if(minsState==HIGH)//检测按键是否按下,按键按下时小灯亮起
{
  if(num!=0)   num=num-1;
//  digitalWrite(5,HIGH);
  for(int i=1;i<=6000;i++) sevseg.refreshDisplay(); 
  printf(c);
}
else
{
//  digitalWrite(5,LOW);
}
if(plusState==HIGH)//检测按键是否按下,按键按下时小灯亮起
{
  num=num+1;
//  digitalWrite(5,HIGH);
  for(int i=1;i<=6000;i++) sevseg.refreshDisplay(); 
}
if(resState==HIGH)//检测按键是否按下,按键按下时小灯亮起
{
  num=0;
//  digitalWrite(5,HIGH);
  for(int i=1;i<=6000;i++) sevseg.refreshDisplay(); 
}

}


digitalWrite(pin,mode);

https://www.arduino.cc/en/Reference/DigitalWrite


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值