• #2020征文开发板#6.WiFi IoT智能家居套件 温度传感器和OLED


    目录:
    1. OLED驱动
    2. 温湿度传感器AHT20驱动
    3. 画表盘
    4. 画指针
    5. 画刻度
    6. 使用上面几个函数,画出我们设计的温度表
    7. I2C管脚的初始化和任务初始化

    这是一份迟来的文章,代码写好几天了,由于太忙,一直没来得及上传。

    在开发板套件中,有一个OLED屏幕扩展板,温湿度传感器扩展板,本次我们就用这两个扩展板来实现一个简易数字温度计。初步的打算是做一个仪表盘,用指针指示温度和湿度,但是由于OLED只有128*64,因此仪表盘不会很清晰,我们在旁边再用数字直接显示一下。虽然简陋一点,但是只要原理学会了,其他复杂的仪表盘我们同样可以做出来。

    OLED屏幕为128*64的点阵,通信接口为I2C0,从机地址为0x3C

    温湿度传感器AHT20,通信接口也是I2C0,从机地址为0x38

    熟悉I2C的朋友都知道,I2C是多从机模式,只要从机地址不同,我们可以挂在同一个总线下,进行复用。

    既然如此,那我们就可以同时使用这两个扩展板。

    1. OLED驱动

    OLED驱动开发方法,参考许思维老师的代码 https://gitee.com/hihopeorg/harmonyos-ssd1306

    此处不再赘述

    2. 温湿度传感器AHT20驱动

    参考许思维老师的代码 https://gitee.com/hihopeorg/harmonyos-aht20

    此处不再赘述。

    3. 画表盘

    由于表盘是半个圆,而且一般是从9点钟方向开始,顺指针旋转,与实际的温度值相对应,9点钟对应最小值,3点钟对应最大值,

    因此我们画表盘的时候最好从9点钟对应的角度为0, 12点钟对应的角度90度,3点钟对应的角度为180度。

    画表盘就是设置好圆心(x,y)和半径r,然后计算圆周上的两个点,将相邻的两个点调用画直线函数连接起来。

    /*DrawArc.画一个半圆
     * start_angle in degree
     * sweep in degree
     * x,y是圆心的位置
     * radius是半径
     * start_angle 起始角度,9点钟作为0角度
     * sweep 扫描角度
     * 从9点钟开始作为0角度,顺时针旋转
     */
    void ssd1306_DrawArc_from9(uint8_t x, uint8_t y, uint8_t radius, uint16_t start_angle, uint16_t sweep, SSD1306_COLOR color) {
        float approx_degree;
        uint32_t approx_segments;
        uint8_t xp1,xp2;
        uint8_t yp1,yp2;
        uint32_t count = 0;
        uint32_t loc_sweep = 0;
        float rad;
    
        loc_sweep = ssd1306_NormalizeTo0_360(sweep);
    
        count = (ssd1306_NormalizeTo0_360(start_angle)); 
        approx_segments = loc_sweep;
        approx_degree = 1;
        while(count < approx_segments)
        {
            rad = ssd1306_DegToRad(count*approx_degree);
            xp1 = x - (int8_t)(cos(rad)*radius);
            yp1 = y - (int8_t)(sin(rad)*radius);
            count++;
            if(count != approx_segments)
            {
                rad = ssd1306_DegToRad(count*approx_degree);
            }
            else
            {
                rad = ssd1306_DegToRad(loc_sweep);
            }
            xp2 = x - (int8_t)(cos(rad)*radius);
            yp2 = y - (int8_t)(sin(rad)*radius);
            ssd1306_DrawLine(xp1,yp1,xp2,yp2,color);
        }
    
        return;
    }
    

    4.画指针

    画指针比较简单,就是在圆周上找一个点,将这个点和圆心连接,就变成了一个指针,改变半径的大小,就可以实现指针的长短。

    难点是如何将指针的角度和实际的温度值对应起来。假设温度的范围为-15摄氏度到45摄氏度,共60摄氏度,则每一个角度对应的温度值为60/180;

    如果当前温度是20度,则对应的角度为20*60/180度。

    /*
    画一条圆心到圆周的直线,实现指针
    */
    void ssd1306_draw_line_of_arc(uint8_t x, uint8_t y, uint8_t radius, uint16_t angle,SSD1306_COLOR color)
    {
        float approx_degree;
        uint8_t xp1;
        uint8_t yp1;
        uint32_t count = 0;
        float rad;
    
        count = (ssd1306_NormalizeTo0_360(angle));
        approx_degree = 1;
        rad = ssd1306_DegToRad(count*approx_degree);
        xp1 = x - (int8_t)(cos(rad)*radius);
        yp1 = y - (int8_t)(sin(rad)*radius);
    
        ssd1306_DrawLine(x, y, xp1, yp1, color);
    }
    

    5. 画刻度

    画刻度的方法,可以参考上面画指针的方法,从同一个角度画出的直线,与两个同圆心不同半径的圆的交点,将这两个交点连接起来就是刻度

    /*
    画一条刻度线
    */
    void ssd1306_draw_line_of_kedu(uint8_t x, uint8_t y, uint8_t radius, uint16_t angle,SSD1306_COLOR color)
    {
        float approx_degree;
        uint8_t xp1,xp2;
        uint8_t yp1,yp2;
        uint32_t count = 0;
        float rad;
    
        count = (ssd1306_NormalizeTo0_360(angle));
        approx_degree = 1;
        rad = ssd1306_DegToRad(count*approx_degree);
        xp1 = x - (int8_t)(cos(rad)*radius);
        yp1 = y - (int8_t)(sin(rad)*radius);
    
        xp2 = x - (int8_t)(cos(rad)*(radius-4));//刻度线的长度为4
        yp2 = y - (int8_t)(sin(rad)*(radius-4));
    
        ssd1306_DrawLine(xp1, yp1, xp2, yp2, color);
    }
    

    查看更多章节

    作者:hcl0317
    想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com/#bky

  • 相关阅读:
    对象参数dojo异步编程之dojo/promise/all模块(dojo/DeferredList替代者)
    文件进程linux系统编程之文件与I/O(五):打开文件的内核结构file和重定向
    代码配置spring scala
    返回行javascript比较时间大小
    项目邮件[置顶] 失业的程序员(十二):潜意识的智商
    地址变形Uva 11401 Triangle Counting
    节点拓扑应用拓扑排序来解决DAG(directed acylic graph)的单源最短路径问题
    TortoiseGit使用入门
    RGMII
    ARM处理器系统初始化编程注意事项
  • 原文地址:https://www.cnblogs.com/HarmonyOS/p/14154789.html
Copyright © 2020-2023  润新知