• 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
Komparator czestotliwosci
#11
Caly program mi dziala oprocz Tego :

chdzi mi o to? ze jesli okres: (hal high + high low , a wiec czas low + czas High)

hal high + hal low > 1000ms wtedy taktout = 1
delay(1200)
a jesli 
hal high + hal low  <1000ms  wtedy taktout = 0
delay(1200)

nie wiem czy to zrozumiale ? mam nadzieje ze tak Smile
Jakby kolega wyzej na posiedzeniu doradzil cos jeszcze , jakos pomogl Smile 
bylbym wdzieczny Smile

Hardware jest OK
-------------------------------------------
a ponizej tak jak to teraz jest:

#define capin 25
#define lion 26
#define zas  33
#define lad 23
int hamin = 16; 
int hamout = 32; 
int hamuj = 0; 
#define capout 22
#define hal 15
#define go 18

int stanAktualnyhal, stanPoprzednihal, taktout, golow, gohigh ;
uint32_t teraz, poprzednio, roznica;

void setup()

{
pinMode(lion, INPUT) ;
  pinMode(zas, OUTPUT)  ;
  pinMode(lad, OUTPUT) ;
  pinMode(hamout, OUTPUT);
  pinMode(hamin, INPUT);
  pinMode(capin, INPUT) ;
  pinMode (capout, OUTPUT);
 pinMode(hal, INPUT) ;
  pinMode(go, OUTPUT);
  //zmienna stanAktualnyhal ma poczatkowa wartosc 0, sprawdzdamy wstepnie co jest na pinie
  stanAktualnyhal= digitalRead(hal);
  stanPoprzednihal=stanAktualnyhal;
}







void loop() {

teraz=millis();
//po wejsciu w loop patrzymy na pierwsza zmiane
stanAktualnyhal= digitalRead(hal);
if(stanAktualnyhal == stanPoprzednihal)
{
// stan sie nie zmienil, jesli to potrwa powyzej 100ms to mamy <10Hz
if(( teraz-poprzednio)>500 );
taktout = 0;

}
else
{
  if(( teraz-poprzednio)<=500);
   taktout = 1;
  //stan sie zmienil, zapiszmy czas
 poprzednio=teraz;
}
 
#12
Zapomnij w końcu o tym delay. Jak to ma być 10Hz i sterownik bardziej skomplikowany to bez przerwań się nie obejdzie.
Zacznij od mojej formatki z czas(), dwa przykłady pokazują jak to używać, jedna funkcja w której jest wywowałany millis, a potem można korzystać z flag, że w tym obiegu loop jest nowy okres czasu 10ms, nowa sekunda, minuta, godzina, co tam sobie jeszcze wymyślisz:
Kod:
uint32_t czasTeraz,czasPoprzedni,tik=10; //tik musi byc mniejszy niz 1000 i dzilic 1000ms na rowne czesci
uint8_t nTik,sekundy,minuty,godziny,dni; //liczniki tikow, sekund, itd.
bool fnTik,fsekundy,fminuty,fgodziny,fdni; //flagi zdarzen nowy tik, nowa sekunda,minuta, godzina, dzien
char napis[10];
void czas();
#define led 2

void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
pinMode(led,OUTPUT);


}

void loop() {
czas(); // na poczatku loop


if(fsekundy) {
sprintf(napis,"%03d:%02d:%02d ",godziny,minuty,sekundy);
Serial.println(napis);

}

if(fnTik and nTik% 20 ==0) //czyli co 200ms
{
  digitalWrite (led, ! digitalRead(led));//wgra odczytany stan led na przeciwny !
}
}


void czas()
{
czasTeraz=millis();
fnTik=fsekundy=fminuty=fgodziny=fdni=0;
if((uint32_t)(czasTeraz-czasPoprzedni)>=tik) //tan napisany warunek jest odporny na "klątwe 50 dni millis()"
{
  czasPoprzedni=czasTeraz;
  fnTik=1;
  nTik++;
  if(nTik>=(1000/tik))
  {
    nTik=0;
    sekundy++;
    fsekundy=1;
     if (sekundy>=60)
    {
      sekundy=0;
      minuty++;
      fminuty=1;
      if (minuty>=60)
      {
        minuty=0;
        godziny++;
        fgodziny=1;
        if (godziny>=24)
        {
          godziny=0;
          fdni=1;
          dni++;
   
        }
      }
    }
  }
}
}
Lepiej tu użyć przerwania zewnętrznego, bo jak program rozbudujesz, to możesz nie zauważyć krótkiego impulsu, a i tak masz ten próg 10Hz, więc nie musisz znać dokładnie czasu obrotu, wystarczy że wiesz,  <> od tych 10Hz.
Google wrzuca ten temat:
https://randomnerdtutorials.com/interrup...e-nodemcu/
Ja akurat do testów użyję wiatromierza.
Miło być decenianym https://buycoffee.to/kaczakat
 
#13
Kradniemy z linka sposób tworzenia obsługi przerwania PCI dla ESP8266, tylko my zrobimy to starą szkołą nie wywołując długich funkcji  w przerwaniach (żadnych w szczególności) i używając zmiennej volatile:
Kod:
uint32_t czasTeraz,czasPoprzedni,tik=10; //tik musi byc mniejszy niz 1000 i dzilic 1000ms na rowne czesci
uint8_t nTik,sekundy,minuty,godziny,dni; //liczniki tikow, sekund, itd.
bool fnTik,fsekundy,fminuty,fgodziny,fdni; //flagi zdarzen nowy tik, nowa sekunda,minuta, godzina, dzien
char napis[20]; //zwiekszymy bufor na wiecej tekstu
void czas();
#define led 2

/*
* attachInterrupt(digitalPinToInterrupt(GPIO), ISR, mode);
* CHANGE: to trigger the interrupt whenever the pin changes value – for example from HIGH to LOW or LOW to HIGH;
FALLING: for when the pin goes from HIGH to LOW;
RISING: to trigger when the pin goes from LOW to HIGH.
*/
volatile int licznik; //zmienna volatile do przerwania

ICACHE_RAM_ATTR void zliczanko() //funkcja obslugi przerwania
{
  licznik++;
}

const uint8_t triggerPin=D7;

uint8_t prog=10;//zmienna prog zadzialania

void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
pinMode(led,OUTPUT);
pinMode(triggerPin,INPUT_PULLUP);
// wiatraczek ma zwarcie na pinach i przelatujac obok magnasu rozlacza, podlaczam go do GND i do pinu 13, szukam zdarzenia gdy na pinie pojawi sie logiczna 1
attachInterrupt(digitalPinToInterrupt(triggerPin), zliczanko, RISING);

}

void loop() {
czas(); // na poczatku loop


if(fsekundy) {
bool akcja=0; // zmienna reprezentujaca wynik porownania 
  if(licznik>prog) akcja=1;
 
sprintf(napis,"%03d:%02d:%02d - %02d = %d ",godziny,minuty,sekundy,licznik, akcja);
Serial.println(napis);
licznik =0; //zerujemy licznik impulsow co 1s
}

if(fnTik and nTik% 5 ==0)  //migamy co 100ms
{
  digitalWrite (led, ! digitalRead(led));//wgra odczytany stan led na przeciwny !
}
}


void czas()
{
czasTeraz=millis();
fnTik=fsekundy=fminuty=fgodziny=fdni=0;
if((uint32_t)(czasTeraz-czasPoprzedni)>=tik) //tan napisany warunek jest odporny na "klątwe 50 dni millis()"
{
  czasPoprzedni=czasTeraz;
  fnTik=1;
  nTik++;
  if(nTik>=(1000/tik))
  {
    nTik=0;
    sekundy++;
    fsekundy=1;
     if (sekundy>=60)
    {
      sekundy=0;
      minuty++;
      fminuty=1;
      if (minuty>=60)
      {
        minuty=0;
        godziny++;
        fgodziny=1;
        if (godziny>=24)
        {
          godziny=0;
          fdni=1;
          dni++;
   
        }
      }
    }
  }
}
}
Jak się boisz, że może zdarzyć się sekunda, gdzie nawiniesz 11 impulsów, a kolejna z 0, i nie będą to te same odcinki czasu co w programie, skutkiem czego nie zauważysz chwilowego przekroczenia 10 impulsów, to można te impulsy zapisywać w tablicę co 100ms, każdy x10, po zebraniu całej tablicy nadpisywać od 0 do 9 co kolejne 100ms i wyciągać średnią co 100ms. Wtedy co 100ms będziesz miał wynik poprzedniej sekundy.
Jak podłączysz pin wejścia impulsów do pinu LED, to w tym przykładzie jest ustawione 10 mignięć led, możesz sprawdzić, czy przerwanie działa prawidłowo:
Z wiatraczkiem:
Kod:
000:01:05 - 05 = 0
000:01:06 - 08 = 0
000:01:07 - 07 = 0
000:01:08 - 11 = 1
000:01:09 - 08 = 0
000:01:10 - 06 = 0
000:01:11 - 04 = 0
000:01:12 - 04 = 0
000:01:13 - 02 = 0
000:01:14 - 03 = 0
000:01:15 - 02 = 0
000:01:16 - 02 = 0
000:01:17 - 01 = 0
000:01:18 - 01 = 0
Z ledem:
Kod:
000:09:42 - 10 = 0
000:09:43 - 10 = 0
000:09:44 - 10 = 0
000:09:45 - 10 = 0
000:09:46 - 10 = 0
000:09:47 - 10 = 0
000:09:48 - 10 = 0
000:09:49 - 10 = 0
000:09:50 - 10 = 0
000:09:51 - 10 = 0
000:09:52 - 10 = 0
000:09:53 - 10 = 0
Mój wiatraczek daje ładne impulsy i nie zdarza mu się robić żadnych drgań, jeśli masz inaczej to jeszcze trzeba z tym powalczyć, dodać filtr sprzętowy lub obsłużyć to programowo ignorując zbyt dużą liczbę impulsów po tym pierwszym.
Mając taki szkielet programu możesz dodawać kolejne moduły programu bez delay i cieszyć się działaniem nie zważając, w pewnym stopniu, co robi inny. Jeśli potrzebujesz robić coś przez 1s, 10s od wykrycia jakiegoś stanu w programie to nie wracaj do delay, zapisz sobie stan sekund gdy stan został wykryty, aktywuj co tam chcesz i sprawdzaj ile czasu upłynęło od chwili uruchomienia. Jak sekunda to za długo jest flaga 10ms i liczba dziesiątek ms, jest niestety zerowana co 1s, ale mozesz wstawić swoją zmienną zliczającą dziesiątki ms bez końca. Ostatecznie można znowu użyć mills() czy micros();.
Miło być decenianym https://buycoffee.to/kaczakat
 
#14
Tolerancja nie jest taka wazna Smile byle 50% .

z tym delayem to tak dla przykladu tylko tam dalem jako opoznienie .

Zdaje sobie sprawe ze ta funkcja musi dzialac jakby rownolegle na wlasnych zasadach, 

Bede rozgryzal te przyklady Smile ! , lubie to- bo na przykladach sie lepiej mi uczy .

Bo jak stara bajka mowi , -  daj czlowiekowi Rybe ! to ja zje, i dalej bedzie glodny.

a daj mu wedke! to sam zacznie lowic   Wink
 
#15
Bede to cwiczyl , ale narazie to zrobie to na krotko, i zamienie te impulsy na igly, puszcze przez opornik na condensator , obetne dioda ujemne i dam to na wejscie analogowe i gotowe. Co nie znaczy ze nie warto sie tego nauczyc.

Ale narazie wolny czas wolalbym poswiecic na wyswietlanie na androidzie poprzez bluetoth, stan napiec na kilku wybranych wejsciach.

Jakby ktos mial jakiegos fajnego gotowca ! Smile poprostu 3  duze 3 cyfrowe wyswietlacze, i nic innego

1. 01,2 V
2. 02,1 V
3 06,6 V

dla przykladu i odswierzanie co sekunde

DUZE LADNE CYFRY NA BIALYM TLE I TYLE Smile

edit.

znalazlem cos takiego wydaje sie bardzo ciekawego ale? wyskakuja bledy podczas kompilacji ,
a to juz dla mnie naprawde wyzsza szkola jazdy.

w pliku ponizej jest caly projekt

edit 2

cos mnie sie zdaje ze mi brakuje wielu bibliotek!

Mozna je pobrac wszystkie tak z automatu wszystkie czy jedna po drugiej recznie??
albo moze i inny problem mam, ktorego chyba juz nie wymysle sam.

tam w tym rarze sa 3 rozne pliki.


Załączone pliki
.zip   BatteryMonitor-master.zip (Rozmiar: 7.07 MB / Pobrań: 4)
 
#16
Witam znow.

Znalazlem kilka gotowcow na ktorych moglbym sie pobawic,
ale nie mam pojecia w jaki sposob dodac te biblioteki z zewnatrz!

Mam te wszystkie biblioteki w postaci codu, ale ni w te ni we wte
ciagle jakies bledy .
A rozumie ze taka biblioteka musi byc gdzies tam zainstalowana,
a nie tylko przekopiowana do katalogu Library ?

Nie wie co dalej , ani google ani nigdzie nic wiecej nie pisza , poza dodaj zipa i tyle...

Jak ktos czyta jeszcze ten temat to prosze o pomoc.

Na koncu jak bedzie wszystko dzialac - podziele sie caloscia w jednym watku i zakoncze ten temat.

Ktory i tak mi juz duzo dal , bo cos nie cos umie juz napisac sam Smile

Pozdrawiam.
 
#17
A zainstalować Arduino skąd umiałeś? Jak nic nie umiesz to po są kursy i tutoriale, Trzeba mieć jakieś podstawy, by przynajmniej wiedzieć, czego się nie wie, po to są kursy Arduino, w postaci blogu: https://forbot.pl/blog//kurs-arduino-pod...rsu-id5290
vlogu: https://www.youtube.com/@elektromaras/videos
Forum jest by dopytać szczegółów, serio wydaje Ci się optymalnie opisywać to Tobie indywidualnie, jeśli takich tutoriali jak przykłady powyżej jest na pęczki po polsku, a po angielsku na tony.
Biblioteki dodajesz przez managera bibliotek w Arduino IDE, jest wyszukiwarka po nazwie i sam ściągnie wskazana, jest tam też opcja dodaj z zip jak już ściągnąłeś, można też wgrać do katalogu library ręcznie i uruchomić program.
Miło być decenianym https://buycoffee.to/kaczakat
 
#18
Staram sie jak moge ! Smile

ale tyle roznych ... problemikow?

np. to:

[attachment=1452]

Jak temu zaradzic?
 
#19
Czemu Ty nie śpisz po nocach?
Z obrazka wiele się nie dowiemy, wklej w jedno okno kodu kod, w drugie błędy.
Napisz jakie masz Arduino, zaczynaliśmy od zwykłej płytki (tak ja myślałem), potem ESP, teraz BLE - a to chyba ESP32.
Edit:
No ale z obrazka coś widać, np. masz wersję core ESP jakąś ALFA, ja mam najnowszą 2.0.14, może zostałeś betatesterem ekperymentalnej wersji, to nie jest najlepszy pomysł, upewnij się, że masz wpisany prawidłowy link do core ESP32:
https://espressif.github.io/arduino-esp3...index.json
Ewentualnie potem znajdź ten katalog, wyłącz Arduino, skasuj ten pakiet, zainstaluj 2.0.14 lub starszą.
Musisz zerknąć kiedy powstał ten projekt, który chcesz sobie wziąć, jeśli dawno, to mógł korzystać ze starej wersji core, one się zmieniają, jedne funkcje wylatują, inne są dodawane. Można to odpalić, ale trzeba zebrać cały zestaw taki sam jak autor projektu - core płytki i  biblioteki z tej samej wersji co użyte w projekcie. Czasami jest sporo kombinacji, ale zazwyczaj jest OK.
Edit2
Tak zakładając, że chodzi Ci o pliki, które załączyłeś wyżej w zip do monitorowania baterii, to u mnie wszystko się kompiluje, core ESP32 2.0.14, płytka  Doit ESP32 devkit1, tylko w batteryMonitorInternalADC były jakieś śmieci na końcu pliku, co widać porównując do innych, bo na końcu jest ta sama funkcja:
   
Miło być decenianym https://buycoffee.to/kaczakat
 
#20
Dzieki

Ucze sie , kombinuje , czytam uwaznie wszystko co piszesz, ale i tak niekiedy nie ogarniam.

Chcialem skompilowac ten ADC wlasnie, 
i zmienilem to core , ustawilem board jak podpowiedziales, 
i dalej to samo .


dodatkowe fotki .

Rozumie ze to nie brak biblioteki ? : bo ja je tylko przekopiowalem do katalogu library , nie znalazlem opcji co by
je jakos zainstalowac. Wszedzie na internecie pisze dodac ZIP co dla mnie oznacza wszystko i nic.

Prosze w razie czasu zerknac, jakie foty ewentualnie pliki(katalogi) z kompa doslac ?

Bede bardzo wdzieczny jak ten monitor odpale.
Na komurce dziala apka.

Pozdrawiam
Wojtek
   
   
 
  


Skocz do:


Przeglądający: 2 gości