【luckfox】3、计算重量差

前言

本章结合之前的hx711驱动,实现读取质量,记录时间及剩余质量并存入csv文件,计算质量差并总计。

代码

luckfox-pico\project\app\test_app\hx711\hx711_app_addtime.c

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
// #include <linux/delay.h>
#include <sys/time.h>
#include <string.h>
#include <time.h>#define IIO_DEVICE "/sys/bus/iio/devices/iio:device0"
#define SENSOR_CALI_PATH_OFFSET "/root/hx711_cal_offset"
#define SENSOR_CALI_PATH_SCALE "/root/hx711_cal_scale"static int cal_offset = 8500000;    // save raw value without test itemsstatic int cal_scale = 475;         // when set phone, 1g is 475
static int cal_weight = 187;  // the weight of phone// static float weight = 0;
static int weight = 0;//--------------- hx711 value process ---------------
#define LIST_NUM_MAX 64
#define CSV_PATH "/root/hx711.csv"int v1,v2;
int flag_change;struct weight_data{int weight;time_t time;
};struct weight_data list[LIST_NUM_MAX];
int current_list_num=0;int drink_water=0;//--------------- hx711 value process ---------------// float convert_to_weight(int sensor_data) {
int convert_to_weight(int sensor_data) {int weight;// weight = (float)(sensor_data - cal_offset) / cal_scale;// printf("\nsensor_raw=%d,cal_offset=%d,cal_scale=%d\n",sensor_data,cal_offset,cal_scale);if(cal_scale != 0)weight = (sensor_data - cal_offset) / cal_scale;elseweight = 0;// printf("Sensor data: %.1f\n", weight);// printf("Sensor data: %d\n", weight);return weight;
}int get_hx711_raw(){int fd;char buf[64];ssize_t num_read;fd = open(IIO_DEVICE "/in_voltage0_raw", O_RDONLY);if (fd < 0) {perror("Failed to open iio device");return 1;}num_read = read(fd, buf, sizeof(buf) - 1);if (num_read < 0) {perror("Failed to read sensor data");close(fd);return 1;}close(fd);buf[num_read] = '\0';int sensor_data = atoi(buf);// printf("  raw sensor_data=%d\n",sensor_data);return sensor_data;
}// float get_hx711_value(){
int get_hx711_value(){int sensor_data = get_hx711_raw();weight = convert_to_weight(sensor_data);return weight;
}// save scale&offset to file 
void set_cal_value(){int fd;char tmp_char[64];fd = open(SENSOR_CALI_PATH_OFFSET, O_CREAT|O_RDWR ,0777);if (fd < 0) {perror("Failed to open cal offset.");return;}// printf("-------\ncal_offset=%d\n",cal_offset);memset(tmp_char,0,sizeof(tmp_char));sprintf(tmp_char,"%d\0",cal_offset);// printf("xxx tmp_char=[%s]\n",tmp_char);write(fd, tmp_char, sizeof(tmp_char));close(fd);fd = open(SENSOR_CALI_PATH_SCALE, O_CREAT|O_RDWR ,0777);if (fd < 0) {perror("Failed to open cal offset.");return;}// printf("cal_scale=%d\n",cal_scale);memset(tmp_char,0,sizeof(tmp_char));sprintf(tmp_char,"%d\0",cal_scale) ;// printf("xxx tmp_char=[%s]\n-------\n",tmp_char);write(fd, tmp_char, sizeof(tmp_char)-1);close(fd);
}void print_cal_value_and_raw(int sensor_raw_tmp){printf("cal&raw:\n");printf("   cal_offset=%d sensor_raw=%d\n", cal_offset, sensor_raw_tmp);printf("   test_offset\t%d\n   cal_weight\t%d\n   cal_scale\t%d\n",sensor_raw_tmp - cal_offset, cal_weight, cal_scale);printf("\n");
}void print_cal_value(){printf("hx711 calibration value\n");printf("   cal_offset\t%d\n   cal_weight\t%d\n   cal_scale\t%d\n",cal_offset, cal_weight, cal_scale);printf("\n");
}void sns_calibration(){int cal_test_num = 10;int cal_average = 0;int cal_test_tmp = 0;int cal_scale_raw = 0;// test 10 times to get offset averagefor(int i=0; i<cal_test_num; i++){cal_test_tmp = get_hx711_raw();usleep(10);cal_average = (cal_average * i + cal_test_tmp)/(i+1);}cal_offset=cal_average;usleep(20);printf("!!! Please put test items on the board whose weight same with cmd3\nWaiting input char to continue ...\n");getchar();cal_test_tmp = get_hx711_raw();cal_scale_raw = cal_test_tmp - cal_offset;cal_scale = (cal_scale_raw)/cal_weight;print_cal_value_and_raw(cal_test_tmp);set_cal_value();
}void get_cal_value(){int tmp_offset;int tmp_scale;char tmp_file_value[64];int fd;// printf("get_cal_value\n");fd = open(SENSOR_CALI_PATH_OFFSET, O_RDWR,0777);if (fd < 0) {perror("Failed to open cal offset.");return;}read(fd, tmp_file_value, sizeof(tmp_file_value) - 1);// printf("tmp_file_value=%s\n",tmp_file_value);tmp_offset = atoi(tmp_file_value);// printf("tmp_offset=%d\n",tmp_offset);close(fd);fd = open(SENSOR_CALI_PATH_SCALE, O_RDWR,0777);if (fd < 0) {perror("Failed to open cal offset.");return;}memset(tmp_file_value,0,sizeof(tmp_file_value));read(fd, tmp_file_value, sizeof(tmp_file_value) - 1);tmp_scale = atoi(tmp_file_value);// printf("tmp_offset=%d\n",tmp_scale);close(fd);cal_offset = tmp_offset;cal_scale = tmp_scale;
}#define LEN_MAX 30void save_to_csv(struct weight_data value)
{char tmp_c[LEN_MAX];char * tmp;FILE *fp = fopen(CSV_PATH, "a+");if (fp == NULL) {fprintf(stderr, "fopen() failed.\n");exit(EXIT_FAILURE);}struct tm *tm_t;tm_t = localtime(&value.time);strftime(tmp_c,LEN_MAX,"%F %T",tm_t);printf("time:%s\t",tmp_c);fprintf(fp, tmp_c);fprintf(fp, " | ");memset(tmp_c,0,LEN_MAX);sprintf(tmp_c, "%d", value.weight);printf("weight:%s\n",tmp_c);fprintf(fp, tmp_c);fprintf(fp, "\n");fclose(fp);
}int value_changed(int value1, int value2)
{if(value1 != value2){flag_change = 1;// printf("change value v1=%d  v2=%d\n",value1,value2);}else{if(flag_change == 1 && value1 != 0){// save value// printf("change value %d\n",value1);list[current_list_num].weight = value1;// printf("change value %d\n",list[current_list_num].weight);// save timetime_t tnow = time(0);// printf("当前时间为:%ld\r\n",tnow);list[current_list_num].time = tnow;if(list[current_list_num].weight < list[current_list_num-1].weight){drink_water = drink_water + list[current_list_num-1].weight - list[current_list_num].weight;printf("== drink %dmL\n",drink_water);}// save value to filesave_to_csv(list[current_list_num]);current_list_num++;flag_change = 0;}}return flag_change;
}int get_value()
{int value = 0;// get valuevalue = get_hx711_value();// save value to v1&v2v1 = v2;v2 = value;// judgevalue_changed(v1,v2);return value;
}int main(int argc, char *argv[]) {char cmd1[16];char cmd2[16];char cmd3[16];int ret;int val_tmp=0;// calibration: put the items whose weight is known. weight sends to cmd3// ./hx771_app -c 187if(argc == 3){strcpy(cmd2,argv[1]);strcpy(cmd3,argv[2]);printf("cmd2=%s cmd3=%s\n",cmd2,cmd3);if(strcmp(cmd2, "-c") == 0){printf("get cal cal_weight %s\n",cmd3);cal_weight=atoi(cmd3);        // save the weight of cal items} else {printf("hx711 no cal_weight\n");return 0;}sns_calibration();sleep(1);// test the calibration resultval_tmp = get_hx711_value();printf("sensor value: %d\n", val_tmp);return 0;}printf("-------------test-------------\n");get_cal_value();print_cal_value();int sensor_data;while(1){// val_tmp = get_hx711_value();val_tmp = get_value();// if(val_tmp != 0)//     printf("%02d: %d\n",50 - test_num,val_tmp);sleep(1);}printf("--------------------------\n");return 0;
}

编译

luckfox-pico\project\app\test_app\hx711\build.sh

export PATH=/home/youkai/0_pro/luckfox/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin:$PATH
source ~/.bashrc  
cd ~/0_pro/luckfox/luckfox-pico/project/app/test_app/hx711
arm-rockchip830-linux-uclibcgnueabihf-gcc hx711_app_addtime.c -o hx711_app_addtime

运行

运行bat可以进行快速测试,放在windows本地

time_get_hx711.bat

scp youkai@192.168.206.130:/home/youkai/0_pro/luckfox/luckfox-pico/project/app/test_app/hx711/hx711_app_addtime .adb push hx711_app_addtime /root/
adb shell "chmod 777 /root/hx711_app_addtime"
adb shell "./root/hx711_app_addtime"

结果

代码实现了测试重量,并计算出喝水的毫升数。
在这里插入图片描述

读取保存的时间和重量。

# cat hx711.csv
2023-11-15 19:42:55 | 68
2023-11-15 19:43:07 | 194
2023-11-15 19:43:14 | 3
2023-11-15 19:43:27 | 68
2023-11-15 19:43:38 | 10

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文心一言 VS 讯飞星火 VS chatgpt (136)-- 算法导论11.3 2题

二、用go语言&#xff0c;假设将一个长度为r的字符串散列到m 个槽中&#xff0c;并将其视为一个以 128 为基数的数&#xff0c;要求应用除法散列法。我们可以很容易地把数 m 表示为一个 32 位的机器字&#xff0c;但对长度为r的字符串&#xff0c;由于它被当做以 128 为基数的数…

基于JavaWeb+SSM+微信小程序基金优选系统的设计和实现

基于JavaWebSSM微信小程序基金优选系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 基金优选是金融机构的核心&#xff0c;是必不可少的一个部分。在金融机构的整个服务行业中…

使用requests解决请求库Session对象设置超时的问题

在使用 Python 中的 requests 库时&#xff0c;有一个常见的问题是关于 Session 对象设置超时的功能。默认情况下&#xff0c;requests 的 Session 对象没有提供一个全局设置超时的属性&#xff0c;而是需要在每个请求中单独设置超时时间&#xff0c;或者创建一个自定义的子类来…

【PTQ】Cross-Layer Equalization跨层均衡-证明和实践详细解读

Cross-Layer Equalization跨层均衡 aimet解读 符合规则的模型结构 统一要求&#xff1a;单数据流&#xff0c;中间激活不流向其他地方概念说明&#xff1a; Conv: gruoups1的普通卷积&#xff0c;包括TransposedConv和ConvDepthwiseConv: 深度可分离卷积&#xff0c;groupsi…

AIGC实战——变分自编码器(Variational Autoencoder, VAE)

AIGC实战——变分自编码器 0. 前言1. 变分自编码器1.1 基本原理1.2 编码器 2. 构建VAE编码器2.1 Sampling 层2.2 编码器2.3 损失函数2.4 训练变分自编码器 3. 变分自编码器分析小结系列链接 0. 前言 我们已经学习了如何实现自编码器&#xff0c;并了解了自编码器无法在潜空间中…

<C++> 反向迭代器

我们知道正向迭代器的设计&#xff1a;begin迭代器指向第一个数据&#xff0c;end迭代器指向最后一个数据的下一个位置 。移向下一个数据&#xff0c;解引用得到数据的值&#xff0c;并根据容器储存方式的不同&#xff0c;容器有不同类型的迭代器。 注意&#xff1a;rbegin迭代…

SecureCRT 9.4.2最新终端SSH工具

SecureCRT是一款终端SSH工具&#xff0c;它提供了类似于Telnet和SSH等协议的远程访问功能。SecureCRT软件特色包括&#xff1a; 支持SSH&#xff08;SSH1和SSH2&#xff09;的终端仿真程序&#xff0c;能在Windows下登录UNIX或Linux服务器主机。SecureCRT支持SSH&#xff0c;同…

媒体行业的3D建模:在影视中创造特效纹理

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 在本文中&#xff0c;我们将探讨 3D 建模在媒体行业中的作用&#xff0c;特别是它在影视特效创作…

基于STM32的无线通信系统设计与实现

【引言】 随着物联网的迅速发展&#xff0c;无线通信技术逐渐成为现代通信领域的关键技术之一。STM32作为一款广受欢迎的微控制器&#xff0c;具有丰富的外设资源和强大的计算能力&#xff0c;在无线通信系统设计中具有广泛的应用。本文将介绍如何基于STM32实现一个简单的无线通…

站群服务器 CentOS 搭建socks5多IP代理服务器详细教程,12个步骤教会你!

准备工作 首先要保证服务上能正常使用wget tar make vim&#xff0c;如果正常就直接进入【第一步】 #安装wget的命令 yum install wget#安装tar解压工具 yum install -y tar#安装make的命令 yum groupinstall "Development Tools"#安装vim的命令 yum install…

《洛谷深入浅出进阶篇》P3397 地毯————二维差分

上链接&#xff1a;P3397 地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3397 上题干&#xff1a; 题目描述 在 nn 的格子上有 m 个地毯。 给出这些地毯的信息&#xff0c;问每个点被多少个地毯覆盖。 输入格式 第一行&#xff0c;两个…

浅尝:iOS的CoreGraphics和Flutter的Canvas

iOS的CoreGraphic 基本就是创建一个自定义的UIView&#xff0c;然后重写drawRect方法&#xff0c;在此方法里使用UIGraphicsGetCurrentContext()来绘制目标图形和样式 #import <UIKit/UIKit.h>interface MyGraphicView : UIView endimplementation MyGraphicView// Onl…

桌面云架构讲解(VDI、IDV、VOI/TCI、RDS)

目录 云桌面架构 VDI 虚拟桌面基础架构 IDV 智能桌面虚拟化 VOI/TCI VOI 虚拟系统架构 TCI 透明计算机架构 RDS 远程桌面服务 不同厂商云桌面架构 桌面传输协议 什么是云桌面 桌面云是虚拟化技术成熟后发展起来的一种应用&#xff0c;桌面云通常也称为云桌面、VDI等 …

Flink(五)【DataStream 转换算子(上)】

前言 这节注定是一个大的章节&#xff0c;我预估一下得两三天&#xff0c;涉及到的一些东西不懂就重新学&#xff0c;比如 Lambda 表达式&#xff0c;我只知道 Scala 中很方便&#xff0c;但在 Java 中有点发怵了&#xff1b;一个接口能不能 new 来构造对象? 答案是可以的&…

代码随想录 Day47 动态规划15 LeetCode T583 两个字符串的删除操作 T72 编辑距离

LeetCode T583 两个字符串的删除操作 题目链接:583. 两个字符串的删除操作 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 本题有两个思路 1.使用两个字符串的长度之和-2*最长公共子串(换汤不换药) 代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交…

跨国企业如何选择安全靠谱的跨国传输文件软件?

随着全球化的不断发展&#xff0c;跨国企业之间的合作变得越来越频繁。而在这种合作中&#xff0c;如何安全、可靠地将文件传输给合作伙伴或客户&#xff0c;成为了跨国企业必须面对的问题。 然而&#xff0c;跨国文件传输并不是一件容易的事情&#xff0c;由于网络物理条件的…

OpenCV入门4——实现图形的绘制

文章目录 OpenCV绘制直线OpenCV绘制矩形和圆画矩形画圆 OpenCV椭圆的绘制OpenCV绘制多边形OpenCV绘制文本实现鼠标绘制基本图形 OpenCV绘制直线 # -*- coding: utf-8 -*- import cv2 import numpy as npimg np.zeros((480, 640, 3), np.uint8) # 坐标点为(x, y) cv2.line(img,…

《视觉SLAM十四讲》-- 后端 1(下)

8.2 BA 与图优化 Bundle Adjustment 是指从视觉图像中提炼出最优的 3D 模型和相机参数&#xff08;内参和外参&#xff09;。 8.2.1 相机模型和 BA 代价函数 我们从一个世界坐标系中的点 p \boldsymbol{p} p 出发&#xff0c;把相机的内外参数和畸变都考虑进来&#xff0c;…

C语言从入门到精通之【char类型】

char类型用于储存字符&#xff08;如&#xff0c;字母或标点符号&#xff09;&#xff0c;但是从技术层面看&#xff0c;char是整数类型。因为char类型实际上储存的是整数而不是字符。计算机使用数字编码来处理字符&#xff0c;即用特定的整数表示特定的字符。 char类型占1个字…

wx.canvasToTempFilePath生成图片保存到相册

微信小程序保存当前画布指定区域的内容导出生成指定大小的图片&#xff0c;记录一下 api&#xff1a;wx.canvasToTempFilePath 效果&#xff1a; 代码&#xff1a;wxml <canvas style"width: {{screenWidth}}px; height: {{canvasHeight}}px;" canvas-id"my…