hehung

  • 2019-05-20
  • 加入了学习《色卡密码锁》,观看 色卡密码锁

  • 2019-05-19
  • 发表了主题帖: 【GD32E231 DIY大赛】4,模拟IIC操作OLED

    模拟IIC相对而言是一种很简单的曹锁IIC的方式,编程简单,而且易于修改操作。所以对于IIC的操作我一般是选用模拟IIC来做的。 OLED的程序是参考的正点原子的OLED显示代码修改了部分的。 支持OLED的字符,文字和图形的显示。 IIC连线:SCL -- PB10               SDA -- PB11 IIC驱动程序: myiic.c #include "myiic.h" #include "systick.h" /*init IIC*/ void IIC_Init(void) {                                                             rcu_periph_clock_enable(RCU_GPIOB);            gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_10|GPIO_PIN_11);         gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10|GPIO_PIN_11);         } /*IIC start signal*/ void IIC_Start(void) {         SET_IIC_SDA();                             SET_IIC_SCL();         CLR_IIC_SDA();//START:when CLK is high,DATA change form high to low         CLR_IIC_SCL();//钳住I2C总线,准备发送或接收数据 }           /*IIC stop signal*/ void IIC_Stop(void) {         SET_IIC_SCL();         CLR_IIC_SDA();//STOP:when CLK is high DATA change form low to high         SET_IIC_SDA();//发送I2C总线结束特急                                                           } /*wait for reponse signal*/ //return :1,failure //         0,sucessful u8 IIC_Wait_Ack(void) { //        u8 ucErrTime=0; //        SDA_IN();      //Set the SDA as input //        SET_IIC_SDA();                   SET_IIC_SCL(); //        while(READ_SDA) //        { //                ucErrTime++; //                if(ucErrTime>250) //                { //                        IIC_Stop(); //                        return 1; //                } //        }         CLR_IIC_SCL();                                           return 0;   } /*ack signal*/ void IIC_Ack(void) {         CLR_IIC_SCL();         SDA_OUT();         CLR_IIC_SDA();         SET_IIC_SCL();         CLR_IIC_SCL(); } //不产生ACK应答                     void IIC_NAck(void) {         CLR_IIC_SCL();         SDA_OUT();         SET_IIC_SDA();         SET_IIC_SCL();         CLR_IIC_SCL(); }                                                                               //IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答                           void IIC_Send_Byte(u8 txd) {                             u8 t;           CLR_IIC_SCL();//拉低时钟开始数据传输     for(t=0;t>7)                         SET_IIC_SDA();                 else                         CLR_IIC_SDA();         txd

  • 2019-05-14
  • 加入了学习《黑科技探头:碰一下就知电流大小(英文,国外网友评测)》,观看 黑科技探头:碰一下就知电流大小(英文,国外网友评测)

  • 2019-05-12
  • 加入了学习《DIY作品演示》,观看 基于MQTT消息通讯的IoT入门实例

  • 回复了主题帖: GD32E231 DIY大赛(4)——如何获得长短按键?

    hujj 发表于 2019-5-11 13:14 谢谢您的提示!3楼的坛友也是这样建议的。我开始也准备试试,但没有找到合适的参考代码,再说轮询方式虽 ...
    我写了一个由定时器的长短按的判断的程序,你可以看看:http://www.lewatoys.com/hwbcwgw/thread-1076729-1-1.html

  • 发表了主题帖: 【GD32E231 DIY大赛】3,定时器+按键(支持长按和短按)+LED

    今天又弄了一个LED的程序,同时做了一个按键的程序。 这块板子只有一个按键,确实有点少了,对于这种情况,除了增加外设按键之外开可以通过判断该按钮的时长来执行不同的功能。 我使用定时器2做了一个简单的分时的任务系统,分了2ms,50ms,500ms和1s这几个时间段,可以将所有的功能都放在这几个时间段里面,2ms的任务每次都会执行,但是其他的任务(50ms,500ms,1s)不会重复执行,会错开,这样可以避免同一时间段执行大量的程序,造成精度的缺失。 现在来讲一讲我的思路: 首先是定时器: 初始化定时器(timer.c): void Timer2_Init(void) {     timer_parameter_struct timer_initpara;     rcu_periph_clock_enable(RCU_TIMER2);     timer_deinit(TIMER2);         /*        prescaler(预分频器值):72M/(719+1)=100KHz         period(周期值):(199+1)/100,000=2ms                */     /* TIMER configuration */     timer_initpara.prescaler         = 719;     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;     timer_initpara.counterdirection  = TIMER_COUNTER_UP;     timer_initpara.period            = 199;                                        //2ms     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;     timer_initpara.repetitioncounter = 0;     timer_init(TIMER2,&timer_initpara);         timer_interrupt_enable(TIMER2, TIMER_INT_UP);        /*Enable TIMER2*/         nvic_irq_enable(TIMER2_IRQn, 0);                                //Set priority to 0(0-2)     /* auto-reload preload enable */     timer_auto_reload_shadow_enable(TIMER2);     /* auto-reload preload enable */     timer_enable(TIMER2); }复制代码 定时器中断 /*The interrupt handler function of tmer2*/ void TIMER2_IRQHandler(void) {         if(RESET != timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP))         {                 System_Management();         }         timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP); }复制代码 定时中断里面就只有一个System_Management(); System_Management()函数就是task管理的函数(在myOS.c里面),所有的代码都在这里,所以主函数里面只有初始化函数,然后就是死循环。 //系统管理函数 void System_Management(void) {         static __IO uint8_t timer_50ms = 0U;         static __IO uint8_t timer_500ms = 0U;         static __IO uint8_t timer_1000ms = 0U;         static __IO uint8_t timer_10s = 0U;                 system_running_timer++;                 System_Run_2ms();                /*2ms task*/                 timer_50ms++;         /*write if-else to aviod multiple task are running at same time         only running 2ms task and one of 50ms, 500ms and 1s every 2ms.*/         if(timer_50ms >= 25u)         {                 timer_50ms = 0u;                 Systen_Run_50ms();                                 timer_500ms ++;         }else if(timer_500ms >= 10u)         {                 timer_500ms = 0u;                 System_Run_500ms();                                 timer_1000ms ++;         }else if(timer_1000ms >= 2u)         {                 timer_1000ms = 0u;                 System_Run_1000ms();                                 timer_10s ++;         }else         {                 } }复制代码 初始化LED以及4个LED的翻转函数(led.c): void Led_Init(void) {         /* enable the LED GPIO clock */     rcu_periph_clock_enable(RCU_GPIOA);     /* configure LED GPIO port */     gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED1|LED2|LED3|LED4);     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED1|LED2|LED3|LED4);     /* reset LED GPIO pin */     gpio_bit_reset(GPIOA,LED1|LED2|LED3|LED4); } //led1 void led1_spark(void) {         GPIO_TG(GPIOA) = LED1; } //led2 void led2_spark(void) {         GPIO_TG(GPIOA) = LED2; } //led3 void led3_spark(void) {         GPIO_TG(GPIOA) = LED3; } //led4 void led4_spark(void) {         GPIO_TG(GPIOA) = LED4; }复制代码 初始化KEY(key.c): void Key_Init(void) {     rcu_periph_clock_enable(RCU_GPIOA);     rcu_periph_clock_enable(RCU_CFGCMP);     gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, KEY1); }复制代码 开关key的滤波函数(key.c): 滤波时长50ms。 //Get the state of key1 unsigned char Get_Key1_State(void) {         static uint16_t key_state_counter = 0u;                        /*key filter*/         if(KEY_PRESS == GET_KEY1())         {                 key_state_counter ++;                                if(key_state_counter >= DEBOUNCE_TIME)                 {                         return KEY_PRESS;                 }else                 {                         /*Do Nothing*/                 }         }else         {                 key_state_counter = 0u;         }         return KEY_RELEASE;                  }复制代码 开关长按和短按的判断(myOS.c): 通过判断按钮的时间长短来确定是哪个LED闪烁 void Key_Logic(void) {         static uint8_t last_key_state = KEY_RELEASE;         uint8_t current_key_state = KEY_RELEASE;         static uint32_t key1_press_counter = 0u;                        /*Record pressed time of key*/                 current_key_state = Get_Key1_State();         /*last key1 was not pressed and now is pressed*/         if((KEY_RELEASE == last_key_state)                 && (KEY_PRESS == current_key_state))         {                 key1_press_counter = 1u;        /*key is pressed, start record time*/         }         /*last key1 was pressed and now is not pressed, release the key*/         else if(KEY_RELEASE == current_key_state && KEY_PRESS == last_key_state)         {                 /*very long pressed*/                 if(key1_press_counter >= KEY_LONG_LONG_TIME)                 {                                led_i = 1;                 }else if(key1_press_counter >= KEY_LONG_PRESS_TIME)  /*long pressed*/                 {                         led_i = 2;                 }else        /*short pressed*/                 {                         led_i = 3;                 }                 key1_press_counter = 0U;                        /*Clear pressed time counter*/         }else         {                 /*Do Nothing*/         }                 if(key1_press_counter != 0u)         {                 key1_press_counter ++;                                /*Record time*/         }else         {                 /*Do Nothing*/         }                 last_key_state = current_key_state; }复制代码 LED闪烁函数(myOS.c): unsigned char led_i=0; void System_Run_1000ms(void) {         switch(led_i)         {                 case 1:led1_spark();break;                 case 2:led2_spark();break;                 case 3:led3_spark();break;         }        }复制代码 任务管理(myOS.c): LED闪烁在1s任务里,key状态和时长监测在2ms任务里 /*         2ms task */ void System_Run_2ms(void) {         system_running_timer += 2;  /*Record system running time*/         Key_Logic();        /*Key logic*/ } /*         50ms task */ void Systen_Run_50ms(void) {         } /*         500ms task */ void System_Run_500ms(void) {         } /*         1s task */ unsigned char led_i=0; void System_Run_1000ms(void) {         switch(led_i)         {                 case 1:led1_spark();break;                 case 2:led2_spark();break;                 case 3:led3_spark();break;         }        }复制代码 主函数(main.c): int main(void) {     systick_config();                 /*All initialization function*/     Timer2_Init();                /*Init timer2*/     Led_Init();                        /*Init LED pin*/             while(1){                 /*All function is in myOS.c  .                 wrote in timer2.*/     } }复制代码 这是一个简单的测试代码: 功能就是使用按钮按下的时间长短来闪烁LED3,LED2和LED1: 开关按下的时间长短分宜以下三种情况: 大于1秒小于2秒的为长按; 大于2秒的为超长按; 小于一秒的为短按: 短按时LED3闪烁; 长按时LED2闪烁; 超长按时LED1闪烁。 下面是附件,有问题欢迎讨论。

  • 2019-05-11
  • 回复了主题帖: 【GD32E231 DIY大赛】1,收货开箱

    Romanticjlm 发表于 2019-5-11 21:46 你还送了芯片,不错呀
    你们没有吗?看来后发还是有好处的:pleased:

  • 回复了主题帖: 【GD32E231 DIY大赛】1,收货开箱

    wudianjun2001 发表于 2019-5-11 14:45 你还送了数据线不错了,我们数据线都没有
    应该是后发的送了数据线{:1_101:}

  • 回复了主题帖: GD32E231 DIY大赛(4)——如何获得长短按键?

    其实你可以使用定时器来做的。上一次的GD比赛,需要用的按键比较多,我也是使用长短按来区别不同的功能的,我的实现方式就是使用定时器。 定会器没10ms或者1ms检测一次按键状态,然后使用一个static变量counter进行累计,我当时使用的10ms的,短按的时间就是小于1s,长安的时间是大于1s。在按键被松开的时候检测counter的数值大小,如果counter大于100就是长按,小于100就是短按,我感觉这种方式还是比较好的,当然还可以加上40ms的滤波,也是在定时器中可以完成的

  • 发表了主题帖: 【GD32E231 DIY大赛】2,编辑例程

    刚才去比赛官方页面下载了资料:http://www.lewatoys.com/yhylzcs18/huodong/GigaDevice_GD32E231Contest_201903/看到里面有例程,然后就迫不及待的想要试一下。 我使用的是MDK,这个就不用了多说了,玩单片机的人都知道,没有安装软件的小伙伴可以到官网去下载,下载5.25版本及以上的最好,安装,这些都很简单。 之后需要安装这块芯片的pack包,在下载的资料中。双击安装就行了,会自动找到你的MDK的安装路径的。 然后打开例程文件夹,找到了第一个例程:01_GPIO_Running_LED。 打开,编译:44errors。WTF??   打开.h文件包含路径,发现路径全是错的,需要自己手动修改路径,方法有两种,一种是将包含的文件移动到他写的路径中,第二种就是将文件集中,自己手动包含路径,为了以后开发方便,当然是手动配置路径了。 要做的就是将下图中的两个文件夹中的文件拷贝到例程的目录下: 重新导入.c文件 打开工程: 右键单击工程名--》Manage Project Items... 选中group名--》删除错误路径中的文件,就是一些列的.c文件,然后重新导入正确路径下的.c文件,就在刚拷贝到例程的那几个文件夹中。 重新配置.h文件路径: 如下图所示进行导入: 现在编译,链接,已经没有错误和警告了。 然后链接板子和电脑,点击下载按钮: 可以看到MDK IDE的左下角的进度条,代码量很小,进度条走的很快。下载之后可以看到LED1在周期性的闪烁。 大功告成。

  • 发表了主题帖: 【GD32E231 DIY大赛】1,收货开箱

    昨天终于收到了期待已久的板子【GD32E231】。 包括了开发板一块,芯片2个,数据线一根,但是没有排针,这点有点不好,还需要自己排针焊上才行,但是这也不是什么难事。 板卡的资源挺简单的: 2个按键:一个reset,一个wakeup 4个LED 还有一个板载的下载器,下载器的主控也是GD自己的芯片。 现在板子到了,可以开始行动起来了

  • 2019-04-09
  • 回复了主题帖: 兆易创新 GD32E231 DIY 大赛入围名单

    棒{:1_103:}

  • 2019-01-20
  • 发表了主题帖: 【NXP Rapid IoT评测】+ 5. 传感器综合运用

    参考例程的Weather Station做了一个简单的环境检测程序,如下所示: 采用控件的方式来完成的,可以监测温湿度,空气质量,大气压等信息。 显示效果如下所示: 后面在加上蓝牙功能。 此内容由EEWORLD娱乐场官网网友hehung原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了主题帖: 【NXP Rapid IoT评测】+ 4. 简单温湿度监测

    本帖最后由 hehung 于 2019-1-20 11:43 编辑 最近两周事太多了,今天做了一个简单的温湿度的采集程序 过程如下: NXP的在线编程网站太难访问了,幸好还有还有一个Atmosphere Iot这个网站可以访问,而且比较稳定。但是还是有点慢。 http://www.lewatoys.com/ckwbfzb 好了,首先是新建工程: 如下图: 之后是给工程命名: 随便取一个名字,如下,然后选择套件名字: 使用空间创建一个如下所示的程序: 用来读取温湿度信息,并且LED还会跟着1秒闪烁一次。 中间的function空间是需要自己添加程序的,意思就是讲温湿度传感器读取的数据取出来放在显示页面显示出来:代码如下: 温度读取程序: ATMO_Status_t temperature_covert_trigger(ATMO_Value_t *in, ATMO_Value_t *out) {         float temp = 0;         ATMO_GetFloat(in, &temp);         char str[32];         sprintf(str, "%.1f C", temp);         ATMO_CreateValueString(out, str);         return ATMO_Status_Success; } 湿度读取程序: ATMO_Status_t humidity_covert_trigger(ATMO_Value_t *in, ATMO_Value_t *out) {         float temp = 0;         ATMO_GetFloat(in, &temp);         char str[32];         sprintf(str, "%.1f %%rh", temp);         ATMO_CreateValueString(out, str);         return ATMO_Status_Success; } 显示效果如下: 此内容由EEWORLD娱乐场官网网友hehung原创,如需转载或用于商业用途需征得作者同意并注明出处 虽然可以显示出温度和湿度信息,但是在显示温度的界面,温湿度来回切换显示。并且使用触摸屏的时候,切换到下一个页面时候有马上切换回主界面,不知道怎么回事,我与官方的例程对比了,发现都是一样的设置还是这种情况,有大神帮我忙看一下,谢谢。 工程如下: 运行文件 工程配置文件:

  • 2019-01-13
  • 回复了主题帖: 【NXP Rapid IoT评测】+评测下蓝牙功能的同时学习下应用程序的编程方法

    很棒,参考参考{:1_103:}

  • 回复了主题帖: 又发现了一个DK IOT STUDIO 在线IDE跑RAPID IOT 估计都是一个只是布在不同网站

    可以,试一试,官方的网站上不去了,好烦

  • 2019-01-08
  • 回复了主题帖: 【NXP Rapid IoT评测】+ 3. 初探Rapid IoT Studio

    hujj 发表于 2019-1-6 22:46 楼主的动作挺快的,我还没有成功编译出bin文件呢。
    加油{:1_113:}

  • 2019-01-06
  • 发表了主题帖: 【NXP Rapid IoT评测】+ 3. 初探Rapid IoT Studio

    跟着教程一步一步的来,现在开始尝试使用Rapid IoT Studio了有一点不好的就是这个是以网页的形式来操作的,确实有些不方便,如果有离线版的就好了。 好了,正式开始。 首先点击studio开始进行编辑,因为是第一次使用,所以不用新建工程,直接点击example使用官方的例程来用,看看效果就行了 然后,选择一个LED控制的程序,点击打开 可以看到编辑界面了,第一个图标就是一个定时器,可以看到时间间隔是1000ms,可以根据自己的需求进行更改,然后就是控制LED,中间有一个齿轮的图标,这个可以设置控制的对象,例程中控制的翻转红色LED,可以进行更改。 然后就是保存工程和编译工程 先保存在编译,注意:此过程会持续一段时间。 之后点击如下的图标,是写入到单片机中,会生成一个bin文件,浏览器生成以后会自动下载 之后按照下面的操作来完成程序的下载: 显示效果如下图: 此内容由EEWORLD娱乐场官网网友hehung原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了日志: 【NXP Rapid IoT评测】+ 1.app连接rapid Iot

  • 发表了主题帖: 【NXP Rapid IoT评测】+ 2.app连接rapid Iot

    本帖最后由 hehung 于 2019-1-6 12:52 编辑 RAPID IOT的功能真的是很强大,今天看了一下操作手册,重新用NXP radip IOT这款APP试了一下,最开始的时候还是会出现application error,经常崩溃,最后发现是要先打开手机上的蓝牙才可以。 1、打开手机蓝牙; 2、打开app; 3、登录NXP; 4、打开rapid Iot上的蓝牙,如下图: 在主界面上按下下面的触摸按键,再按右边的触摸按键调到设置界面,然后按下下面的触摸按键调到蓝牙设置界面,打开蓝牙功能。 5、按下手机app上面的加号图标: 其实中文操作手册上面讲解的就挺详细的。可以好好看看,按照上面的操作一步一步的来就很简单了。 有一点需要特别注意的就是:     连接上手机蓝牙功能之后不要让Iot套件的显示界面停留在主界面上,不然的话套件会自动重启(不知道这是什么BUG,好像有其他网友提出过这个毛病,经过验证确实是这样的),调到其他界面之后就可以正常的链接,不会重启了。 下图是手机app的显示效果: 从上面可以看到显示了套件检测到的所有传感器信息、 可以通过最下面的小圆圈来控制彩色LED。 现在说一说数据监控功能,按照手册上的操作,如下图: 第一步: 第二步: 点击设置小图标 第三步: 输入一个名字,自己取一个就行 第四步: 选择监控数据表的横坐标,一般的监控对象都是随时间变化的,所以一般选择时间戳,如下图所示: 第五步: 添加纵坐标的监控数据: 我选择了温度,湿度,压力,空气质量四个选项。 最后是显示效果,如下图: 此内容由EEWORLD娱乐场官网网友hehung原创,如需转载或用于商业用途需征得作者同意并注明出处

最近访客

< 1/1 >

统计信息

已有16人来访过

  • 芯币:79
  • 好友:--
  • 主题:10
  • 回复:14
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言