查看: 142|回复: 1

[未解决] 在DS1302取得时间存到字符串并做判断问题

[复制链接]

该用户从未签到

发表于 2020-1-15 08:51 | 显示全部楼层 |阅读模式
各位老师,我做了一个通过DS1302模块取得时间,输出到LCD1602显示屏,并同步取得时间字符串做判断,当到达一个时间点启动舵机和直流电机,测试了两种思路:第一种把时间变量存储到tim数组中做判断,第二种把时间变量存储到String变量中。两种思路好像都无法达到效果,请各位大神指点代码哪里写错了?变量定义:

时间变量赋值:

kittenblock中小学创客名师推荐的图形化编程软件

/* 将日期代码格式化凑成buf等待输出 */
    snprintf(buf, sizeof(buf),"%s%04d-%02d-%02d %02d:%02d %02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
    //这里把小时+分钟内容存储到tim变量中
    snprintf(tim, sizeof(tim),"%02d%02d", t.hr, t.min);

kittenblock中小学创客名师推荐的图形化编程软件

lcd.setCursor(0, 1);  
  for(i=3;i<19;i++)        //年 月 日 时 分 秒
  {
    lcd.print(buf);
    nowTime += buf ;    //此处感觉一直取不到内容
  }
  Serial.println(nowTime);

变量判断:

kittenblock中小学创客名师推荐的图形化编程软件

 //判断时间点(相当于定时器到点启动)
 //以下判断晚上8点,更改开关变量
  if(tim == "2000")
  {
      fixTime = true;
      Serial.println("ok");
  } 



完整代码:

kittenblock中小学创客名师推荐的图形化编程软件

/*
 * LCD1602 IIC驱动
 */
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <stdio.h>
#include <string.h>
#include <DS1302.h>
#include <Servo.h>
#include <SCoop.h>

#include <Servo.h>
#include <AFMotor.h>
//
AF_DCMotor motor(4);

// Servo on PWM pin 9 (板上Servo端口对应uno9和10号端口)
const int penServoPin = 9;
Servo myServo; 
int pos = 0;    // variable to store the servo position 

 /* 创建 DS1302 对象 */
//DS1302 rtc(5, 6, 7);
/*为了使用motor control ahield for arduion 板子,特把5,6,7端口移到板子空闲端口14-19中的14,15,16*/
DS1302 rtc(14,15, 16);
//配置LCD地址及行列
LiquidCrystal_I2C lcd(0x27,16,2);  
int i;
/* 日期变量缓存 */
char buf[50];
char day[10];
char tim[10];
String nowTime = "";
/* 串口数据缓存 */
String comdata = "";
int numdata[7] ={0}, j = 0, mark = 0;

/* 判断定时时间 */
bool fixTime = false;


defineTask(TaskTest1);  //创建LCD线程1
defineTask(TaskTest2);  //创建舵机线程2
defineTask(TaskTest3);  //创建抽水机线程3

void print_time()
{
    /* 从 DS1302 获取当前时间 */
    Time t = rtc.time();
    /* 将星期从数字转换为名称 */
    memset(day, 0, sizeof(day));
    switch (t.day)
    {
    case 1: strcpy(day, "Sun"); break;
    case 2: strcpy(day, "Mon"); break;
    case 3: strcpy(day, "Tue"); break;
    case 4: strcpy(day, "Wed"); break;
    case 5: strcpy(day, "Thu"); break;
    case 6: strcpy(day, "Fri"); break;
    case 7: strcpy(day, "Sat"); break;
    }
    /* 将日期代码格式化凑成buf等待输出 */
    snprintf(buf, sizeof(buf),"%s%04d-%02d-%02d %02d:%02d %02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
    //这里把小时+分钟内容存储到tim变量中
    snprintf(tim, sizeof(tim),"%02d%02d", t.hr, t.min);

    /* 输出日期到串口 */
    Serial.println(tim);
}

//---LCD显示---
void TaskTest1::setup() //子线程1设定
{
  lcd.init(); //初始化LCD
  lcd.backlight(); //打开背光
  //1302设置
  Serial.begin(9600);
  rtc.write_protect(false);
  rtc.halt(false);
}
void TaskTest1::loop() //子线程1循环
{   
    /* 当串口有数据的时候,将数据拼接到变量comdata */
    while (Serial.available() > 0)
    {
        comdata += char(Serial.read());
        delay(2);
        mark = 1;
    }
    /* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
    if(mark == 1)
    {
        Serial.print("You inputed : ");
        Serial.println(comdata);
        for(int i = 0; i < comdata.length() ; i++)
        {
            if(comdata == ',' || comdata == 0x10 || comdata == 0x13)
            {
                j++;
            }
            else
            {
                numdata[j] = numdata[j] * 10 + (comdata - '0');
            }
        }
        /* 将转换好的numdata凑成时间格式,写入DS1302 */
        Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
        rtc.time(t);
        mark = 0;j=0;
        /* 清空 comdata 变量,以便等待下一次输入 */
        comdata = String("");
        /* 清空 numdata */
        for(int i = 0; i < 7 ; i++) numdata=0;
    }
   
    /* 打印当前时间 */
    print_time();
   lcd.setCursor(0, 0);   //显示星期
   for(i=0;i<3;i++)               
  {
    lcd.print(buf);
  }
  delay(100);
  
  lcd.setCursor(0, 1);  
  for(i=3;i<19;i++)        //年 月 日 时 分 秒
  {
    lcd.print(buf);
    nowTime += buf ;    //此处感觉一直取不到内容
  }
  Serial.println(nowTime);
  lcd.setCursor(14, 0);  
  for(i=20;i<22;i++)        // 秒
  {
    lcd.print(buf);
  }
 //判断时间点(相当于定时器到点启动)
 //以下判断晚上8点,更改开关变量
  if(tim == "2000")
  {
      fixTime = true;
      Serial.println("ok");
  } 

  delay(1000);
    
}

//---舵机线程---
void TaskTest2::setup() //子线程2设定
{
    myServo.attach(penServoPin); //连接舵机(自带库仅9/10脚有效)
}
void TaskTest2::loop() //子线程2循环
{
  while(fixTime == true)
  {
   //SERVO从0到180度来回旋转    
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myServo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myServo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  fixTime = false;
  if(fixTime == false)
      break;
  }
}

//---直流电机线程---
void TaskTest3::setup() //子线程3设定
{
    Serial.begin(9600);           // set up Serial library at 9600 bps

  // turn on motor
  motor.setSpeed(200);
 
  motor.run(RELEASE);
}
void TaskTest3::loop() //子线程3循环
{
  while(fixTime == true)
  {
  //启动电机30秒
  int i;
  motor.run(FORWARD);
  for (i=0; i<30000; i++) {
    motor.setSpeed(200);  
    delay(10);
 }
  motor.run(RELEASE);
  fixTime = false;
  if(fixTime == false)
      break;
  }
}

void setup()
{
  mySCoop.start();

}

void loop()
{
     yield();
}



  • TA的每日心情
    无聊
    2020-1-23 18:36
  • 签到天数: 105 天

    [LV.6]常住居民II

    发表于 2020-1-16 09:32 | 显示全部楼层

    回帖奖励 +2 金币

    哇,好厉害!顶
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    [限时福利]5分钟带你快速了解新一代开发板:M5STACK
    [限时福利]5分钟带你快速
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    哪位高手帮帮忙呀用UNO主板控制垃圾分类
    哪位高手帮帮忙呀用UNO主
    因为综合实践课给学生讲垃圾分类所以想用Arduino UNO主板制作一个智能分类的设
    中文 字库 的8针 OLED 12864模块 arduino
    中文 字库 的8针 OLED 128
    屏幕电路SPI连线: 中文字库OLED Arduino UNO GND GND
    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    【Arduino】108种传感器系列实验(03)---微波雷达感应开关...
    【Arduino】108种传感器系
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表