0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32设计的数字电子秤

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-05-18 11:04 次阅读

1. 项目介绍

称重计量是现在社会活动中不可缺少的部分,随着国际交流的发展,称重计量的国际间的统一显得越来越重要。

电子称重技术是现代称重计量和控制系统工程的重要基础之一。近年来,随着现代科技进步,电子称重技术取得了突飞猛进的发展,电子秤在计量领域中也占有越来越重要的地位。尤其是商用电子衡器,以其准确度高、反应灵敏、性能稳定、结构简单、环境适应性强、便于与电子计算机结合而实现称重计量与过程控制自动化等特点,而被广泛用于工商贸易、能源交通、冶金矿山、轻工食品、医药卫生、航空航天等领域。

电子秤的工作原理首先是通过称重传感器采集到被测物体的重量并将其转换成电压信号,输出电压信号通常很小,需要通过前端信号处理电路进行准确的线性放大。放大后的模拟电压信号经A/D转换电路转换成数字量,被送入到主控电路的单片机中,再经过单片机控制OLED显示屏,从而显示出被测物体的重量,在实际应用中为提高数据采集的精度,并尽量减少外界电气干扰还需要在传感器与A/D芯片之间加上信号调理电路。

当前项目是采用采用STM32+称重模块+OLED实现了简单的电子秤项目,称重模块上采用24位的ADC芯片,精度较高。实现了称重,校准、去皮等功能。

硬件介绍:

MCU:STM32F103ZET6,只要是STM32F1X系列本工程代码都通用的。

称重模块: 淘宝购买的称重模块

OLED: SPI接口的0.96寸OLED屏,采用的是中景园电子的OLED屏。

完整工程下载地址: https://download.csdn.net/download/xiaolong1126626497/63993934

视频演示地址: https://live.csdn.net/v/182608

项目运行效果:

poYBAGKEYiWAXNK9AAbRt-lYS4w171.pngpYYBAGKEYiaAfAP4AAg8Jz6QyY0191.pngpoYBAGKEYieAWbF1AAZ9MajUoI8504.png

2. 项目实现

2.1 称重传感器

称重传感器就是一个压力传感器,其又叫做悬臂梁压力传感器。安装时需要一端固定,另一端受力。其内部有四个应变电阻片,共同组成了一个电桥,当受力端施加压力时,传感器壳体会发生形变,从而影响应变电阻片的阻值。

下面是称重传感器的原理图:

pYYBAGKEYieAGSYyAAGcOKx2_wo963.png

称重传感器实物图:

称重传感

poYBAGKEYiiAQh0VAAQgJZ7YTBo045.png

器是采用 CS1237 作为转换芯片,用于把微小的电压信号转换为具有 24 位精度的数字信号。模块信号输入端可以接受差分信号,内部具有可编程运算放大器用于放大输入端的弱小信号。模块内置温度传感器,可粗略估计周围温度。模块可用于多种工业过程控制场合,比如电子秤,血液计,智能变换器等。

CS1237中有1路ADC,集成了1路差分输入,信号输入可以是差分输入信号AINP、AINN,也可以是温度传感器的输出信号,输入信号的切换由寄存器(ch_sel[1:0])控制。

CS1237是采用2线SPI串行通信,通过SCLK和DRDY/DOUT可以实现数据的接收以及功能配置。

实现代码如下:

#include "ADC-CS1237.h"


static long AD_Res_Last=0;																		//上一轮的ADC数值保存
/*
定义CS1237使用的GPIO口
CLK   PB14    时钟线
OUT   PB15    数据输出线
*/
void CS1237_GPIO_INIT(void)
{
	RCC->APB2ENR |= 0x01 << 3;    											//打开PB口
	
	GPIOB->CRH &= 0xF0FFFFFF;														//寄存器清零
	GPIOB->CRH |= 0x03000000;														//通用推挽输出 50MHz
	GPIOB->ODR |= 1<< 14;																//拉高CLK电平
}

void CS1237_DRDY(void)																//配置PB15为输入
{
	GPIOB->CRH &= 0x0FFFFFFF;														//寄存器清零
	GPIOB->CRH |= 0x80000000;														//上下拉输入模式
}


void CS1237_DOUT(void)																//配置PB15为输出
{
	GPIOB->CRH &= 0x0FFFFFFF;														//寄存器清零
	GPIOB->CRH |= 0x30000000;														//通用推挽输出 50MHz
}



//CS1237进入低功耗模式
void CS1237_Power_Down(void)
{
	CLK_HIGH
	delay_us(200);                											//CLK上拉时间应超过100us,恢复后下拉时间至少10us
}
//配置CS1237芯片
void Con_CS1237(void)
{
	u8 i;
	u8 dat;
	u8 count_i=0;																				//溢出计时器
	dat = CS_CON;																				// 0100 1000
	CS1237_DOUT();
	OUT_HIGH
	delay_ms(310);																			//上电建立时间
	CS1237_DRDY();																			//配置PB15为输入	
	CLK_LOW																							//时钟拉低
	while(INT)																					//芯片准备好数据输出  时钟已经为0,数据也需要等CS1237全部拉低为0才算都准备好
	{
		printf("123\r\n");
		delay_ms(100);																		//10HZ下转换时间是100ms
		count_i++;
		if(count_i > 150)
		{
			CLK_HIGH;
			CS1237_DOUT();
			OUT_HIGH
			return;																					//超时,则直接退出程序
		}
	}
	for(i=0;i<29;i++)																	  // 1 - 29
	{
		One_CLK;
	}
	CS1237_DOUT();
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);	//30
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);	//31
	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);		//32
	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);		//33
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);	//34
	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);		//35
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);	//36
	One_CLK;																						//37     写入了0x65
	for(i=0;i<8;i++)																		// 38 - 45个脉冲了,写8位数据
	{
		CLK_HIGH;
		delay_us(6);
		if(dat&0x80)
			OUT_HIGH
		else
			OUT_LOW
		dat <<= 1;
		CLK_LOW;
		delay_us(6);
	}
	CS1237_DRDY();
	One_CLK;												//46个脉冲拉高数据引脚
}

//读取芯片的配置数据
u8 Read_CON(void)
{
	u8 i;
	u8 dat=0;												//读取到的数据
	u8 count_i=0;										//溢出计时器
	CS1237_DOUT();
	OUT_HIGH
	CS1237_DRDY();									//配置PB15为输入	
	CLK_LOW													//时钟拉低
	while(INT)											//芯片准备好数据输出  时钟已经为0,数据也需要等CS1237全部拉低为0才算都准备好
	{
		delay_ms(100);
		count_i++;
		if(count_i > 150)
		{
			CLK_HIGH;
			CS1237_DOUT();
			OUT_HIGH;
			return 1;										//超时,则直接退出程序
		}
	}
	for(i=0;i<29;i++)								// 1 - 29
	{
		One_CLK;
	}
	CS1237_DOUT();
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);//30
	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);//31
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);//32
	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);//33
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);//34
	CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6);//35
	CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6);//36
	One_CLK;//37     写入了0x56
	CS1237_DRDY();
	dat=0;
	for(i=0;i<8;i++)											// 38 - 45个脉冲了,读取数据
	{
		One_CLK;
		dat <<= 1;
		if(INT)
			dat++;
	}
	One_CLK;															//46个脉冲拉高数据引脚
	return dat;
}

//读取ADC数据,返回的是一个有符号数据
long Read_CS1237(void)
{
	u8 i;
	long dat=0;														//读取到的数据
	u16 count_i=0;												//溢出计时器
	CS1237_DOUT();
	OUT_HIGH															//等待模拟输入信号建立
	CLK_LOW;															//时钟拉低
	CS1237_DRDY();
	while(INT)														//芯片准备好数据输出  时钟已经为0,数据也需要等CS1237拉低为0才算都准备好
	{
//		printf("等待1\r\n");
		delay_ms(10);
		count_i++;
		if(count_i > 300)
		{
			CLK_HIGH;
			CS1237_DOUT();
			OUT_HIGH;
			return 0;													//超时,则直接退出程序
		}
	}
	CS1237_DOUT();
	OUT_HIGH															//端口锁存1,
	CS1237_DRDY();
	dat=0;
	for(i=0;i<24;i++)											//获取24位有效转换
	{
		CLK_HIGH;
		delay_us(6);
		dat <<= 1;
		if(INT)
			dat ++;
		CLK_LOW;
		delay_us(6);	
	}
	for(i=0;i<3;i++)											//一共输入27个脉冲
	{
		One_CLK;
	}
	CS1237_DOUT();
	OUT_HIGH;
	//先根据宏定义里面的有效位,丢弃一些数据
	i = 24 - ADC_Bit;//i表示将要丢弃的位数
	dat >>= i;//丢弃多余的位数
	return dat;
}

//初始化ADC相关参数
int Init_CS1237(void)
{
	Con_CS1237();//配置CS1237
	if(Read_CON() != CS_CON)//如果读取的ADC配置出错,则重启
	{
		printf("读取错误\r\n");
		return 0;
	}
	delay_us(10000);
	AD_Res_Last = Read_CS1237();
	AD_Res_Last = Read_CS1237();
	AD_Res_Last = Read_CS1237();
	return 0;
}

//数字一阶滤波器 滤波系数A,小于1。上一次数值B,本次数值C out = b*A + C*(1-A)
//下面这个程序负责读取出最终ADC数据
long Read_18Bit_AD(void)   //18位的
{
	float out,c;
	
	out = AD_Res_Last;
	c = Read_CS1237();
	if(c!=0) // 读到正确数据
	{
		out = out*Lv_Bo + c*(1-Lv_Bo);
		AD_Res_Last = out;//把这次的计算结果放到全局变量里面保护
	}
	return AD_Res_Last;
}

2.2 OLED显示屏

OLED显示屏是0.96寸 SPI接口显示屏,采用SSD1306驱动,兼容3.3V或5V电源输入,非常常见,淘宝一搜一大堆,当前选择的是中景园电子的OLED显示屏。

在调试设备或者测试数据时,有时候需要实时观察数据的变化,加入显示屏可以把观察设备的运行情况,数据变化等。在成本和难易程度上,OLED显示屏是非常适合初学者去学习与应用的。

OLED视频实物图:

pYYBAGKEYiiAJIP_AAIk2oLpFfY242.png

示例代码:

#include "OLED.H"
#include "oled_font.h"

/*
定义OLED使用的GPIO口
D0   PA5    时钟线	
D1   PA1    数据输出线
RES  PA2    复位线
DC   PA3    数据/命令选择线
CS   PA4    片选线
*/

void OLED_GPIO_INIT(void)
{
	RCC->APB2ENR |= 1<<2;       //打开PA口
	GPIOA->CRL &= 0xFF00000F;	//寄存器清零
	GPIOA->CRL |= 0x00333330;  //通用推挽输出 50MHz
	GPIOA->ODR |=0x003E;
}

void OLED_Init(void)
{
	OLED_GPIO_INIT();	//GPIO口初始化
 
	OLED_RES_HIGH;
	delay_ms(100);
	OLED_RES_LOW;
	delay_ms(200);								//延迟,由于单片机上电初始化比OLED快,所以必须加上延迟,等待OLED上电初始化完成
	OLED_RES_HIGH;
	delay_ms(200);

	OLED_WR_Byte(0xAE,OLED_CMD);	//关闭显示
	OLED_WR_Byte(0x2e,OLED_CMD);	//关闭滚动

	OLED_WR_Byte(0x00,OLED_CMD);	//设置低列地址
	OLED_WR_Byte(0x10,OLED_CMD);	//设置高列地址
	OLED_WR_Byte(0x40,OLED_CMD);	//设置起始行地址
	OLED_WR_Byte(0xB0,OLED_CMD);	//设置页地址

	OLED_WR_Byte(0x81,OLED_CMD);	// 对比度设置,可设置亮度
	OLED_WR_Byte(0xFF,OLED_CMD);	//  265  

	OLED_WR_Byte(0xA1,OLED_CMD);	//设置段(SEG)的起始映射地址;column的127地址是SEG0的地址
	OLED_WR_Byte(0xA6,OLED_CMD);	//正常显示;0xa7逆显示

	OLED_WR_Byte(0xA8,OLED_CMD);	//设置驱动路数
	OLED_WR_Byte(0x3F,OLED_CMD);	//1/64duty
	
	OLED_WR_Byte(0xC8,OLED_CMD);	//重映射模式,COM[N-1]~COM0扫描

	OLED_WR_Byte(0xD3,OLED_CMD);	//设置显示偏移
	OLED_WR_Byte(0x00,OLED_CMD);	//无偏移
	
	OLED_WR_Byte(0xD5,OLED_CMD);	//设置震荡器分频(默认)
	OLED_WR_Byte(0x80,OLED_CMD);	
	
	OLED_WR_Byte(0xD8,OLED_CMD);	//设置 area color mode off(没有)
	OLED_WR_Byte(0x05,OLED_CMD);
	
	OLED_WR_Byte(0xD6,OLED_CMD);	//放大显示
	OLED_WR_Byte(0x00,OLED_CMD);
	
	OLED_WR_Byte(0xD9,OLED_CMD);	//设置 Pre-Charge Period(默认)
	OLED_WR_Byte(0xF1,OLED_CMD);
	
	OLED_WR_Byte(0xDA,OLED_CMD);	//设置 com pin configuartion(默认)
	OLED_WR_Byte(0x12,OLED_CMD);
	
	OLED_WR_Byte(0xDB,OLED_CMD);	//设置 Vcomh,可调节亮度(默认)
	OLED_WR_Byte(0x30,OLED_CMD);
	
	OLED_WR_Byte(0x8D,OLED_CMD);	//设置OLED电荷泵
	OLED_WR_Byte(0x14,OLED_CMD);	//开显示
	
	OLED_WR_Byte(0xA4,OLED_CMD);	// Disable Entire Display On (0xa4/0xa5)
	OLED_WR_Byte(0xA6,OLED_CMD);	// Disable Inverse Display On (0xa6/a7) 
	
	OLED_WR_Byte(0xAF,OLED_CMD);	//开启OLED面板显示
	OLED_Clear();	//清屏
	OLED_Set_Pos(0,0); 	 //画点
}

void OLED_Write_Byte(u8 data)
{
	u8 i;	//定义变量
	for(i = 0; i < 8; i++)	//循环8次
	{
		OLED_D0_LOW		//将时钟线拉低
		delay_us(1);	//延迟		
		if(data & 0x80)	//数据从高位-->低位依次发送
			OLED_D1_HIGH	//数据为为1
		else
			OLED_D1_LOW	//数据位为0		
		data <<= 1;	//数据左移1位
		OLED_D0_HIGH	//时钟线拉高,把数据发送出去
		delay_us(1);	//延迟
	}
	
}


/*
	@brief			对OLED写入一个字节
	@param			dat:数据
					cmd:1,写诶数据;0,写入命令
	@retval			无
 */
void OLED_WR_Byte(u8 dat,u8 cmd)
{
	if(cmd)  //如果cmd为高,则发送的是数据
		OLED_DC_HIGH	//将DC拉高
	else    //如果cmd为低,则发送的是命令
		OLED_DC_LOW	//将DC拉低
		
	OLED_CS_LOW; //片选拉低,选通器件
		
	OLED_Write_Byte(dat); //发送数据
		
	OLED_CS_HIGH //片选拉高,关闭器件 
	OLED_DC_HIGH //DC拉高,空闲时为高电平
}


/*
	@brief			设置数据写入的起始行、列
	@param			x: 列的起始低地址与起始高地址;0x00~0x0f:设置起始列低地址(在页寻址模式);
						0x10~0x1f:设置起始列高地址(在页寻址模式)
					y:起始页地址 0~7
	@retval			无
 */
void OLED_Set_Pos(u8 x, u8 y) 
{ 
	OLED_WR_Byte(0xb0+y,OLED_CMD);//写入页地址
	OLED_WR_Byte((x&0x0f),OLED_CMD);  //写入列的地址  低半字节
	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//写入列的地址 高半字节
}   	     	  


/*
	@brief			开显示
	@param			无
	@retval			无
 */ 
void OLED_Display_On(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //设置OLED电荷泵
	OLED_WR_Byte(0X14,OLED_CMD);  //使能,开
	OLED_WR_Byte(0XAF,OLED_CMD);  //开显示
}

/*
	@brief			OLED滚屏函数,范围0~1页,水平向左
	@param			无
	@retval			无
 */	
void OLED_Scroll(void)
{
	OLED_WR_Byte(0x2E,OLED_CMD);	//关闭滚动
	OLED_WR_Byte(0x27,OLED_CMD);	//水平向左滚动
	OLED_WR_Byte(0x00,OLED_CMD);	//虚拟字节
	OLED_WR_Byte(0x00,OLED_CMD);	//起始页 0
	OLED_WR_Byte(0x00,OLED_CMD);	//滚动时间间隔
	OLED_WR_Byte(0x01,OLED_CMD);	//终止页 1
	OLED_WR_Byte(0x00,OLED_CMD);	//虚拟字节
	OLED_WR_Byte(0xFF,OLED_CMD);	//虚拟字节
	OLED_WR_Byte(0x2F,OLED_CMD);	//开启滚动
}

/*
	@brief			关显示
	@param			无
	@retval			无
 */  
void OLED_Display_Off(void)
{
	OLED_WR_Byte(0XAE,OLED_CMD);  //关显示
	OLED_WR_Byte(0X8D,OLED_CMD);  //设置OLED电荷泵
	OLED_WR_Byte(0X10,OLED_CMD);  //失能,关
}		   			 


/*
	@brief			清屏
	@param			无
	@retval			无
 */	  
void OLED_Clear(void)  
{  
	u8 i,n;		    //定义变量
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //从0~7页依次写入
		OLED_WR_Byte (0x00,OLED_CMD);      //列低地址
		OLED_WR_Byte (0x10,OLED_CMD);      //列高地址  
		for(n=0;n<128;n++)
		{
			OLED_WR_Byte(0,OLED_DATA); //写入 0 清屏
		}
	}
}


/*
	@brief			显示一个字符
	@param			x:起始列
					y:起始页,SIZE = 16占两页;SIZE = 12占1页
					chr:字符
	@retval			无
 */
void OLED_ShowChar(u8 x,u8 y,u8 chr)
{      	
	u8 c=0,i=0;	
	c=chr-' '; //获取字符的偏移量	
	if(x>Max_Column-1){x=0;y=y+2;} //如果列数超出了范围,就从下2页的第0列开始

	if(SIZE ==16) 					//字符大小如果为 16 = 8*16
		{
			OLED_Set_Pos(x,y);	//从x y 开始画点
			for(i=0;i<8;i++)  	//循环8次 占8列
			OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); //找出字符 c 的数组位置,先在第一页把列画完
			OLED_Set_Pos(x,y+1); //页数加1
			for(i=0;i<8;i++)  //循环8次
			OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); //把第二页的列数画完
		}
	else 	//字符大小为 6 = 6*8
		{	
			OLED_Set_Pos(x,y+1); //一页就可以画完
			for(i=0;i<6;i++) //循环6次 ,占6列
			OLED_WR_Byte(F6x8[c][i],OLED_DATA); //把字符画完
		}
}


/*
	@brief			计算m^n
	@param			m:输入的一个数
					n:输入数的次方
	@retval			result:一个数的n次方
 */
u16 oled_pow(u8 m,u8 n)
{
	u16 result=1;	 
	while(n--)result*=m;    
	return result;
}				  


/*
	@brief			在指定的位置,显示一个指定长度大小的数
	@param			x:起始列
					y:起始页
					num:数字
					len:数字的长度
					size:显示数字的大小
	@retval			无
 */		  
void OLED_ShowNum(u8 x,u8 y,u16 num,u16 len,u16 size)
{         	
	u8 t,temp;  															//定义变量
	u8 enshow=0;															//定义变量

	for(t=0;t=128){x=0;y+=2;} //如果x大于等于128,切换页,从该页的第一列显示
		j++; //下一个字符
	}
}


/*
	@brief			显示中文
	@param			x:起始列;一个字体占16列
					y:起始页;一个字体占两页
					no:字体的序号
	@retval			无
 */
void OLED_ShowCHinese(u8 x,u8 y,u8 no,u8 w,u8 h)
{      			    
	u8 t,k,addr0=(h/8)*no; //定义变量
  for(k=0;k;t++)>

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354713
  • 电子秤
    +关注

    关注

    23

    文章

    211

    浏览量

    44271
收藏 人收藏

    评论

    相关推荐

    数字电子秤电路图

    数字电子秤电路图
    发表于 04-02 09:39 9006次阅读
    <b class='flag-5'>数字</b>式<b class='flag-5'>电子秤</b>电路图

    无线吊,无线传输的电子秤解决方案

    转换为计算机能识别的数字量,计算机运行计算后,将物件名称、重量、价格等等在显示屏上显示出来,同时也可打印出单据。无线传输的电子秤可以不用RS485等有线装置与总部联系,直接经无线方式与总部联络,将每天
    发表于 01-14 10:14

    电子秤程序

    看了很多电子秤的程序,但就是不懂它的设置什么的,比如电子秤的称重范围的设计?……求路过的各位大仙指导,感激不尽。
    发表于 04-18 12:17

    简易电子秤

    本帖最后由 soen 于 2016-10-11 15:01 编辑 2016电子设计大赛G(电阻应变片)基于stm32 c8t6的12864液晶显示电子秤
    发表于 07-30 03:08

    模拟电子技术基础教材+数字电子秤资料合集

    单片机设计的数字电子秤资料合集主要内容包括了:程序,proteus仿真,原理图,模拟电子技术基础电子教材,数字
    发表于 12-12 17:41

    电子秤开发

    我有一个项目要用到电子秤电子秤的使用环境有振动同时精度要求比较高,不知哪位大神有更好的建议。
    发表于 11-15 00:55

    简易电子秤

    本帖最后由 东隅遇桑榆 于 2021-7-9 18:49 编辑 基于CC2540单片机的简易电子秤:随着微电子技术的应用,电子秤的出现迅速得到了人们的青睐。相比传统的机械式称量工具,电子
    发表于 07-09 18:46

    如何利用stm32去做电子秤

    如何利用stm32去做电子秤
    发表于 11-25 08:08

    电子秤

    电子秤 电子秤
    发表于 09-23 15:12 2525次阅读
    <b class='flag-5'>电子秤</b>

    数字电子秤课程设计

    数字电子秤课程设计,有图,有内容啊, 希望对大家有用
    发表于 01-14 17:09 110次下载

    电子秤 完结版

    课程设计简易电子秤芯片:stm32c8
    发表于 12-09 16:33 0次下载

    电子秤仿真图

    基于单片机的数字电子秤
    发表于 03-19 11:47 56次下载

    基于stm32电子秤方案大全(二款stm32电子秤设计方案)

     电子秤(英文名:electronic balance)是衡器的一种,是利用胡克定律或力的杠杆平衡原理测定物体质量的工具。按结构原理可分为机械电子秤、机电结合三大类。
    发表于 01-29 12:05 3.4w次阅读

    如何选购电子秤

    吊钩人们在去超市购买蔬菜水果的时候都会看到工作人员使用电子秤来给商品称重,所以在一般人的印象中,电子秤就是台秤,而不同类型的电子秤之间的最大差别就是设备的大小不同。其实现在
    发表于 03-27 11:18 2509次阅读

    基于STM32的智能电子秤设计

    一.硬件方案本设计是一款基于STM32单片机的电子秤系统,随着科学技术的不断发展,传统的机械逐渐被电子秤所取代,相比于计量不精确,费时费力的机械
    发表于 01-13 10:57 81次下载
    基于<b class='flag-5'>STM32</b>的智能<b class='flag-5'>电子秤</b>设计