查看: 567|回复: 1

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

[复制链接]

该用户从未签到

发表于 2020-1-15 08:51 | 显示全部楼层 |阅读模式
各位老师,我做了一个通过DS1302模块取得时间,输出到LCD1602显示屏,并同步取得时间字符串做判断,当到达一个时间点启动舵机和直流电机,测试了两种思路:第一种把时间变量存储到tim数组中做判断,第二种把时间变量存储到String变量中。两种思路好像都无法达到效果,请各位大神指点代码哪里写错了?变量定义:
[mw_shl_code=arduino,true]char tim[10];
String nowTime = "";[/mw_shl_code]
时间变量赋值:
[mw_shl_code=arduino,true]/* 将日期代码格式化凑成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);[/mw_shl_code]
[mw_shl_code=arduino,true]lcd.setCursor(0, 1);  
  for(i=3;i<19;i++)        //年 月 日 时 分 秒
  {
    lcd.print(buf);
    nowTime += buf ;    //此处感觉一直取不到内容
  }
  Serial.println(nowTime);[/mw_shl_code]
变量判断:
[mw_shl_code=arduino,true] //判断时间点(相当于定时器到点启动)
//以下判断晚上8点,更改开关变量
  if(tim == "2000")
  {
      fixTime = true;
      Serial.println("ok");
  } [/mw_shl_code]


完整代码:

[mw_shl_code=arduino,true]/*
* 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();
}[/mw_shl_code]


  • TA的每日心情

    2020-7-28 12:45
  • 签到天数: 108 天

    [LV.6]常住居民II

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

    回帖奖励 +2 金币

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

    本版积分规则

    热门推荐

    读取传感器的16进制问题
    读取传感器的16进制问题
    这是我的代码,求助怎样写才能分别获得通道1、2的TDS值和温度值,求助!!! [mw_shl_
    RPG游戏 无人世界
    RPG游戏 无人世界
    操作:方向键移动,a键确认 b键打开符文菜单 游戏流程大约半小时 视频攻略:ht
    开贴讲讲NRF24L01P,让你彻底搞懂它的工作原理,持续更...
    开贴讲讲NRF24L01P,让你
    *****************************************
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    一开始测试时手头上只有论坛给的一块mega以及自己的一块仿制UNO,结果是nRF24L无法
    【原创】 drawbot平面关节scara机械臂写字机 画画机器人直播...
    【原创】 drawbot平面关节
    这个项目上个月就在做了,结构和代码反反复复改了多次,加上自己又太忙,一直没来得及
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表