-
Notifications
You must be signed in to change notification settings - Fork 1
/
50kg_scale_1602_i2c.ino
257 lines (225 loc) · 6.58 KB
/
50kg_scale_1602_i2c.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
/* weighing for 50kg max
* program wrote Nicu FLORICA (niq_ro)
* https://nicuflorica.blogspot.com/search?q=cantar
* display with MAX7219 and 8 number 7-segment led display
* tensiometric sensor for 50kg with 3 wire
* v.1.0 - 30.08.2020, Craiova - Romania
* v.1,0.a - eliminate Serial monmitoring
*/
#include <HX711_ADC.h> // Arduino library by Olav Kallhovd sept2017 - https://github.com/olkal/HX711_ADC
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define HX711_dout 14 //mcu > HX711 dout pin
#define HX711_sck 15 //mcu > HX711 sck pin
HX711_ADC LoadCell(HX711_dout, HX711_sck); //HX711 constructor:
#define buton1 2
#define buton2 3
const int calVal_eepromAdress = 0;
unsigned long timp; // measurement time
unsigned long pauza = 1000; // pause between measurements
float calibrationValue; // calibration value
long stabilizingtime = 2000; // preciscion right after power-up can be improved by adding a few seconds of stabilizing time
boolean _tare = true; //set this to false if you don't want tare to be performed in the next step
float newCalibrationValue;
float greutate; // weight value
float greutate1; // weight value (absolute value, positive)
byte mod = 0;
// 0 - measurement
// 1 - tare
// 2 - calibrate
void setup() {
delay(50);
lcd.begin(); // initialize the LCD
//lcd.init(); // initialize others LCD
lcd.backlight(); // Turn on the blacklight and print a message
lcd.clear(); // clear the screen
pinMode(buton1, INPUT);
pinMode(buton2, INPUT);
digitalWrite(buton1, HIGH);
digitalWrite(buton2, HIGH);
lcd.setCursor(0, 0);
lcd.print("Cantar max. 50kg");
lcd.setCursor(0, 1);
lcd.print("SW. ver.1.0/2020");
delay(1500);
lcd.setCursor(0, 1);
lcd.print(" Nicu FLORICA ");
delay(1500);
lcd.setCursor(0, 1);
lcd.print(" (niq_ro) ");
delay(1500);
lcd.clear(); // clear the screen
LoadCell.begin();
calibrationValue = -1; // uncomment this if you want to set the calibration value in the sketch
/*
#if defined(ESP8266)|| defined(ESP32)
EEPROM.begin(512); // uncomment this if you use ESP8266/ESP32 and want to fetch the calibration value from eeprom
#endif
*/
EEPROM.get(calVal_eepromAdress, calibrationValue); // uncomment this if you want to fetch the calibration value from eeprom
LoadCell.start(stabilizingtime, _tare);
if (LoadCell.getTareTimeoutFlag()) {
// Serial.println("Timeout, check MCU>HX711 wiring and pin designations");
while (1);
}
else {
LoadCell.setCalFactor(calibrationValue); // set calibration value (float)
// Serial.println("Startup is complete");
}
} // end setup
void loop() {
static boolean newDataReady = 0;
//if (LoadCell.update()) newDataReady = true;
if (mod == 0)
{
LoadCell.update(); // // check for new data/start next conversion
if (millis() > timp + pauza) {
greutate = float(LoadCell.getData()/1000.);
// Serial.print("Load_cell output val: ");
// Serial.println(greutate);
// newDataReady = 0;
timp = millis();
}
lcd.setCursor(0, 0);
lcd.print("Greutate:");
lcd.setCursor(7, 1);
if (greutate < 10.) lcd.print(" ");
if (greutate < 0.)
{
lcd.print("-");
greutate1 = - greutate;
}
if (greutate > 0.)
{
lcd.print(" ");
greutate1 = greutate;
}
lcd.print(greutate1);
lcd.print("kg");
if (digitalRead(buton2) == LOW)
{
lcd.clear();
// Serial.println("Tare beginning...");
lcd.setCursor(0, 0);
lcd.print("Aducere la zero!");
LoadCell.tareNoDelay();
// LoadCell.update();
delay(1000);
// lcd.clear();
mod = 1;
}
if (digitalRead(buton1) == LOW)
{
lcd.clear();
//Serial.println("Calibrate beginning...");
lcd.setCursor(0, 0);
lcd.print("Calibrare!");
delay(1000);
// lcd.clear();
mod = 3;
}
} // end mod = 0
if (mod == 1)
{
if (LoadCell.getTareStatus() == false)
{
// Serial.println("Tare incomplete");
lcd.setCursor(0, 1);
lcd.print(" in lucru ! ");
delay(2000);
mod = 0;
lcd.clear();
}
if (LoadCell.getTareStatus() == true)
{
// Serial.println("Tare complete");
lcd.setCursor(0, 1);
lcd.print(" rezolvat ! ");
delay(2000);
mod = 0;
lcd.clear();
}
if (LoadCell.update()) newDataReady = true;
if (LoadCell.getTareStatus() == true)
{
// Serial.println("Tare complete");
lcd.setCursor(0, 1);
lcd.print(" rezolvat ! ");
delay(2000);
mod = 0;
lcd.clear();
}
} // mod = 2
// check if last tare operation is complete:
if (LoadCell.getTareStatus() == true) {
// Serial.println("Tare complete");
lcd.setCursor(0, 1);
lcd.print("V");
delay(100);
lcd.setCursor(0, 1);
lcd.print(" ");
}
if (mod == 3)
{
lcd.clear();
calibrare();
mod = 0;
}
} // end main loop
void calibrare() {
// Serial.println("***");
// Serial.println("Start calibration:");
// Serial.println("Place the load cell an a level stable surface.");
// Serial.println("Remove any load applied to the load cell.");
lcd.setCursor(0, 0);
lcd.print(" Eliminati orice ");
lcd.setCursor(0, 1);
lcd.print(" greutate !!! ");
delay(5000);
lcd.clear();
boolean _resume = false;
// Serial.println("Now, place 1kg on the loadcell.");
// Serial.println("Then send the weight of this mass (i.e. 100.0) from serial monitor.");
lcd.setCursor(0, 0);
lcd.print(" Puneti o ");
lcd.setCursor(0, 1);
lcd.print("sarcina de 1kg !");
delay(5000);
// lcd.clear();
float known_mass = 1000.;
LoadCell.update();
LoadCell.refreshDataSet(); //refresh the dataset to be sure that the known mass is measured correct
newCalibrationValue = LoadCell.getNewCalibration(known_mass); //get the new calibration value
// Serial.print("New calibration value has been set to: ");
// Serial.print(newCalibrationValue);
// Serial.println(", use this as calibration value (calFactor) in your project sketch.");
/*
#if defined(ESP8266)|| defined(ESP32)
EEPROM.begin(512);
#endif
*/
EEPROM.put(calVal_eepromAdress, newCalibrationValue);
/*
#if defined(ESP8266)|| defined(ESP32)
EEPROM.commit();
#endif
*/
EEPROM.get(calVal_eepromAdress, newCalibrationValue);
// Serial.print("Value ");
// Serial.print(newCalibrationValue);
// Serial.print(" saved to EEPROM address: ");
// Serial.println(calVal_eepromAdress);
_resume = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Factor calibrare");
lcd.setCursor(0, 1);
lcd.print(newCalibrationValue);
delay(5000);
lcd.clear();
// Serial.println("End calibration");
// Serial.println("***");
}