全部基于极客工坊资源的一只微型厨房电子秤【感谢shenhaiyu】
本帖最后由 沧海笑1122 于 2014-5-16 00:30 编辑/*
一、时间:2014-04至05
二、滤波算法:中位值平均滤波法 http://www.geek-workshop.com/thread-7694-1-1.html
三、关于数字口的分配使用:
(1)NOKIA 5110 --------- D7,6,5,4,3
(2)去皮按钮 ----------- D8 http://www.geek-workshop.com/forum.php?mod=viewthread&tid=74
(3)HX711称重传感器(带屏蔽罩)----- D9,D10 http://www.geek-workshop.com/thread-2315-1-1.html
(4)DHT11温湿度传感器--- D12 http://www.geek-workshop.com/thread-997-1-1.html
四、主材、辅材
主控板:ARDUINO NANO V3.1
外壳:来自一个日用品的透明小方盒。使用电钻、电磨开孔。
秤盘:来自一个旧的USB HUB。取出里面的电路板,得到了四个USB插座,其中一个用于和主机的连接。
秤面是反光材质,显得科技感十足。
秤盘和电子秤主机是分离的,既是处于对体积的考虑,更多是为了减少干扰。
电池是两节3V的纽扣电池。因为设置了电源开关,所以不称重的时候关掉。用了热熔胶,对一些焊点进行了保护,狭小的空间。
五、用途:
微型厨房秤(量程750克),目前用于称普洱茶。由于采用了温度补偿,顺带显示了环境的温湿度。
带有去皮按钮,可以很方便地去皮。
六、感谢:
shenhaiyu、弘毅、lionelg等会员的教程。
尤其对shenhaiyu致以深深的敬意。代码完全是她提供的,我只是做了一点剪裁、堆砌工作。
七、点滴收获
这个arduino的电子秤,又一次证明了,arduino是一个可搭建、剪裁的电子积木。只要你想动手,极客工坊的资源完全可以支撑一个有趣的小制作。通过这个小制作,动手能力有了提升,入手一只琢美电磨,在开孔、钻孔方面发挥了很好的作用。
点滴乐趣,尽在其中,感谢工坊。
*/
#include <HX711A.h>
#include <EEPROM.h>
#include <Nokia5110.h>
#include <dht11.h> //温度补偿
Nokia5110 lcd(7, 6, 5, 4, 3); // (PIN_SCE, PIN_RESET, PIN_DC, PIN_SDIN, PIN_SCLK)
HX711 hx(9, 10, 128, -0.00051235);//补偿系数的计算,详见shenhaiyu的教程。我用了一只100G,一只200G砝码测得。
dht11 DHT11;
#define DHT11PIN 12 //DHT11 PIN 2 连接NANO D12,使用一只4K7的电阻。
#define FILTER_N 100
int i=0;
int Filter_Value;
// 用于在 EEPROM 中储存 double 类型数据的共用体
unsigned char *dpointer;
union data {
double v;
unsigned char dchar;
} dvalue;
void setup() {
lcd.init(); // init the LCD
Serial.begin(9600);
for(i = 0; i < 8; i++) dvalue.dchar = EEPROM.read(i); // 从 EEPROM 读取偏移量
hx.set_offset(dvalue.v); // 设置已读取的偏移量
}
void loop() {
lcd.clear();
lcd.gotoXY(4, 1); // set marker to 4 pixels on x-axis, 1nd row
lcd.string("Hi ....");// HI,随便写点什么吧
lcd.gotoXY(6, 2); // set marker to 6 pixels on x-axis, 2nd row
lcd.string("it's g");
lcd.gotoXY(6, 4);
lcd.string("Temp:");
lcd.gotoXY(6, 5);
lcd.string("H :");
if(digitalRead(8) == HIGH) {//按钮电阻10K
dvalue.v = hx.tare(); // 去皮重并读取偏移量
hx.set_offset(dvalue.v);// 设置已读取的偏移量
dpointer = dvalue.dchar;// 以下程序将偏移量分解并储存到 EEPROM
for(i = 0; i < 8; i++) {
EEPROM.write(i,*dpointer);
dpointer++;
}
}
//中位值平均滤波
double sum = 0;
Filter_Value = Filter();
sum= Filter_Value;
char string1;//称重值字符串变量
char string2;//温度显示
char string3;//湿度显示
int chk = DHT11.read(DHT11PIN);
sum = sum * (1 + (24 - (float)DHT11.temperature) / 10 * 0.02); // 带线性温度补偿的输出,注意temprature单位为摄氏度。
Serial.println((float)DHT11.temperature-4, 2);//这两句调试用,成品可以去除。
Serial.println(sum);
dtostrf(sum,4,1,string1);//双精度转为字符串,整数4位,小数2位。这是非常有用的转换函数。
dtostrf((float)DHT11.temperature-4,4,1,string2);//去掉了4度,温度偏差实在太大了,特别是刚装配好的时候,可以对比温度计自行修正,这个功能不必太较真,毕竟是廉价的DHT11.
dtostrf((float)DHT11.humidity,4,1,string3);//提取湿度值。
lcd.gotoXY(32, 2);
lcd.string(string1);//重量显示
lcd.gotoXY(36, 4);
lcd.string(string2);//温度显示
lcd.gotoXY(36, 5);
lcd.string(string3); //湿度显示
delay(2000);
}
// 中位值平均滤波法(又称防脉冲干扰平均滤波法)
int Filter() {
int i, j;
int filter_temp, filter_sum = 0;
int filter_buf;
for(i = 0; i < FILTER_N; i++) {
filter_buf = hx.bias_read();
delay(1);
}
// 采样值从小到大排列(冒泡法)
for(j = 0; j < FILTER_N - 1; j++) {
for(i = 0; i < FILTER_N - 1 - j; i++) {
if(filter_buf > filter_buf) {
filter_temp = filter_buf;
filter_buf = filter_buf;
filter_buf = filter_temp;
}
}
}
// 去除最大最小极值后求平均
for(i = 1; i < FILTER_N - 1; i++) filter_sum += filter_buf;
return filter_sum / (FILTER_N - 2);
}
所用到的库。 不错!!!!值学习!!!!!! 文档真规范,这样的排布看着真舒心! wetnt 发表于 2014-5-16 09:16 static/image/common/back.gif
文档真规范,这样的排布看着真舒心!
谢谢支持,我只是搭建了“积木“。有些注释是不同作者标注的。有的已经无从知晓出处。如有引用,一并致谢。 哈哈,也谢谢你,乐于分享自己的成果~~~ shenhaiyu 发表于 2014-5-16 15:03 static/image/common/back.gif
哈哈,也谢谢你,乐于分享自己的成果~~~
:handshake当面致谢! 额,之前买了个模块,不过是模拟量输出呢。也想玩玩。。。但闲置了好久。 幻生幻灭 发表于 2014-5-16 22:55 static/image/common/back.gif
额,之前买了个模块,不过是模拟量输出呢。也想玩玩。。。但闲置了好久。
楼主的称重模块其实也是模拟的
只是用了一个24BIT的AD HX711。 {:soso_e103:}电子称外壳看的不错ing 建议可以把称重结果显示为右对齐,这样好看一点。。。不过其实不要紧。 弘毅 发表于 2014-5-17 16:05 static/image/common/back.gif
电子称外壳看的不错ing
谢谢弘大,是用一个透明的牙线盒改的。嘿嘿。 这个很有必要收藏。 本帖最后由 leicheng 于 2014-5-19 18:56 编辑
看了下,想到几个问题,请问楼主和各位高手达人:
1. 这个装置采用的2节纽扣电池能提供多大的连续电流?如果不能满足arduino的要求,脉冲式的电流稳定吗?
2. 这个小装置的功率大概是多少,连续工作多长时间要更换纽扣电池?
3. 这个装置采用了倾角补偿吗?做过标定没?最大允许误差是多少? :lol有没有兴趣基于Microduino移植一个~可以做到更小,我提供所需Microduino模块:lol
http://www.microduino.cc/wiki/index.php?title=Main_Page/zh 1.纽扣电池两节目前正常工作.本来用一颗九伏电池,但超出nano的电压。因为有开关,不用时关闭。主要耗电我觉得是液晶吧,具体能耗未测。我觉得如果可能还是用九伏电池加降压模块,我是受限于盒子了。
2.程序里面的补偿系数,使用两个标准砝码测定,没有单独做倾角补偿和标定。误差我觉得和温度还是有关系,我的测温元件精度低,目前还就是玩玩。
3.可以移植到microduino,我会尝试。移植到pro mini也很好的性价比。
谢谢支持。