Jak zapętlić fukcje nie używając void loop() - Arduino/Supla

Ryrzy
Posty: 147
Rejestracja: wt lis 07, 2017 10:40 am

pt paź 25, 2019 2:07 pm

Panowie, pytanko...
jak zrobić loop jakiejś funkcji jak dodanie tego do void loop() powoduje crashe ? (kilka odczytów i wysypuje sie esp, restart). Coś, gdzieś mi się przewinęło, że w supli nie powinno się używać loopa :) modyfikuje kod Primary GUI v2 jeśli to ma znaczenie.
Kod, który chce wkleic w kod to:

Kod: Zaznacz cały

#include <Wire.h>
#include <Adafruit_INA219.h>

Adafruit_INA219 ina219;


void setup(void) 
{
  Serial.begin(115200);
  while (!Serial) {
      // will pause Zero, Leonardo, etc until serial console opens
      delay(1);
  }

  uint32_t currentFrequency;
    
  Serial.println("Hello!");
  
  // Initialize the INA219.
  // By default the initialization will use the largest range (32V, 2A).  However
  // you can call a setCalibration function to change this range (see comments).
  ina219.begin();
  // To use a slightly lower 32V, 1A range (higher precision on amps):
  //ina219.setCalibration_32V_1A();
  // Or to use a lower 16V, 400mA range (higher precision on volts and amps):
  //ina219.setCalibration_16V_400mA();

  Serial.println("Measuring voltage and current with INA219 ...");
}

void loop(void) 
{
  float shuntvoltage = 0;
  float busvoltage = 0;
  float current_mA = 0;
  float loadvoltage = 0;
  float power_mW = 0;

  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  power_mW = ina219.getPower_mW();
  loadvoltage = busvoltage + (shuntvoltage / 1000);
  
  Serial.print("Bus Voltage:   "); Serial.print(busvoltage); Serial.println(" V");
  Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
  Serial.print("Load Voltage:  "); Serial.print(loadvoltage); Serial.println(" V");
  Serial.print("Current:       "); Serial.print(current_mA); Serial.println(" mA");
  Serial.print("Power:         "); Serial.print(power_mW); Serial.println(" mW");
  Serial.println("");

  delay(2000);
}
błędy:

Kod: Zaznacz cały

Zainicjowany

Uruchamianie serwera...
Rozłączony
Connection fail. Server: svr10.supla.org
Bus Voltage:   4.98 V
Shunt Voltage: 3.97 mV
Load Voltage:  4.99 V
Current:       31.10 mA
Power:         160.00 mW

Bus Voltage:   4.98 V
Shunt Voltage: 4.11 mV
Load Voltage:  4.98 V
Current:       25.80 mA
Power:         150.00 mW

Bus Voltage:   4.98 V
Shunt Voltage: 4.01 mV
Load Voltage:  4.99 V
Current:       36.90 mA
Power:         210.00 mW

WiFi connected SSID: 
Exception (9):
epc1=0x40105708 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000003 depc=0x00000000

>>>stack>>>

ctx: sys
sp: 3fffece0 end: 3fffffb0 offset: 01a0
3fffee80:  40105934 0043ccf1 3fff216c 00000000  
3fffee90:  3fff04a0 3fff216c 00000400 402206be  
3fffeea0:  00000000 004352df 40214c64 00000064  
3fffeeb0:  3fff216c 3fff1184 3fff0658 4020b38d  

(...)

<<<stack<<<
krycha88
Posty: 691
Rejestracja: pt lis 16, 2018 7:25 am

pt paź 25, 2019 3:30 pm

Czy to jest cały kod z loop'a?
Awatar użytkownika
Espablo
Posty: 1465
Rejestracja: śr cze 29, 2016 5:04 pm
Lokalizacja: Oświęcim
Kontaktowanie:

pt paź 25, 2019 3:33 pm

Po pierwsze wywal tego delay(2000); i staraj się nigdy o ile to możliwe nie używać instrukcji delay. Zrób sobie jakąś zmienną i zwiększa ją za każdym obiegiem programu. Jak zmienna osiągnie np 2000 to wykonaj to co masz w loopie i przypisz 0 do tej zmiennej. Tak żeby odliczanie startowało od początku. Możesz tu także wykorzystać Timery
Każde urządzenie elektryczne działa o wiele lepiej jeśli podłączysz je do prądu. :? :roll:
https://github.com/Espablo
Ryrzy
Posty: 147
Rejestracja: wt lis 07, 2017 10:40 am

pt paź 25, 2019 3:46 pm

krycha88 pisze:
pt paź 25, 2019 3:30 pm
Czy to jest cały kod z loop'a?
do loopa oczywiscie nie wrzucam wszystkiego z w/w kodu :D zrobilem to tak ze do loopa dalem

Kod: Zaznacz cały

  pomiar();
i oczywiscie w kodzie:

Kod: Zaznacz cały

void pomiar() {
  float shuntvoltage = 0;
  float busvoltage = 0;
  float current_mA = 0;
  float loadvoltage = 0;
  float power_mW = 0;

  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  power_mW = ina219.getPower_mW();
  loadvoltage = busvoltage + (shuntvoltage / 1000);
  
  Serial.print("Bus Voltage:   "); Serial.print(busvoltage); Serial.println(" V");
  Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
  Serial.print("Load Voltage:  "); Serial.print(loadvoltage); Serial.println(" V");
  Serial.print("Current:       "); Serial.print(current_mA); Serial.println(" mA");
  Serial.print("Power:         "); Serial.print(power_mW); Serial.println(" mW");
  Serial.println("");
  
    delay(2000);

}
sugerując sie poradą @espablo wywalilem to delay(2000); i cholewa... działa... oczywiscie leci log jak oszalały ale dziala! teraz tylko opanuje licznik jak zasugerowal i powinno byc git :) ale to juz musze podstaw podstaw sie pouszczyc i poogladac przyklady ;)
krycha88
Posty: 691
Rejestracja: pt lis 16, 2018 7:25 am

pt paź 25, 2019 3:50 pm

Ryrzy pisze:
pt paź 25, 2019 3:46 pm
krycha88 pisze:
pt paź 25, 2019 3:30 pm
Czy to jest cały kod z loop'a?
do loopa oczywiscie nie wrzucam wszystkiego z w/w kodu :D zrobilem to tak ze do loopa dalem

Kod: Zaznacz cały

  pomiar();
i oczywiscie w kodzie:

Kod: Zaznacz cały

void pomiar() {
  float shuntvoltage = 0;
  float busvoltage = 0;
  float current_mA = 0;
  float loadvoltage = 0;
  float power_mW = 0;

  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  power_mW = ina219.getPower_mW();
  loadvoltage = busvoltage + (shuntvoltage / 1000);
  
  Serial.print("Bus Voltage:   "); Serial.print(busvoltage); Serial.println(" V");
  Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
  Serial.print("Load Voltage:  "); Serial.print(loadvoltage); Serial.println(" V");
  Serial.print("Current:       "); Serial.print(current_mA); Serial.println(" mA");
  Serial.print("Power:         "); Serial.print(power_mW); Serial.println(" mW");
  Serial.println("");
  
    delay(2000);

}
sugerując sie poradą @espablo wywalilem to delay(2000); i cholewa... działa... oczywiscie leci log jak oszalały ale dziala! teraz tylko opanuje licznik jak zasugerowal i powinno byc git :) ale to juz musze podstaw podstaw sie pouszczyc i poogladac przyklady ;)
Właśnie ta reszta kodu była ważna :-) bo jeżeli wykorzystujesz bibliotekę SuplaDevice to nie możesz dawać delay tylko musisz zrobić jak napisał @espablo
Ryrzy
Posty: 147
Rejestracja: wt lis 07, 2017 10:40 am

pt paź 25, 2019 3:52 pm

krycha88 pisze:
pt paź 25, 2019 3:50 pm
Właśnie ta reszta kodu była ważna :-) bo jeżeli wykorzystujesz bibliotekę SuplaDevice to nie możesz dawać delay tylko musisz zrobić jak napisał @espablo
to sie czlowiek znow czegos nauczyl :) sprobuje sobie to sam ogarnac z tym licznikiem moze sie uda :) dziękuje bardzo za naprowadzenie, nie sadziłem ze to 'opóźnienie' moze być takim problemem :)
krycha88
Posty: 691
Rejestracja: pt lis 16, 2018 7:25 am

pt paź 25, 2019 3:57 pm

Można to też zrobić za pomocą millis()

https://forbot.pl/blog/kurs-arduino-ii- ... is-id18418
Ryrzy
Posty: 147
Rejestracja: wt lis 07, 2017 10:40 am

sob paź 26, 2019 9:04 am

krycha88 pisze:
pt paź 25, 2019 3:57 pm
Można to też zrobić za pomocą millis()

https://forbot.pl/blog/kurs-arduino-ii- ... is-id18418
strzał w 10 ;)
korzystając z przykładów zrobiłem w loopie

Kod: Zaznacz cały

 
  (...)
    aktualnyCzas = millis();
 (...)
  if (aktualnyCzas - licznik_pomiaru >= 10000UL) {
    licznik_pomiaru = aktualnyCzas;
    pomiar();
  }
i działa super :) co 10 sekund odczyt :)
dziekuje za podpowiedz
ODPOWIEDZ