极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 46930|回复: 30

全部基于极客工坊资源的一只微型厨房电子秤【感谢shenhaiyu】

[复制链接]
发表于 2014-5-16 00:06:28 | 显示全部楼层 |阅读模式
本帖最后由 沧海笑1122 于 2014-5-16 00:30 编辑
  1. /*
  2. 一、时间:2014-04至05
  3. 二、滤波算法:中位值平均滤波法 [url]http://www.geek-workshop.com/thread-7694-1-1.html[/url]
  4. 三、关于数字口的分配使用:
  5. (1)NOKIA 5110 --------- D7,6,5,4,3
  6. (2)去皮按钮 ----------- D8 [url]http://www.geek-workshop.com/forum.php?mod=viewthread&tid=74[/url]
  7. (3)HX711称重传感器(带屏蔽罩)----- D9,D10 [url]http://www.geek-workshop.com/thread-2315-1-1.html[/url]
  8. (4)DHT11温湿度传感器--- D12 [url]http://www.geek-workshop.com/thread-997-1-1.html[/url]
  9. 四、主材、辅材
  10. 主控板:ARDUINO NANO V3.1
  11. 外壳:来自一个日用品的透明小方盒。使用电钻、电磨开孔。
  12. 秤盘:来自一个旧的USB HUB。取出里面的电路板,得到了四个USB插座,其中一个用于和主机的连接。
  13.       秤面是反光材质,显得科技感十足。
  14.       秤盘和电子秤主机是分离的,既是处于对体积的考虑,更多是为了减少干扰。
  15.       电池是两节3V的纽扣电池。因为设置了电源开关,所以不称重的时候关掉。用了热熔胶,对一些焊点进行了保护,狭小的空间。

  16. 五、用途:
  17.   微型厨房秤(量程750克),目前用于称普洱茶。由于采用了温度补偿,顺带显示了环境的温湿度。
  18.   带有去皮按钮,可以很方便地去皮。
  19. 六、感谢:
  20. shenhaiyu、弘毅、lionelg等会员的教程。
  21. 尤其对shenhaiyu致以深深的敬意。代码完全是她提供的,我只是做了一点剪裁、堆砌工作。

  22. 七、点滴收获
  23.     这个arduino的电子秤,又一次证明了,arduino是一个可搭建、剪裁的电子积木。只要你想动手,极客工坊的资源完全可以支撑一个有趣的小制作。通过这个小制作,动手能力有了提升,入手一只琢美电磨,在开孔、钻孔方面发挥了很好的作用。
  24.    点滴乐趣,尽在其中,感谢工坊。

  25. */

  26. #include <HX711A.h>
  27. #include <EEPROM.h>
  28. #include <Nokia5110.h>
  29. #include <dht11.h> //温度补偿
  30. Nokia5110 lcd(7, 6, 5, 4, 3); // (PIN_SCE, PIN_RESET, PIN_DC, PIN_SDIN, PIN_SCLK)
  31. HX711 hx(9, 10, 128, -0.00051235);//补偿系数的计算,详见shenhaiyu的教程。我用了一只100G,一只200G砝码测得。
  32. dht11 DHT11;
  33. #define DHT11PIN 12 //DHT11 PIN 2 连接NANO D12,使用一只4K7的电阻。
  34. #define FILTER_N 100
  35. int i=0;
  36. int Filter_Value;


  37. // 用于在 EEPROM 中储存 double 类型数据的共用体
  38. unsigned char *dpointer;
  39. union data {
  40.   double v;
  41.   unsigned char dchar[8];
  42. } dvalue;

  43. void setup() {
  44.   lcd.init(); // init the LCD
  45.   Serial.begin(9600);
  46.   for(i = 0; i < 8; i++) dvalue.dchar[i] = EEPROM.read(i); // 从 EEPROM 读取偏移量
  47.   hx.set_offset(dvalue.v);                                 // 设置已读取的偏移量
  48. }
  49. void loop() {
  50.   lcd.clear();
  51.   lcd.gotoXY(4, 1); // set marker to 4 pixels on x-axis, 1nd row
  52.   lcd.string("Hi ....");// HI,随便写点什么吧
  53.   lcd.gotoXY(6, 2); // set marker to 6 pixels on x-axis, 2nd row
  54.   lcd.string("it's        g");
  55.   lcd.gotoXY(6, 4);  
  56.   lcd.string("Temp:");
  57.   lcd.gotoXY(6, 5);  
  58.   lcd.string("H :");
  59.   if(digitalRead(8) == HIGH) {  //按钮电阻10K
  60.    dvalue.v = hx.tare();     // 去皮重并读取偏移量
  61.    hx.set_offset(dvalue.v);  // 设置已读取的偏移量
  62.    dpointer = dvalue.dchar;  // 以下程序将偏移量分解并储存到 EEPROM
  63.    for(i = 0; i < 8; i++) {
  64.       EEPROM.write(i,*dpointer);
  65.       dpointer++;
  66.     }
  67.   }
  68.   
  69.   //中位值平均滤波
  70.   double sum = 0;
  71.   Filter_Value = Filter();
  72.   sum= Filter_Value;
  73.   char string1[10];//称重值字符串变量
  74.   char string2[10];//温度显示
  75.   char string3[10];//湿度显示
  76.   int chk = DHT11.read(DHT11PIN);
  77.   sum = sum * (1 + (24 - (float)DHT11.temperature) / 10 * 0.02); // 带线性温度补偿的输出,注意temprature单位为摄氏度。
  78.   Serial.println((float)DHT11.temperature-4, 2);//这两句调试用,成品可以去除。
  79.   Serial.println(sum);
  80.   dtostrf(sum,4,1,string1);//双精度转为字符串,整数4位,小数2位。这是非常有用的转换函数。
  81.   dtostrf((float)DHT11.temperature-4,4,1,string2);//去掉了4度,温度偏差实在太大了,特别是刚装配好的时候,可以对比温度计自行修正,这个功能不必太较真,毕竟是廉价的DHT11.
  82.   dtostrf((float)DHT11.humidity,4,1,string3);//提取湿度值。
  83.    lcd.gotoXY(32, 2);
  84.    lcd.string(string1);//重量显示
  85.    lcd.gotoXY(36, 4);   
  86.    lcd.string(string2);//温度显示
  87.    lcd.gotoXY(36, 5);
  88.    lcd.string(string3); //湿度显示
  89.   delay(2000);
  90.   }

  91. // 中位值平均滤波法(又称防脉冲干扰平均滤波法)
  92. int Filter() {
  93.   int i, j;
  94.   int filter_temp, filter_sum = 0;
  95.   int filter_buf[FILTER_N];
  96.   for(i = 0; i < FILTER_N; i++) {
  97.     filter_buf[i] = hx.bias_read();
  98.     delay(1);
  99.   }
  100.   // 采样值从小到大排列(冒泡法)
  101.   for(j = 0; j < FILTER_N - 1; j++) {
  102.     for(i = 0; i < FILTER_N - 1 - j; i++) {
  103.       if(filter_buf[i] > filter_buf[i + 1]) {
  104.         filter_temp = filter_buf[i];
  105.         filter_buf[i] = filter_buf[i + 1];
  106.         filter_buf[i + 1] = filter_temp;
  107.       }
  108.     }
  109.   }
  110.   // 去除最大最小极值后求平均
  111.   for(i = 1; i < FILTER_N - 1; i++) filter_sum += filter_buf[i];
  112.   return filter_sum / (FILTER_N - 2);
  113. }

复制代码




所用到的库。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +3 收起 理由
幻生幻灭 + 3 Just do it!

查看全部评分

回复

使用道具 举报

发表于 2014-5-16 08:39:29 | 显示全部楼层
不错!!!!值学习!!!!!!
回复 支持 反对

使用道具 举报

发表于 2014-5-16 09:16:15 | 显示全部楼层
文档真规范,这样的排布看着真舒心!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-16 12:49:34 | 显示全部楼层
wetnt 发表于 2014-5-16 09:16
文档真规范,这样的排布看着真舒心!

谢谢支持,我只是搭建了“积木“。有些注释是不同作者标注的。有的已经无从知晓出处。如有引用,一并致谢。
回复 支持 反对

使用道具 举报

发表于 2014-5-16 15:03:15 | 显示全部楼层
哈哈,也谢谢你,乐于分享自己的成果~~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-16 15:11:08 | 显示全部楼层
shenhaiyu 发表于 2014-5-16 15:03
哈哈,也谢谢你,乐于分享自己的成果~~~

当面致谢!
回复 支持 反对

使用道具 举报

发表于 2014-5-16 22:55:30 | 显示全部楼层
额,之前买了个模块,不过是模拟量输出呢。也想玩玩。。。但闲置了好久。
回复 支持 反对

使用道具 举报

发表于 2014-5-17 09:21:30 | 显示全部楼层
幻生幻灭 发表于 2014-5-16 22:55
额,之前买了个模块,不过是模拟量输出呢。也想玩玩。。。但闲置了好久。

楼主的称重模块其实也是模拟的
只是用了一个24BIT的AD HX711。
回复 支持 反对

使用道具 举报

发表于 2014-5-17 16:05:06 | 显示全部楼层
{:soso_e103:}电子称外壳看的不错ing
回复 支持 反对

使用道具 举报

发表于 2014-5-17 18:27:21 | 显示全部楼层
建议可以把称重结果显示为右对齐,这样好看一点。。。不过其实不要紧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-17 21:13:29 | 显示全部楼层
弘毅 发表于 2014-5-17 16:05
电子称外壳看的不错ing

谢谢弘大,是用一个透明的牙线盒改的。嘿嘿。
回复 支持 反对

使用道具 举报

发表于 2014-5-19 00:29:28 | 显示全部楼层
这个很有必要收藏。
回复 支持 反对

使用道具 举报

发表于 2014-5-19 09:28:28 | 显示全部楼层
本帖最后由 leicheng 于 2014-5-19 18:56 编辑

看了下,想到几个问题,请问楼主和各位高手达人:

1. 这个装置采用的2节纽扣电池能提供多大的连续电流?如果不能满足arduino的要求,脉冲式的电流稳定吗?

2. 这个小装置的功率大概是多少,连续工作多长时间要更换纽扣电池?

3. 这个装置采用了倾角补偿吗?做过标定没?最大允许误差是多少?
回复 支持 反对

使用道具 举报

发表于 2014-5-19 13:20:58 | 显示全部楼层
有没有兴趣基于Microduino移植一个~可以做到更小,我提供所需Microduino模块
http://www.microduino.cc/wiki/index.php?title=Main_Page/zh
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-19 21:44:50 | 显示全部楼层
1.纽扣电池两节目前正常工作.本来用一颗九伏电池,但超出nano的电压。因为有开关,不用时关闭。主要耗电我觉得是液晶吧,具体能耗未测。我觉得如果可能还是用九伏电池加降压模块,我是受限于盒子了。
2.程序里面的补偿系数,使用两个标准砝码测定,没有单独做倾角补偿和标定。误差我觉得和温度还是有关系,我的测温元件精度低,目前还就是玩玩。
3.可以移植到microduino,我会尝试。移植到pro mini也很好的性价比。
谢谢支持。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 23:03 , Processed in 0.053832 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表