开启左侧

【培训作品】桌面小雷达_陈磊 严文

[复制链接]
发表于 2018-1-3 10:51:39 | 显示全部楼层 |阅读模式
桌面小雷达

作品简介:
  该作品主要包含Arduino UNO R3、i创学院扩展板、各色5mmLED若干、1602屏、超声波模块、RTC时钟模块、自锁开关、9V电池及电池盒。实现按下开关,屏幕第一行实时显示超声波传感器检测的距离,第二行实时显示当前时间(包含年月日、小时分钟),LED灯的亮灭会随着距离变化而变化,距离越小,亮灯越多。本作品是一个好玩的桌面小玩具

微信图片_20180103104218.jpg

微信图片_20180103104227.jpg

微信图片_20180103104234.jpg

微信图片_20180103104240.jpg

微信图片_20180103104243.jpg
  1. #include <Wire.h>                       //加载I2C通讯库文件
  2. #include <LiquidCrystal_I2C.h>       //加载1602 I2C库文件
  3. #include <RTClib.h>                     //加载时钟库文件

  4. LiquidCrystal_I2C lcd(0x20, 16, 2);  //0x20是液晶模块的地址
  5. void printDateTime(DateTime dateTime);
  6. RTC_DS1307 RTC;                           //创建实例

  7. byte readBuffer[4];
  8. byte slideValue;

  9. unsigned long previousMillis1 = 0 ;     //将存储LCD最后一次更新定时器的时间
  10. unsigned long previousMillis2 = 0 ;     //将存储超声波最后一次更新定时器的时间
  11. unsigned int Command;
  12. const int trig = 12; // 触发信号
  13. const int echo = 13; // 反馈信号
  14. const int radarTimes = 400;  //超声波单次工作的时间
  15. int radar = 0;   //超声波控制
  16. int ledPin ;
  17. int ledPin1 = 4 ; // 最后一个LED灯的引脚
  18. int ledPin2 = 11 ;  //第一个 LED灯的引脚
  19. int ledN ;       //亮起的LED灯的最后一个引脚
  20. long IntervalTime = 0; //定义一个超声波测距的时间变量
  21. int S ;     //超声波测得的距离
  22. int distanceMin = 10; //  作出反应的最小距离
  23. int distanceMax = 41; //  作出反应的最大距离

  24. void setup() {
  25.   Serial.begin(9600);
  26.   Wire.begin();                      //初始化总线
  27.   RTC.begin();                       //初始化实时时钟
  28.   lcd.init();                        //初始化1602屏
  29.   for (int a = ledPin1; a <= ledPin2; a++) {
  30.     pinMode(a, OUTPUT);
  31.   }
  32.   pinMode(echo, INPUT);   //反馈端口设置为输入
  33.   pinMode(trig, OUTPUT);    //触发端口设置为输出

  34. }

  35. void loop() {
  36.   unsigned long currentMillis = millis();   //定义currentMillis变量用于存储当前定时器时间
  37.   //  lcd.backlight();         //1602屏关闭背光
  38.   lcd.noBacklight();         //1602屏开启背光
  39.   DateTime now = RTC.now();      //获取当前日期和时间

  40.   if (Serial.available() > 0) {
  41.     int instruct = Serial.read();
  42.     switch (instruct) {
  43.       case 'D': {
  44.           DateTime now = RTC.now();      //获取当前日期和时间
  45.           printDateTime(now);              //通过串口传送当前的日期和时间
  46.           break;
  47.         }
  48.       case 'S':                      //设置时间
  49.         RTC.set(RTC_YEAR, 17);
  50.         RTC.set(RTC_MONTH, 12);
  51.         RTC.set(RTC_DAY, 25);
  52.         RTC.set(RTC_HOUR, 12);
  53.         RTC.set(RTC_MINUTE, 15);
  54.         break;
  55.     }
  56.   }

  57.   /****************  LCD 显示时间  **********/
  58.   if (currentMillis - previousMillis1 <= 500) {
  59.     times1();
  60.   }
  61.   else if (currentMillis - previousMillis1 <= 1000) {
  62.     times2();
  63.   }
  64.   else if (currentMillis - previousMillis1 > 1000) {
  65.     previousMillis1 = currentMillis;
  66.   }
  67.   /****************  LCD 显示时间  **********/

  68.   /**************** 超声波测距并亮灯  **********/
  69.   if (currentMillis - previousMillis2 <= radarTimes) {
  70.     if (radar == 0) {
  71.       digitalWrite(trig, 1);//置高电平
  72.       delayMicroseconds(15);//延时15us
  73.       digitalWrite(trig, 0);//设为低电平
  74.       IntervalTime = pulseIn(echo, HIGH); //用自带的函数采样反馈的高电平的宽度,单位us
  75.       S = IntervalTime / 58.00; //使用浮点计算出距离,单位cm
  76.       // Serial.println(S);//通过串口输出距离数值
  77.       radar = 1;
  78.     }
  79.     ledN = S;
  80.     ledN = constrain(ledN, distanceMin, distanceMax);
  81.     ledN = map(ledN, distanceMin, distanceMax, ledPin2, ledPin1);
  82.     for (int a = ledPin1; a <= ledN; a++) {
  83.       digitalWrite(a, HIGH);
  84.     }
  85.     for ( ledN = ledN + 1; ledN <= ledPin2; ledN++) {
  86.       digitalWrite(ledN, LOW);
  87.     }
  88.   }
  89.   else {
  90.     previousMillis2 = currentMillis;
  91.     radar = 0;
  92.     S = 0; IntervalTime = 0; //对应的数值清零。
  93.   }
  94.   /**************** 超声波测距并亮灯  **********/
  95. }


  96. void printDateTime(DateTime dateTime) {
  97.   //传送年份
  98.   Serial.print(dateTime.year(), DEC);
  99.   Serial.print('/');
  100.   //传送月份
  101.   Serial.print(dateTime.month(), DEC);
  102.   Serial.print('/');
  103.   //传送月份中的第几天
  104.   Serial.print(dateTime.day(), DEC);
  105.   Serial.print(' ');
  106.   //传送小时
  107.   Serial.print(dateTime.hour(), DEC);
  108.   Serial.print(':');
  109.   //传送分钟
  110.   Serial.print(dateTime.minute(), DEC);
  111.   Serial.print(':');
  112.   //传送秒
  113.   Serial.print(dateTime.second(), DEC);
  114.   Serial.println();
  115.   Serial.print(dateTime.dayOfWeek(), DEC);
  116.   Serial.println();
  117. }

  118. void times1() {
  119.   DateTime now = RTC.now();
  120.   lcd.setCursor(0, 0);
  121.   lcd.print("Distance:");
  122.   lcd.print(S);
  123.   lcd.print("cm    ");
  124.   lcd.setCursor(0, 1);
  125.   lcd.print(now.year(), DEC);
  126.   lcd.print("/");
  127.   if (now.month() < 10) {
  128.     lcd.print("0");
  129.     lcd.print(now.month(), DEC);
  130.   }
  131.   else {
  132.     lcd.print(now.month(), DEC);
  133.   }
  134.   lcd.print("/");
  135.   if (now.day() < 10) {
  136.     lcd.print("0");
  137.     lcd.print(now.day(), DEC);
  138.   }
  139.   else {
  140.     lcd.print(now.day(), DEC);
  141.   }
  142.   lcd.print(" ");
  143.   if (now.hour() < 10) {
  144.     lcd.print("0");
  145.     lcd.print(now.hour(), DEC);
  146.   }
  147.   else {
  148.     lcd.print(now.hour(), DEC);
  149.   }
  150.   lcd.print(":");
  151.   if (now.minute() < 10) {
  152.     lcd.print("0");
  153.     lcd.print(now.minute(), DEC);
  154.   }
  155.   else {
  156.     lcd.print(now.minute(), DEC);
  157.   }
  158. }

  159. void times2() {
  160.   DateTime now = RTC.now();
  161.   lcd.setCursor(0, 0);
  162.   lcd.print("Distance:");
  163.   lcd.print(S);
  164.   lcd.print("cm    ");
  165.   lcd.setCursor(0, 1);
  166.   lcd.print(now.year(), DEC);
  167.   lcd.print("/");
  168.   if (now.month() < 10) {
  169.     lcd.print("0");
  170.     lcd.print(now.month(), DEC);
  171.   }
  172.   else {
  173.     lcd.print(now.month(), DEC);
  174.   }
  175.   lcd.print("/");
  176.   if (now.day() < 10) {
  177.     lcd.print("0");
  178.     lcd.print(now.day(), DEC);
  179.   }
  180.   else {
  181.     lcd.print(now.day(), DEC);
  182.   }
  183.   lcd.print(" ");
  184.   if (now.hour() < 10) {
  185.     lcd.print("0");
  186.     lcd.print(now.hour(), DEC);
  187.   }
  188.   else {
  189.     lcd.print(now.hour(), DEC);
  190.   }
  191.   lcd.print(" ");
  192.   if (now.minute() < 10) {
  193.     lcd.print("0");
  194.     lcd.print(now.minute(), DEC);
  195.   }
  196.   else {
  197.     lcd.print(now.minute(), DEC);
  198.   }
  199. }
复制代码
【附件】
程序源文件: Radar.ino (6.8 KB, 下载次数: 1)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩课程推荐

关于我们

帮助中心

商务合作

点击这里给我发消息

关注微信公众号

Copyright © 2016-2017 i创学院 - 上海享渔教育科技有限公司 Powered by Discuz!     ( 沪ICP备16033954号-1 )