|
本帖最后由 沧海笑1122 于 2014-5-16 00:30 编辑
- /*
- 一、时间:2014-04至05
- 二、滤波算法:中位值平均滤波法 [url]http://www.geek-workshop.com/thread-7694-1-1.html[/url]
- 三、关于数字口的分配使用:
- (1)NOKIA 5110 --------- D7,6,5,4,3
- (2)去皮按钮 ----------- D8 [url]http://www.geek-workshop.com/forum.php?mod=viewthread&tid=74[/url]
- (3)HX711称重传感器(带屏蔽罩)----- D9,D10 [url]http://www.geek-workshop.com/thread-2315-1-1.html[/url]
- (4)DHT11温湿度传感器--- D12 [url]http://www.geek-workshop.com/thread-997-1-1.html[/url]
- 四、主材、辅材
- 主控板: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[8];
- } dvalue;
- void setup() {
- lcd.init(); // init the LCD
- Serial.begin(9600);
- for(i = 0; i < 8; i++) dvalue.dchar[i] = 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[10];//称重值字符串变量
- char string2[10];//温度显示
- char string3[10];//湿度显示
- 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[FILTER_N];
- for(i = 0; i < FILTER_N; i++) {
- filter_buf[i] = 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[i] > filter_buf[i + 1]) {
- filter_temp = filter_buf[i];
- filter_buf[i] = filter_buf[i + 1];
- filter_buf[i + 1] = filter_temp;
- }
- }
- }
- // 去除最大最小极值后求平均
- for(i = 1; i < FILTER_N - 1; i++) filter_sum += filter_buf[i];
- return filter_sum / (FILTER_N - 2);
- }
复制代码
所用到的库。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|