关于TM611AWLCOR连续液位检测传感器的使用明细

news2024/11/24 4:26:28

1. 前言

        本文只做软件协议相关的使用说明,对于硬件设计相关不做讨论。

        本使用明细中涉及到的所有文档均来自诺泰官方技术支持并征得同意进行技术公开交流。其中涉及的代码均由我本人编写,仅供交流学习。

2. 数据手册

        经由淘宝“青岛诺泰微电子有限公司”店铺客服获得资料,其中包含

        1). 51设置板hex烧录文件和EEPROM二进制文件

        2). STC软件、桌面端控制软件

        3). 《1》通用水位设置板说明V2.5(支持USB).pdf、《3》如何使用通用液位设置板固定液位阈值V2.5(支持USB).pdf、《4》打印数据说明V2.5(支持USB).pdf

        以上文件如需请自行前往上述淘宝店铺进行询问下载。

        在诺泰微电子官网(https://www.nutechchip.cn/)找到芯片的数据手册(https://www.nutechchip.cn/product/showproduct.php?id=123),其下载链接(https://www.nutechchip.cn/upload/file/TM611AWL4P_chspec_V00.pdf)

        在数据手册中了解到,本芯片使用IIC总线进行数据通信,芯片地址固定为0x40

  

        其中本芯片一共有四个寄存器WL、REG1、REG2、REG3

        此外本芯片有着较宽的电压输入范围

        上述数据手册仅仅只介绍了芯片的基础用法,并没有对如何配置空液位、低液位、满液位信息进行更新,而是指出需要使用官方标配的“设置板”进行配置,这无疑增加了设备的复杂程度,对环境的适配程度也会降低,于是我开始寻找关于上述三个阈值设置的方式,最终通过诺泰淘宝客服添加技术人员的微信,技术人员得知我的需求后,给出了一份“连续和八点液位通信说明.docx”的相关文档,并征得同意后允许公开交流学习

        获得上述详细的协议交接过程后,便可以开始正式的代码编写了

3. 协议代码

        本次使用VSCode和ESP32作为测试平台进行代码编写,可参考协议流程

        0). 基础宏定义

#define TM611ARR 0x40

#define TM611_REG1 0x01
#define TM611_REG2 0x02
#define TM611_REG3 0x03

#define ACCESS1 0x01
#define ACCESS2 0x02
#define ACCESS3 0x03
#define ACCESS4 0x04

        1). 基础IIC交互函数代码

// 类构造函数
TM611AWLCOR::TM611AWLCOR(unsigned char addres){
    // 保存初始化地址
    this->addres =  addres;
};

// 初始化
void TM611AWLCOR::begin(){
    // 使用硬件iic
    Wire.begin();
}

// 呼叫AT24C02
void TM611AWLCOR::wait(){
    int resault = 0;
        do{
            Wire.beginTransmission(addres);
            resault = Wire.endTransmission();
        } while (resault != 0);
}

// 在指定地址写入一位数据
void TM611AWLCOR::write_byte(unsigned char addr,unsigned char dat){
    TM611AWLCOR::wait();
    Wire.beginTransmission(addres);
    Wire.write(addr);  /*发送写地址*/
    Wire.write(dat);  /*写数据*/
    Wire.endTransmission();
}

// 在指定地址读取一位数据
unsigned char TM611AWLCOR::read_byte(unsigned char addr){
    int ret = 0xff;
    TM611AWLCOR::wait();
    Wire.beginTransmission(addres);
    Wire.write(addr);  /*发送要读的地址*/
    Wire.endTransmission();   
    /*读数据*/
    Wire.requestFrom((int)addres,1);
    ret = Wire.read();
    return ret;
}

        2). 获取液面位置信息函数

// 读取液面数值
unsigned char TM611AWLCOR::readLiquid(){
    return read_byte(0x00);
}

        3). 协议握手函数

// 协议握手
unsigned char TM611AWLCOR::handshake(unsigned char dat){
  unsigned char reg1;
  unsigned int num=0;
  while(reg1!=dat){
    Wire.requestFrom((int)0x40,1);
    reg1 = Wire.read();
    num++;
    if(num>1000)return 0; // 握手失败
  }
  return 1;               // 握手成功
}

        4). 设置空水位阈值函数

// 设置空水位
void TM611AWLCOR::setNullLiquid(){
    // 向REG1寄存器写入0xca
    write_byte(TM611_REG1,0xca);
    // 等待从机发送0xcd握手数据
    handshake(0xcd);
    // 写入操作通道号1
    write_byte(TM611_REG1,ACCESS1+0x30);
    delay(50);
    // 读取REG1(0x01)数据
    Wire.beginTransmission(0x40);
    Wire.write(TM611_REG1);
    Wire.endTransmission();
    handshake(ACCESS1);
    reg2 = read_byte(0x02);
    reg3 = read_byte(0x03);

    // 向REG1(0x01)写入0x8c
    write_byte(TM611_REG1,0x8c);
    // 等待从机发送0xcd握手数据
    handshake(0xcd);
    // 写入操作通道号1
    write_byte(TM611_REG1,ACCESS1+0x30);
    delay(50);
    // 读取REG1(0x01)数据
    Wire.beginTransmission(0x40);
    Wire.write(TM611_REG1);
    Wire.endTransmission();
    handshake(ACCESS1);
}

        5). 设置低水位阈值函数

// 设置低水位
void TM611AWLCOR::setLowLiquid(){
    // 向REG1寄存器写入0xca
    write_byte(TM611_REG1,0xca);
    // 等待从机发送0xcd握手数据
    handshake(0xcd);
    // 写入操作通道号2
    write_byte(TM611_REG1,ACCESS2+0x30);
    delay(50);
    // 读取REG1(0x01)数据
    Wire.beginTransmission(0x40);
    Wire.write(TM611_REG1);
    Wire.endTransmission();
    handshake(ACCESS2);
    reg2 = read_byte(0x02);
    reg3 = read_byte(0x03);
    
    // 向REG1(0x01)写入0x8c
    write_byte(TM611_REG1,0x8c);
    // 等待从机发送0xcd握手数据
    handshake(0xcd);
    // 写入操作通道号2
    write_byte(TM611_REG1,ACCESS2+0x30);
    delay(50);
    // 请求读取REG1(0x01)数据
    Wire.beginTransmission(0x40);
    Wire.write(TM611_REG1);
    Wire.endTransmission();
    handshake(ACCESS2);
}

        6). 设置满水位阈值函数

// 设置满水位
void TM611AWLCOR::setFullLiquid(){
    // 向REG1寄存器写入0xca
    write_byte(TM611_REG1,0xca);
    // 等待从机发送0xcd握手数据
    handshake(0xcd);
    // 写入操作通道号1
    write_byte(TM611_REG1,ACCESS1+0x30);
    delay(50);
    // 读取REG1(0x01)数据
    Wire.beginTransmission(0x40);
    Wire.write(TM611_REG1);
    Wire.endTransmission();
    handshake(ACCESS1);
    reg2 = read_byte(TM611_REG2);
    reg3 = read_byte(TM611_REG3);

    // 向REG1(0x01)写入0x8c
    write_byte(TM611_REG1,0x8c);
    // 等待从机发送0xcd握手数据
    handshake(0xcd);
    // 写入操作通道号1
    write_byte(TM611_REG1,ACCESS3+0x30);
    delay(50);
    // 读取REG1(0x01)数据
    Wire.beginTransmission(0x40);
    Wire.write(TM611_REG1);
    Wire.endTransmission();
    handshake(ACCESS3);
    
    // 向REG1寄存器写入0xca
    write_byte(TM611_REG1,0xca);
    // 等待从机发送0xcd握手数据
    handshake(0xcd);
    // 写入操作通道号2
    write_byte(TM611_REG1,ACCESS2+0x30);
    delay(50);
    // 读取REG1(0x01)数据
    Wire.beginTransmission(0x40);
    Wire.write(TM611_REG1);
    Wire.endTransmission();
    handshake(ACCESS2);
    reg2 = read_byte(TM611_REG2);
    reg3 = read_byte(TM611_REG3);

    // 向REG1(0x01)写入0x8c
    write_byte(TM611_REG1,0x8c);
    // 等待从机发送0xcd握手数据
    handshake(0xcd);
    // 写入操作通道号4
    write_byte(TM611_REG1,ACCESS4+0x30);
    delay(50);
    // 读取REG1(0x01)数据
    Wire.beginTransmission(0x40);
    Wire.write(TM611_REG1);
    Wire.endTransmission();
    handshake(ACCESS4);
}

以上,便可轻松在本设备无需通过设置板而直接通过IIC接口实现三个阈值的设置,减轻外设,方便快捷

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2043898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【添加与搜索单词 - 数据结构设计】python刷题记录

R4-位运算 Trie树BFS处理. class WordDictionary:def __init__(self):self.root{}def addWord(self, word: str) -> None:nodeself.rootfor c in word:if c not in node:node[c]{}nodenode[c]node["#"]{}def search(self, word: str) -> bool:word"#&quo…

MacOS上安装 Java

1.下载 oracle官网jdk下载地址 注意一下区分mac芯片版本,M1芯片选择Arm 64,Intel芯片选择x64 2.安装 傻瓜式安装,下载好后直接双击打开,一直下一步安装即可 3.查看安装路径 可通过以下命令查看安装路径(复制此输出路径,为后续…

Linux下ETCD安装、配置、命令详解

目录 1. 安装 Etcd 通过包管理器安装 从源代码编译安装 2. 配置 Etcd 3. 启动 Etcd 4. 使用 Etcd Etcd 是一个分布式的键值存储系统,主要用于服务发现、配置管理以及共享数据等场景。在 Linux 下安装、配置和使用 Etcd 涉及到几个步骤,下面我将详细…

DevExpress WPF中文教程:如何在GridControl中显示摘要?

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

NLP实验-基于预训练模型的文本分类

使用BERT及其变体实现AclImdb情感分类 前言数据集介绍【Hugging Face】使用方法和如何挑选一个自己需要的模型 基于BERT预训练模型的本文分类数据预处理载入文本标记器将数据转化为模型可以接受的格式训练模型加载模型 基于RoBerta预训练模型的文本分类基于DeBerta预训练模型的…

使用STM32定时器的PWM功能控制电机

目录 概述 1 系统框架结构 1.1 框架结构介绍 1.2 STM32 Cube配置PWM参数 2 软件实现 2.1 STM32Cube生成项目 2.2 PWM功能的User函数接口 3 测试 3.1 编写测试函数 3.2 功能测试 概述 本文主要介绍使用STM32定时器TIMER-8功能生成4路PWM,用于控制两路电机…

五种Slowing Changing Dimensions(SCD)方法及案例

SCD Type Description Key Features Type 1 Overwriting the existing data with new data, without keeping any history of the previous values. 直接覆盖,不留痕迹 - Overwrites Existing Data - No Historical Data - Simple Implementation Type…

Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程

Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程 在现代的微服务架构中,Docker Compose 是管理多容器应用的重要工具,它允许我们通过一个简单的 docker-compose.yml 文件来定义和运行多个关联的容器。然…

重发布实验

一、实验拓扑图 二、实验需求 1.如图搭建网络拓扑,所有路由器各自创建一个环回接口,合理规划IP地址 2.R1-R2-R3-R4-R6之间使用OSPF协议,R4-R5-R6之间使用RIP协议 3.R1环回重发布方式引入OSPF网络 4.R4/R6上进行双点双向重发布 5.分析网络…

CSP-CCF 202012-1 期末预测之安全指数

一、问题描述 二、解答 #include<iostream> using namespace std; int main() {int n;cin >> n;int w[100001] { 0 };int score[100001] { 0 };for (int i 1; i < n; i){cin >> w[i] >> score[i];}int y 0;for (int i 1; i < n; i){y y …

Java——反射(2/4):获取构造器对象并使用(获取类的构造器、并对其进行操作,获取类构造器的作用,代码实例)

目录 获取类的构造器 获取类的构造器、并对其进行操作 代码实例一 代码实例二 获取类构造器的作用 代码示例三 获取类的构造器 获取类的构造器、并对其进行操作 Class提供了从类中获取构造器的方法。 方法说明Constructor<?>[] getConstructors()获取全部构造器…

激光测距传感器

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、产品原理&#xff1a;二、产品介绍&#xff1a;三、应用特点四、应用案例&#xff1a;1.冶金钢铁板卷材开卷工…

深入理解JavaScript性能优化:从基础到高级

引言 在当今快速发展的Web世界中,性能已经成为衡量应用质量的关键指标。随着Web应用复杂度的不断提升,JavaScript作为前端开发的核心语言,其性能优化变得尤为重要。本文旨在全面深入地探讨JavaScript性能优化的各个方面,从基础概念到高级技巧,帮助开发者构建高效、流畅的Web应用…

Android Studio本地加速安装gradle

Android Studio本地加速安装gradle 镜像下载依赖本地JAVA-JDK配置阿里云镜像配置环境变量验证gradle项目文件的介绍项目配置gradle项目Gradle-Wrapper加速配置&#xff0c;防止下载失败Gradle的常用命令 镜像下载 腾讯软件镜像源&#xff1a;https://mirrors.cloud.tencent.co…

50ETF期权移仓是什么?50ETF期权移仓要注意什么?

今天带你了解50ETF期权移仓是什么&#xff1f;50ETF期权移仓要注意什么&#xff1f;当前火热的期权交易市场&#xff0c;“移仓”同样是一门非常重要的技术。上证50ETF期权投资的过程中&#xff0c;我们可以进行一定的移仓操作的&#xff0c;如果移仓操作得好&#xff0c;可以很…

CSP-CCF 202104-1 灰度直方图

一、问题描述 二、解答 思路&#xff1a;用一个二维数组和一个一维数组、以及三个嵌套的for循环即可 代码&#xff1a; #include<iostream> using namespace std; int A[500][500] { 0 }; int main() {int n, m, L;cin >> n >> m >> L;int h[256] …

CocoaPods 官宣进入维护模式,不在积极开发新功能,未来将是 Swift Package Manager 的时代

昨天 CocoaPods 官宣现在项目**处于维护模式 **&#xff0c;简单来说&#xff0c;就是 CocoaPods 不会再像以前一样积极投入资源进行开发&#xff0c;这里的维护模式&#xff0c;就是让项目处于「可用」的状态&#xff0c;而此时距离 CocoaPods 的出现&#xff0c;也过去了有 1…

一套完整的NVR网络硬盘录像机解决方案和NVR程序源码介绍

随着网络技术的发展&#xff0c;视频数据存储的需求激增&#xff0c;促使硬盘录像机&#xff08;DVR&#xff09;逐渐演变为具备网络功能的网络视频录像机&#xff08;NVR&#xff09;。NVR&#xff0c;即网络视频录像机&#xff0c;负责网络视音频信号的接入、存储、转发、解码…

鸿蒙开发入门day05-ArkTs语言(接口与关键字)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;还请三连支持一波哇ヾ(&#xff20;^∇^&#xff20;)ノ&#xff09; 目录 ArkTS语言介绍 接口 接口属性 接口继承 泛型类型和函数 泛型…

Unity(2022.3.38LTS) - 变换组件和约束

目录 一. 变换组件 二. 约束 一. 变换组件 在 Unity 中&#xff0c;变换组件&#xff08;Transform Component&#xff09;是每个游戏对象都必备的组件&#xff0c;用于控制对象在场景中的位置、旋转和缩放。 位置&#xff08;Position&#xff09;&#xff1a; 表示对象在…