add tm1637 4digit 7segment display

This commit is contained in:
interfisch 2021-03-05 19:49:53 +01:00
parent 5d96c74fe2
commit 264db45641
2 changed files with 116 additions and 41 deletions

View File

@ -19,3 +19,4 @@ monitor_speed= 115200
lib_deps = lib_deps =
bogde/HX711 @ 0.7.4 bogde/HX711 @ 0.7.4
Homie@3.0.0 Homie@3.0.0
smougenot/TM1637

View File

@ -8,6 +8,27 @@
//Upload config: platformio run --target uploadfs //Upload config: platformio run --target uploadfs
#include <TM1637Display.h>
#define TM1637_CLK D5
#define TM1637_DIO D6
TM1637Display display(TM1637_CLK, TM1637_DIO);
const uint8_t SEG_DONE[] = {
SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // d
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // O
SEG_C | SEG_E | SEG_G, // n
SEG_A | SEG_D | SEG_E | SEG_F | SEG_G // E
};
const uint8_t SEG_POINT[] = { SEG_DP};
uint8_t display_data[] = { 0xff, 0xff, 0xff, 0xff };
uint8_t display_blank[] = { 0x00, 0x00, 0x00, 0x00 };
unsigned long last_displayupdate=0;
#define DISPLAYUPDATEINTERVAL 100
#include "HX711.h" #include "HX711.h"
@ -66,6 +87,10 @@ void setup() {
Serial.begin(115200); Serial.begin(115200);
display.setBrightness(7, true); //brightness 0 to 7
Homie.disableResetTrigger(); //disable config reset if pin 1 (D3) is low on startup Homie.disableResetTrigger(); //disable config reset if pin 1 (D3) is low on startup
@ -97,42 +122,6 @@ void setup() {
Serial.println("tared. measuring..."); Serial.println("tared. measuring...");
//after this taring put known weight on scale and get value from scale.get_units(10). then devide this value by the weight and use this number for set_scale(NUMBER) //after this taring put known weight on scale and get value from scale.get_units(10). then devide this value by the weight and use this number for set_scale(NUMBER)
/*
Serial.println("Before setting up the scale:");
Serial.print("read: \t\t");
Serial.println(scale.read()); // print a raw reading from the ADC
Serial.print("read average: \t\t");
Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC
Serial.print("get value: \t\t");
Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight (not set yet)
Serial.print("get units: \t\t");
Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight (not set) divided
// by the SCALE parameter (not set yet)
scale.set_scale(2280.f); // this value is obtained by calibrating the scale with known weights; see the README for details
scale.tare(); // reset the scale to 0
Serial.println("After setting up the scale:");
Serial.print("read: \t\t");
Serial.println(scale.read()); // print a raw reading from the ADC
Serial.print("read average: \t\t");
Serial.println(scale.read_average(20)); // print the average of 20 readings from the ADC
Serial.print("get value: \t\t");
Serial.println(scale.get_value(5)); // print the average of 5 readings from the ADC minus the tare weight, set with tare()
Serial.print("get units: \t\t");
Serial.println(scale.get_units(5), 1); // print the average of 5 readings from the ADC minus tare weight, divided
// by the SCALE parameter set with set_scale
Serial.println("Readings:");
*/
} }
void loop() { void loop() {
@ -147,7 +136,7 @@ void loopHandler() {
if (loopmillis>last_measure+MEASURE_INTERVAL) { if (loopmillis>last_measure+MEASURE_INTERVAL) {
last_measure=loopmillis; last_measure=loopmillis;
Serial.print("reading="); //Serial.print("reading=");
weight_current=0; weight_current=0;
if (scale.wait_ready_timeout(1000)) { //for non blocking mode if (scale.wait_ready_timeout(1000)) { //for non blocking mode
weight_read_pos++; weight_read_pos++;
@ -162,8 +151,8 @@ void loopHandler() {
float weight_filtered=getFilteredWeight(); float weight_filtered=getFilteredWeight();
float spread=getWeightSpread(); float spread=getWeightSpread();
Serial.println(weight_current); //Serial.println(weight_current);
Serial.print("spread="); Serial.println(spread,3); //Serial.print("spread="); Serial.println(spread,3);
@ -216,6 +205,91 @@ void loopHandler() {
powerOff(); powerOff();
} }
if (loopmillis > last_displayupdate + DISPLAYUPDATEINTERVAL) {
last_displayupdate=loopmillis;
uint8_t displayresolution=3; //how many digits after dot
float numberdisplay=weight_current;
bool _negative=false;
if (numberdisplay<0) {
numberdisplay*=-1;
_negative=true;
Serial.print("negative, ");
}
Serial.print("numberdisplay="); Serial.print(numberdisplay);
if (numberdisplay>999.9 | displayresolution==0) {
Serial.print(", 1k");
display.showNumberDec((int)(numberdisplay+0.5), false); //just diplay number
}else{
Serial.print(", low-");
uint8_t d1=0;
uint8_t d2=0;
uint8_t d3=0;
uint8_t d4=0;
if(numberdisplay<10 && displayresolution>=3) { // 5.241, 0.005 etc.
Serial.print("<10");
int _number=(int)(numberdisplay*1000+0.5); //in 1000th kg rounded
Serial.print(" = "); Serial.print(_number);
d1=_number%10;
d2=(_number/10)%10;
d3=(_number/100)%10;
d4=(_number/1000)%10;
display_data[3] = display.encodeDigit(d1); //rightmost digit
display_data[2] = display.encodeDigit(d2);
display_data[1] = display.encodeDigit(d3);
display_data[0] = display.encodeDigit(d4); //leftmost digit
display_data[0] |= SEG_DP; //add decimal point after left most digit
}else if(numberdisplay<100 && displayresolution>=2) { //10.24, 99.20
Serial.print("<100");
int _number=(int)(numberdisplay*100+0.5); //in 100th kg rounded
Serial.print(" = "); Serial.print(_number);
d1=_number%10;
d2=(_number/10)%10;
d3=(_number/100)%10;
d4=(_number/1000)%10;
display_data[3] = display.encodeDigit(d1); //rightmost digit
display_data[2] = display.encodeDigit(d2);
display_data[1] = display.encodeDigit(d3);
display_data[1] |= SEG_DP; //add decimal point after second digit from the left
display_data[0] = display.encodeDigit(d4); //leftmost digit
if (d4==0) { //number smaller than 1000
display_data[0]={0}; //turn off left segment
}
}else if (numberdisplay<1000 && displayresolution>=1) //100.0, 999.9
{
Serial.print("<1000");
int _number=(int)(numberdisplay*10+0.5); //in 10th kg rounded
Serial.print(" = "); Serial.print(_number);
d1=_number%10;
d2=(_number/10)%10;
d3=(_number/100)%10;
d4=(_number/1000)%10;
display_data[3] = display.encodeDigit(d1); //rightmost digit
display_data[2] = display.encodeDigit(d2);
display_data[2] |= SEG_DP; //add decimal point after second digit from the right
display_data[1] = display.encodeDigit(d3);
display_data[0] = display.encodeDigit(d4); //leftmost digit
if (d4==0) { //number smaller than 1000
display_data[0]={0}; //turn off left segment
if (d3==0) { //number smaller than 100
display_data[1]={0}; //turn off 2nd from left segment
}
}
}
if (_negative) { //show negative number by using rightmost dot
display_data[3] |= SEG_DP;
}
/*
*/
Serial.println();
display.setSegments(display_data);
}
}
/* /*
scale.power_down(); // put the ADC in sleep mode scale.power_down(); // put the ADC in sleep mode
@ -323,8 +397,8 @@ bool cmdHandler(const HomieRange& range, const String& value) {
} }
void powerOff() { void powerOff() {
Serial.println("Turning Off"); //Serial.println("Turning Off");
Serial.flush(); //Serial.flush();
delay(100); delay(100);
digitalWrite(PIN_SELFENABLE, LOW); digitalWrite(PIN_SELFENABLE, LOW);
} }