• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
ESP8266EX + BL0397, czyli smart gniazdko i problem z pomiarem prądu
#11
(28-11-2019, 00:00)Robson Kerman napisał(a): Edit: Działają za to przerwania na prawie każdym pinie i bardzo łatwo jest napisać funkcję, która w przerwaniu będzie mierzyła częstotliwość, potem tylko miernik w dłoń aby skalibrować wyniki i będziesz miał swój monitoring gniazdka.
Podpowiem wszystko co i jak. Napisałem takową funkcję i działa, sprawdzałem z oscyloskopem, to błąd jest w okolicach 0,5%. Można go zmniejszyć ale kosztem częstotliwości próbkowania.

Podzielisz się kodem tej funkcji?? Ewentualnie podpowiedz jak zacząć
 
Odpowiedź
#12
A już skasowałem ten kod, ale coś wymyślimy.

Na początek zadeklarujemy zmienne jako volatile.

Kod:
volatile unsigned long currentTime = 0;
volatile unsigned long lastTime = 0;
volatile unsigned long periodTime = 0;
volatile uint_8t i = 0;

Myślę, że nie trzeba tu nic komentować.

Zdefiniujmy nazwę dla jakiegoś pinu z przerwaniem.

Kod:
#define jakis_pin 14

Definiujemy funkcję obsługi przerwania.
Z każdym narastającym impulsem inkrementowana  jest zmienna i. 
periodTime przechowuje czas między pierwszym a dziesiątym impulsem.
Kod:
ICACHE_RAM_ATTR void przerwanie() {
  i++;
  if (i==0) currentTime = millis;
  if (i==10)
  {
    lastTime = millis;
    periodTime = lastTime - currentTime;
    i = 0;
  }
}
Tak ze złośliwości nie napiszę co to za ustrojstwo ICACHE_RAM_ATTR, więc sobie poczytaj dla czego to makro jest niezbędne dla obsługi przerwań w ESP.

W setupie trzeba poustawiać wejścia i włączyć przerwanie od jakiegoś pinu.

Kod:
void setup() {

    pinMode(jakis_pin, INPUTP);
    attachInterrupt(digitalPinToInterrupt(jakis_pin), przerwanie, FALLING);
}


Po dziesięciu przerwaniach możemy już policzyć częstotliwość (jest to odwrotność czasu, jak by co).


Kod:
void loop() {
  int frequency = 10000/periodTime;
}

Ogólnie mam wrażenie, że ten kod zadziała, ale pokusiłbym się na przeniesienie tego i++ chyba 8 linii w dół.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#13
Witam ponownie,

po drobnej kosmetyce, udało się to skompilować, wgrać, ale serial monitor wyrzuca same błędy
Kod:
06:25:29.128 ->
06:25:29.128 ->  ets Jan  8 2013,rst cause:2, boot mode:(3,6)
06:25:29.128 ->
06:25:29.128 -> load 0x4010f000, len 1384, room 16
06:25:29.128 -> tail 8
06:25:29.128 -> chksum 0x2d
06:25:29.128 -> csum 0x2d
06:25:29.128 -> v8b899c12
06:25:29.128 -> ~ld
06:25:29.162 ->
06:25:29.162 -> Exception (0):
06:25:29.162 -> epc1=0x4000dce5 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
06:25:29.196 ->
06:25:29.196 -> >>>stack>>>
06:25:29.196 ->
06:25:29.196 -> ctx: cont
06:25:29.196 -> sp: 3ffffe00 end: 3fffffc0 offset: 01a0
06:25:29.196 -> 3fffffa0:  feefeffe feefeffe feefeffe 40201878 
06:25:29.196 -> 3fffffb0:  feefeffe feefeffe 3ffe84f4 40100795 
06:25:29.196 -> <<<stack<<<
06:25:29.196 ->
06:25:29.196 ->  ets Jan  8 2013,rst cause:2, boot mode:(3,6)
06:25:29.196 ->
06:25:29.196 -> load 0x4010f000, len 1384, room 16
06:25:29.230 -> tail 8
06:25:29.230 -> chksum 0x2d
06:25:29.230 -> csum 0x2d
06:25:29.230 -> v8b899c12
06:25:29.230 -> ~ld
06:25:29.264 ->
06:25:29.264 -> Exception (0):
06:25:29.264 -> epc1=0x4000dce5 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
06:25:29.264 ->
06:25:29.264 -> >>>stack>>>
06:25:29.264 ->
06:25:29.264 -> ctx: cont
06:25:29.264 -> sp: 3ffffe00 end: 3fffffc0 offset: 01a0
06:25:29.264 -> 3fffffa0:  feefeffe feefeffe feefeffe 40201878 
06:25:29.298 -> 3fffffb0:  feefeffe feefeffe 3ffe84f4 40100795 
06:25:29.298 -> <<<stack<<<
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości