Skocz do zawartości

kaczakat

Użytkownicy
  • Zawartość

    157
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    3

kaczakat wygrał w ostatnim dniu 9 października 2018

kaczakat ma najbardziej lubianą zawartość!

Reputacja

28 Bardzo dobra

O kaczakat

  • Ranga
    5/10

Informacje

  • Płeć
    Mężczyzna

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. kaczakat

    Używanie funkcji millis() do odmierzania czasu

    Faktycznie przykład 2 testowałem na AVR, działa OK też z ESP32, ale WDT ESP8266 wkurza się w while(1), tu WDT jest automatycznie dołączony do kodu, wystarczy zmienić tę linijkę jak napisał @ethanak dodając delay(1) lub yield(): while(1) delay(1);. Dodałem we wcześniejszym kodzie, jakby ktoś tu jeszcze zajrzał.
  2. kaczakat

    Używanie funkcji millis() do odmierzania czasu

    Jeśli ESP ma coś robić tylko co 30min to można go po prostu usypiać na ten czas (powerdown, potem robi reset i zaczyna program od nowa - trochę dziwne, ale dane można przechować w pamięci RTC), jeśli ma działać cały czas wystarczy wynik różnicy rzutować na UL i będzie działać dopóki nie zrobisz resetu lub nie braknie zasilania, na podstawie przykładu BlinkWithoutDelay: const int ledPin = LED_BUILTIN;// the number of the LED pin int ledState = LOW; // ledState used to set the LED uint32_t previousMillis = 0; // will store last time LED was updated const uint32_t interval = 1000UL; // interval at which to blink (milliseconds) void setup() { pinMode(ledPin, OUTPUT); } void loop() { uint32_t currentMillis = millis(); if ((uint32_t)(currentMillis - previousMillis) >= interval) { previousMillis = currentMillis; if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite(ledPin, ledState); } } Jak chcesz sprawdzić jak działa przepełnienie można wykorzystać mniejsze zmienne ze znakiem i bez: Po edycji: //Pretend "counter" is "millis" unsigned char counter; unsigned char roznica; unsigned char previousCounter = 0; unsigned char interval=30; const char interval2=30; void setup() { Serial.begin(115200); delay(2000); // give enough time to open the serial monitor after uploading Serial.println("Starting..."); } void loop() { for (int x=0; x<1000; x++) { // run through uchar a few times // ******* simulate millis() counter++; // simulate millis() Serial.println(counter); // ****** unsigned char currentCounter = counter; // roznica=(currentCounter - previousCounter); if ((unsigned char)(currentCounter - previousCounter) >= interval) { // check for rollover Serial.println("Trigger Event!"); previousCounter = currentCounter; } } Serial.println("...stopping!"); Serial.println(roznica); while(1) delay(1); // Stop the Serial monitor output }
  3. kaczakat

    ESP8266 - totalne podstawy

    ESP32 instaluje się inaczej dla Arduino, jest instrukcja tutaj: https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/windows.md trzeba dokładnie wykonać te kroki i wszystko działa.
  4. kaczakat

    Arduino pro mini 3V3 vs 5V

    W pro mini można wylutować led sygnalizujący zasilanie, podłączyć akumulator 4.2V pod VCC i mierzyć napięcie pinem analogowym w odniesieniu do wewnętrznego Vref 1.1V, w przypadku spadku napięcia poniżej 3V (dla wersji 8MHz) uśpić w trybie power down (należy wyłączyć wszystko zgodnie z poradnikami) i pobór prądu spada poniżej 1uA, akumulator przeżyje nawet miesiące. Z akumulatora LiPo czy Li-Ion już właściwie nie pozyskuje się energii poniżej 3V, każda sztuka może się nieco różnić, ale w pewnym momencie jest prawie pionowy spadek w napięcia, zostanie jakiś zapas na pobór tego uA prądu w trybie wyłączenia. Oczywiście jak jakieś peryferia będą dalej brały prąd to ubiją ogniwo.
  5. Kup sobie sam nowy czujnik i wepnij do płytki. Jak podłączyłeś odwrotnie GND i VCC (5V) to ten czujnik może już być uszkodzony. Kod jest OK, podpięcia nie widać z fotek, jak byś umiał odczytać schemat i go użyć to możesz pokazać co gdzie podpiąłeś na schemacie, albo wykonaj tak zdjęcia by wszystkie połączenia było widać, raczej jest źle już zauważono.
  6. kaczakat

    Sterowanie silnikiem krokowym - 28byj-48 + ULN2003

    ULN2003 to tylko kilka tranzystorów w jednym scalaku, konkretnie 7xDARLINGTON, potrafi po prostu wzmacniać sygnał i omija ograniczenia pinu Arduino - 5V/20mA (bezpiecznie zakładając), może podać spokojnie na coś tam kilkadziesiąt V i 500mA - choć raczej nie jako 7x500mA. Czymś może być zarówno silnik, przekaźnik, LED o większej mocy, ale "driverem" jest Arduino. Jest uniwersalny, nie jest przeznaczony do silników w szczególności. Co innego DRV8825, który jest już prostym driverem, pinami z Arduino wybierasz tryb pracy (ile kroków, jakie kroki/mikrokroki), kierunek i rytm, a resztę robi driver. Przynajmniej ja to tak rozróżniam.
  7. kaczakat

    Sterowanie silnikiem krokowym - 28byj-48 + ULN2003

    ULN2003 to żaden driver (w sensie DRV8825), steruje się to normalnie stanem pinów Arduino, jak w ogóle ledy nie migają to albo coś upalone, albo nie tak podłączone zasilanie, przy złej kolejności silnik by się nie kręcił, ale ledy by migały. Przykłady z biblioteki ruszają od strzału, tylko trzeba podpiąć w dobrej kolejności pod zdefiniowane piny.
  8. Nie wprost Arduino, ale może pomoże jak zrobić sobie takie tony na dowolnym timerze: https://blog.podkalicki.com/attiny13-tone-generator/
  9. Przede wszystkim napisałem, że zmienne mają byc UL bo chodzi by były tego samego typu, nic mądrego nie wyniknie z przypisania m=millis(). Nie wiem co ma to dać: unsigned char roznicaCzasu = 100UL; - zmienna jest 8 bitowa, wartość też, a na siłę robi się z niej UL. No i faktycznie udało się to zepsuć, brawo. Ja testowałem z mircos i nic się nie przepełnia: uint32_t zapamietanyCzas = 0; uint32_t roznicaCzasu = 200000UL; uint32_t licznikmillis,minuty; uint8_t msetki,sekundy,fmsetek; void setup() { pinMode(13, OUTPUT); Serial.begin(115200); } void loop() { fmsetek=0; uint32_t m = micros(); if ((uint32_t)(m - zapamietanyCzas) >= roznicaCzasu) { zapamietanyCzas = m ; fmsetek=1; msetki+=2; if(msetki>=5) { msetki=0; sekundy++; if(sekundy>=60) { sekundy=0; minuty++; } } } if(fmsetek) { digitalWrite(13, ! digitalRead(13)); Serial.println("Wysyłamy trochę danych"); Serial.println("jeszcze trochę..."); Serial.print("Powinno przestac dzialac po 70 minutach, a minelo minut:"); Serial.println(minuty); delayMicroseconds(150000); } } Dokładność z micros jest kiepska, może coś innego jest skopcone, nie będę szukał, idę spać, ale wg stopera w telefonie działa ponad 100minut. Jak komuś szkoda czasu to tu jest opisany prawidłowy sposób przetestowania millis na wartościach 8bit: https://www.baldengineer.com/arduino-how-do-you-reset-millis.html. Zgodnie z tym przykład blinkWithOutDelay odporny na przekręcenie licznika powinien wyglądać tak: // constants won't change. Used here to set a pin number: const int ledPin = LED_BUILTIN;// the number of the LED pin // Variables will change: int ledState = LOW; // ledState used to set the LED // Generally, you should use "unsigned long" for variables that hold time // The value will quickly become too large for an int to store uint32_t previousMillis = 0; // will store last time LED was updated // constants won't change: const uint32_t interval = 1000UL; // interval at which to blink (milliseconds) void setup() { // set the digital pin as output: pinMode(ledPin, OUTPUT); } void loop() { // here is where you'd put code that needs to be running all the time. // check to see if it's time to blink the LED; that is, if the difference // between the current time and last time you blinked the LED is bigger than // the interval at which you want to blink the LED. uint32_t currentMillis = millis(); if ((uint32_t)(currentMillis - previousMillis) >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); } } I tak, przetestowałem go - działa. Bez rzutowania też działał, ale już nie pamiętam, był inny problem przy przekręceniu zakresu zmiennej, chyba własnie nie doliczał do pełnej sekundy.
  10. Co jakiś czas widzę marudzenie o millis i 50 dniach do apokalipsy. Otóż nic ciekawego się nie wydarzy po 50 dniach, jeśli zmienne używane w milis (i stała interwału np.1000UL) jest określona jako UL lub wynik rzutowany na UL to nie uronicie nawet ms, nie mówiąc już o zawieszeniu programu. Oczywiście nie mówię o dokładności, zgubić ms można po prostu długością pętli, ale nie ma apokalipsy, zawieszenia, urwania sekundy bo zmienna się skończyła, itp.Jak komuś się nie chce czekać to można zrobić to z micros, jest 1000x szybciej, a jak komuś się bardzo spieszy to podobne wyliczenia może zrobić dla uint8_t. Nie jest to doskonała metoda zarządzania czasem, ale super działa niezależnie od sprzętu - AVR, ARM (DUE/STM), ESP8266 i ESP32.
  11. kaczakat

    Połączenie Pololu z arduino

    Możesz go zasilać w ogóle z USB płytkę, ważne by silniki miały swoje zasilanie. Można sterować tym polulu na trzy sposoby, przez UART z np. Arduino, ręcznie z programu przez USB, używając skryptu. Żaden sposób Ci nie działa?
  12. kaczakat

    Transmisja radiowa

    Co najmniej musisz użyć 2xArduino. W Europie LoRa może działać na 868MHz. Poza tym to byłby wydatek bardziej 100$ niż 20zł, LoRa może działać bez getaway'a na takie odległości? HC12 może zadziałać na 1000m w warunkach laboratoryjnych przy pełnej widoczności, idealne anteny, raczej musiałbyś mieć trzy Arduino i ten trzeci moduł z HC12 na tym przewyższeniu do przekazania sygnału między startem a metą. Może gdybyś miał dokładny zegar w pierwszym zsynchronizowany z tym na mecie i przekazał czas startu to mogłoby zadziałać. Tak by być cały czas w gotowości i podtrzymywać połączenie by wysłać coś bez opóźnienia to pewnie powyłączasz wszystkim w okolicy działanie bram i tym podobnych sprzętów na 433MHz. Może jakiś 2xESP8266 z dobrymi antenami kierunkowymi i z routerem na wzniesieniu...
  13. kaczakat

    Połączenie Pololu z arduino

    Zamień kabelki na piny 10 i 11, a nie definicje soft serial. Na pinach 0 i 1 jest UART sprzętowy, jak chcesz to można go użyć, ale pierwsza zasada Arduino - jak nie rozumiesz co robisz to rób dokładnie tak jak w przykładzie, dokładnie tak jak w opisanym projekcie, który kopiujesz. Piny 0 i 1 używasz jak chcesz użyć UART sprzętowy lub najlepiej wcale, na czas programowania trzeba stamtąd wszystko odpiąć. Poza tym w przykładzie był jeszcze taki opis: Before using this example, you should go to the Serial Settings tab in the Maestro Control Center and apply these settings: * Serial mode: UART, fixed baud rate * Baud rate: 9600 * CRC disabled Be sure to click "Apply Settings" after making any changes. Zrobiłeś to?
  14. kaczakat

    Połączenie Pololu z arduino

    Podłączanie wygląda prawidłowo, ale jak wgrałeś kod, w którym jest "SoftwareSerial maestroSerial(10, 11);" to oznacza, że do komunikacji używasz pinów 10 i 11 z płytki Arduino, wtedy przestaje być prawidłowo bo to nie są te pod 0 i 1. Dlatego jest tu pewnie gdzieś na forum zapis by wstawiać kod i schemat do pytania.
  15. kaczakat

    Odczyt danych przez UART

    To tylko takie potoczne stwierdzenie zapewne. Wystarczy Tx procesora podłączyć do Rx konwertera i masy (GND) by można było przesyłać dane z Arduino do PC, jak chcesz również komunikację w drugą stronę to jeszcze jeden kabelek. Można też bezprzewodowo używając modułu BT np. HC-05.
×