热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

联阳IT976EGPIO读取温度传感器CT1720

#defineCT1720_GOIO18voidCT1720Init(void){ithGpioSetMode(CT1720_GOIO,ITH_GPIO_MODE0);设置GPI

#define CT1720_GOIO  18

void CT1720Init(void)
{
    ithGpioSetMode(CT1720_GOIO, ITH_GPIO_MODE0);  //设置GPIO模式
    ithGpioSet(CT1720_GOIO);   //GPIO置高
    ithDelay(10);   //延时10us
    printf("********************CT1720Init\n");
}

void CT1720_Start(void)
{
    ithGpioSetOut(CT1720_GOIO);  //设置GPIO为输出模式
    ithGpioClear(CT1720_GOIO);   //电平置低
    ithDelay(500);
    ithGpioSet(CT1720_GOIO);    //电平置高,产生一个上升沿
    usleep(50000);    //睡眠延时50ms
}

unsigned char  CT1720_Read_Bit(void)  //从CT1720读一个bit的数据
{
    unsigned int bit_val = 0;
    ithGpioSetOut(CT1720_GOIO);
    ithGpioClear(CT1720_GOIO);
    ithDelay(1);
    ithGpioSetIn(CT1720_GOIO);//IT976E 的GPIO设置为输入模式时,默认设置为高电平
    ithDelay(20);
    bit_val = ithGpioGet(CT1720_GOIO);  //获取GPIO电平状态
//    printf("**********CT1720_Read_Bit:1 bit_val = %x\n",bit_val);
    if (bit_val & (1 <<18))   //1<<18是因为GPIO的引脚号为18&#xff0c;与ithGpioGet的返回值相关。
    {
        bit_val &#61; 1;
    }
    else
    {
        bit_val &#61; 0;
    }
    ithGpioSetIn(CT1720_GOIO);//GPIO设置为输入时&#xff0c;默认拉高电平
    ithDelay(30);
    //printf("**********CT1720_Read_Bit:2 bit_val &#61; %x\n", bit_val);
    return (bit_val&0x01);
}

unsigned char  CH1720_Read_Byte(void)//从CT1720读取一个字节的数据
{
    unsigned char Byte_val &#61; 0;
    for (int i &#61; 0; i <8; i&#43;&#43;)
    {
        Byte_val <<&#61; 1;
        Byte_val |&#61; CT1720_Read_Bit();
    }
//    printf("**********CH1720_Read_Byte: Byte_val &#61; %x\n", Byte_val);
    return Byte_val;
}

/*单次读取一次温度*/
float CH1720_Read_Temperature_Degree(void)
{
    float Temp_Val;
    int Temp &#61; 0;
    char Temp_Byte0 &#61; 0;
    char Temp_Byte1 &#61; 0;
    unsigned char Bit_CC0 &#61; 0;
    unsigned char Bit_CC1 &#61; 0;
    unsigned char Bit_Sign &#61; 0;

    CT1720_Start();
    Bit_CC0 &#61; CT1720_Read_Bit();
    ithDelay(10);
    Bit_CC1 &#61; CT1720_Read_Bit();
    ithDelay(10);

//    printf("**********CH1720_Read_Temperature_Degree:Bit_CC0&#61; %d,Bit_CC1&#61; %d\n", Bit_CC0, Bit_CC1);
    
    if (Bit_CC0 &#61;&#61; 0 && Bit_CC1 &#61;&#61; 0) //判断数据是否有效
    {
        Bit_Sign &#61; CT1720_Read_Bit();
        Temp_Byte0 &#61; CH1720_Read_Byte();
        ithDelay(10);
        Temp_Byte1 &#61; CH1720_Read_Byte();
        ithDelay(10);
        Temp &#61; (Temp_Byte0 <<5) &#43; (Temp_Byte1 >> 3);
    //    printf("************* 1: Temp &#61; %x\n",Temp);
        if (Bit_Sign &#61;&#61; 0x01)
        {
            Temp &#61; ~Temp;
            Temp &&#61; 0xFFFF;
            Temp&#43;&#43;;
            Temp_Val &#61; -3.125 *Temp / 100.00;
        }
        else
        {
            Temp_Val &#61; 3.125 *Temp / 100.00;
        }
        /*过滤无效数据*/
        if (Temp_Val > 40.00 || Temp_Val <-35.00) //如果测得的温度高于零上40度或低于零下35度&#xff0c;则认为是无效数据
        {
            Temp_Val &#61; 255.00;  //无效数据此处默认为255.00
        }

    }
    else 
    {
        Temp_Val &#61; 255.00; //无效数据此处默认为255.00
    }
//    printf("************CH1720_Read_Temperature_Degree:Temp_Val &#61; %f\n", Temp_Val);
    return Temp_Val;
}

/*多次读取温度&#xff0c;取温度的平均值*/
float CH1720_Mul_Read_Temperature_Degree(unsigned int times)
{
    float temp;
    float temp_val &#61; 0;
    int re_times &#61; 0;
    for (int i &#61; 0; i     {
        usleep(1000000);
        temp &#61; 0;
        temp &#61; CH1720_Read_Temperature_Degree();
        if (temp >&#61; 255.00)
        {
            i--;
            re_times&#43;&#43;;
            if (re_times > 3)
            {
                temp_val &#61; 255.00;
                return temp_val;
            }
        }
        else
        {
            temp_val &#43;&#61; temp;
        }
    }
    temp_val /&#61; times;
    return temp_val;
}
volatile float Temperature_value;//记录当前测量的温度
volatile float Temperature_max;//记录当天测量的最高温&#xff0c;用于每日最高温度提示
volatile float Temperature_min;//记录当天测量的最低温&#xff0c;用于每日最低温度提示
volatile float Temperature_max_pertime;//记录过去SECOND_PER_TIME时间内的最高温度&#xff0c;用于温度曲线显示
volatile float Temperature_min_pertime;//记录过去SECOND_PER_TIME时间内的最低温度&#xff0c;用于温度曲线显示
volatile float Temperature_max_mqttpertime;//记录mqtt每次上报服务器的最高温,即过去5分钟时间内的最高温度
volatile float Temperature_min_mqttpertime;//记录mqtt每次上报服务器的最低温&#xff0c;即过去5分钟时间内的最低温度

void* Temperature_Task(void* arg)
{
    float temp_val;
    float temp_prev &#61; 0;
    int temp_i &#61; 0;
    int temp_prev_i &#61; 0;
    Command cmd;
    cmd.id &#61; CMD_SHOW_TEMP;
    temp_val &#61; 255.00;
    Temperature_max &#61; -255.00;
    Temperature_min &#61; 255.00;
    Temperature_max_pertime &#61; -255.00;
    Temperature_min_pertime &#61; 255.00;
    Temperature_max_mqttpertime &#61; -255.00;
    Temperature_min_mqttpertime &#61; 255.00;
    printf("\n Temperature_Task\n");
    while (1)
    {
        temp_val &#61; CH1720_Mul_Read_Temperature_Degree(3);
        if (temp_val >&#61; 255.00)//读取数据错误&#xff0c;重新读取
        {
            continue;
        }
        Temperature_value &#61; temp_val;
        if (temp_val > Temperature_max)
        {
            Temperature_max &#61; temp_val;
        }
        if (temp_val         {
            Temperature_min &#61; temp_val;
        }
        if (temp_val > Temperature_max_pertime)
        {
            Temperature_max_pertime &#61; temp_val;
        }
        if (temp_val         {
            Temperature_min_pertime &#61; temp_val;
        }

        if (temp_val > Temperature_max_mqttpertime)
        {
            Temperature_max_mqttpertime &#61; temp_val;
        }
        if (temp_val         {
            Temperature_min_mqttpertime &#61; temp_val;
        }
        
        temp_i &#61; temp_val*10;
        temp_prev_i &#61; temp_prev*10;
        //if (temp_val !&#61; temp_prev)
        if (temp_i !&#61; temp_prev_i)//这次读取的数据跟上次的不一样
        {
            cmd.temp &#61; temp_val;
            temp_prev &#61; temp_val;
            mq_send(commandQueue, (const char *)&cmd, sizeof(Command), 0);//通知主线程&#xff0c;温度发生改变
        }
    //    printf("Temperature_Task:temp_val &#61; %f\n", temp_val);
    }
}

void CreateTemperatureTask(void)
{
    static pthread_t TempTask;
    CT1720Init();
    pthread_create(&TempTask, NULL, Temperature_Task, NULL);
    sleep(2);//开机2秒后&#xff0c;开始温度测量
}

 


推荐阅读
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 开发笔记:实现1353表达式中的括号匹配(栈的应用) ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 线程能否先以安全方式获取对象,再进行非安全发布? ... [详细]
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • Codeforces 605C:Freelancer's Dreams —— 凸包算法解析与题解分析 ... [详细]
author-avatar
风情万种791008
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有