// Projekt úlové váhy // potřebné knihovny #include "HX711.h" #define calibration_factor -36000 #define DOUT 3 #define CLK 2 HX711 scale; #include #include // nastavení adresy I2C (0x27 v mém případě), // a dále počtu znaků a řádků LCD, zde 20x4 // LiquidCrystal_I2C lcd(0x27, 20, 4); // A 4,5 (?) display SCL, SDA LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); double pocatek,hodnota,h; int d,p; String t; double vaha[16]; #include #include #include #define LED_PIN (13) // pojmenování pinu 13 // zde se bude ukládat zda přišel impuls z watchdog timeru // hodnota 1 simuluje impuls po zapnutí, aby jsme nečekali volatile int impuls_z_wdt=1; // zde se ukládají impulsy volatile int citac_impulsu= 1000; // začínáme měřením // zde nastavíme potřebný počet impulsů // podle nastavení WDT viz níže je jeden impuls 8 sekund volatile int impulsu_ke_spusteni = 692; // 1,5 hodiny /* klíčové slovo volatile říká kompilítoru jak má zacházet z proměnou načte proměné z paměti RAM a ne z paměťového registru. Vzhledem k spánkovému režimu budou tyto hodnoty určitě poté přesné. */ // impuls z WATCHDOG TIMERU ///////////////// ISR(WDT_vect) { //když je proměnná impuls_z_wdt na 0 if(impuls_z_wdt == 0) { // zapiš do proměnné 1 impuls_z_wdt=1; } } void enterSleep(void) { //nastavení nejúspornějšího módu set_sleep_mode(SLEEP_MODE_PWR_DOWN); // spánkový režim je povolený sleep_enable(); // spuštění režimu spánku sleep_mode(); // tady bude program pokračovat když se probudí Serial.print(" "+String(citac_impulsu)); delay(10); // spánek zakázán sleep_disable(); //znovu zapojení všech funkcí power_all_enable(); } void setup() { Serial.begin(9600); //nastaví pin 13 jako výstup pinMode(LED_PIN,OUTPUT); // nastavení WATCHDOG TIMERU MCUSR &= ~(1< 1 sekunda WDTCSR |= _BV(WDIE); //neřešte scale.begin(DOUT, CLK); scale.set_scale(calibration_factor); scale.tare(); //Předpokládejme, že na váze při spuštění není zátěž, vynulujte váhu na 0 // inicializace LCD lcd.begin(20, 4); // zapnutí podsvícení lcd.backlight(); for (int i = 1; i <16; i ++){ vaha[i]=vaha[0]; } vaha[0]=scale.get_units(); } void loop() { //když je impuls z WATCHDOG TIMERU a zároveň i potřebný jejich počet if ((impuls_z_wdt == 1) & (impulsu_ke_spusteni <= citac_impulsu)) { /////////////////////////////////////////////////////////////// hodnota=scale.get_units(); Serial.println(" "); Serial.print("Čtení: "); Serial.print(hodnota, 2); Serial.print(" kg"); Serial.println(); for (int i = 1; i <16; i ++) vaha[i-1]=vaha[i]; vaha[15]=hodnota; p=0; for (int s = 0; s <=3; s ++){ for (int r = 0; r <=3; r ++){ if (p==0) h=vaha[0]; else h=vaha[p]-vaha[0]; t=String(h, 1); d=t.length(); t=" "+t; t=t.substring(d-3); lcd.setCursor(5*s,r); lcd.print (t); p=p+1; } } ////////////////////////////////////////////////////////////// citac_impulsu = 0;// vynuluj čítač impuls_z_wdt = 0; // vynuluj impuls enterSleep();// znovu do spánku } else { impuls_z_wdt = 0; // vynuluj impuls enterSleep();//znovu do spánku } citac_impulsu++; // inpuls se přičte i když nic neproběhlo }