Skocz do zawartości

kaczakat

Użytkownicy
  • Zawartość

    502
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    13

kaczakat zajął 1. miejsce w rankingu.
Data osiągnięcia: 7 marca.

Treści użytkownika kaczakat zdobyły tego dnia najwięcej polubień!

1 obserwujący

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.

Osiągnięcia użytkownika kaczakat

Innowator

Innowator (10/19)

  • Stały wizytator
  • Regularny bywalec
  • Za 25 postów
  • Za 5 postów
  • Za 100 postów

Odznaki

206

Reputacja

  1. Przykład z wyłączeniem czekania na koniec pomiaru: // Include the libraries we need #include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 2 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); uint32_t czasTeraz,czasPoprzedni,tik=10, czas1,czas2,czas3,czas4,roznica,maximum,srednia; uint8_t n10,fn10,sekundy,minuty,godziny,dni,nic; bool fsekundy,fminuty,fgodziny,fdni; void setup() { // sysClock(INT_OSC32); // put your setup code here, to run once: Serial.begin(115200); sensors.begin(); sensors.requestTemperatures(); sensors.setWaitForConversion(0); } void loop() { czas(); // put your main code here, to run repeatedly: if(fsekundy) { if(sekundy%2==0) { sensors.requestTemperatures(); // Send the command to get temperatures float odczyt=sensors.getTempCByIndex(0); Serial.print("Odczyt temperatury zaraz po zleceniu konwersji: "); Serial.println(odczyt); } else { float odczyt=sensors.getTempCByIndex(0); Serial.print("Odczyt temperatury w innej sekundzie: "); Serial.println(odczyt); } } } void czas() { czasTeraz=millis(); fn10=fsekundy=fminuty=fgodziny=fdni=0; if((uint32_t)(czasTeraz-czasPoprzedni)>=tik) { czasPoprzedni=czasTeraz; fn10=1; n10++; if(n10>=100) { n10=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++; } } } } } } Timer programowy - funkcja czas() oznacza mi czy dany przebieg loop jest w pełnej sekundzie działania programu, jeśli tak, to w parzyste zleca pomiar, a w nieparzyste odczytuje temperaturę, dzięki temu z każdej sekundy tylko 20ms jest wykorzystywane, raz na milion pętli loop. Pozostaje dużo czasu na inne czynności, np. miganie ledem. 20ms trwa mniej więcej jedna transmisja do/z DS. Można też tak zrobić, by co sekundę odczytać (czy tam co 750ms dla 12bitów, ale ciężko się na palcach to liczy), a potem zlecić kolejny pomiar, tylko wtedy to trwa już 40ms. Jak odczytasz po kolei 10 czujników to też to zajmie wielokrotność odczytu jednego. No ale i tak jest dużo szybciej niż czekać 750ms na każdy. Jak chcesz mieć odczyt wszystkich co 1s to po prostu można to sobie dalej podzielić, zamiast 1s podzielić zadania na interwały co 50ms, można w kolejnych wywołaniach odczytać po 1 czujniku, a w ostatnim zlecić pomiar, przez kolejne odliczać tylko czas do zakończenia pomiaru w wybranej rozdzielczości. A tu taki przykład, tylko z wykorzystaniem gotowej biblioteki: #include <DallasTemperature.h> #include <OneWire.h> #include <TickTwo.h> #define ONE_WIRE_BUS 4 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); float tempDS; void temp(); void serial1000(); void serial500(); void ledBlink(); TickTwo timer1(temp, 100); TickTwo timer2(serial500, 500); TickTwo timer3(serial1000, 1000); TickTwo timer4(ledBlink, 50); void setup() { Serial.begin(115200); timer1.start(); timer2.start(); timer3.start(); timer4.start(); sensors.setWaitForConversion(0); sensors.setResolution(12); sensors.begin(); } void loop() { timer1.update(); timer2.update(); timer3.update(); timer4.update(); } void temp() { static uint8_t ktoraSetkaSekundy=0; switch (ktoraSetkaSekundy) { case 0: sensors.requestTemperatures(); break; case 3: Serial.println("Kuku z trojki"); break; case 8: tempDS = sensors.getTempCByIndex(0); break; default: // gdy 1,2,3,4,5,6,7 i 9 nic ta funkcja nie robi poza ktoraSetkaSekundy++ break; } ktoraSetkaSekundy++; if( ktoraSetkaSekundy>9) ktoraSetkaSekundy=0; } void serial500() { Serial.println("test 500 ms"); } void serial1000() { Serial.print("Temperatura: "); Serial.println(tempDS); } void ledBlink() { static bool startujemy=0; if(! startujemy) { pinMode(LED_BUILTIN,OUTPUT); startujemy=1; } digitalWrite(LED_BUILTIN, ! digitalRead (LED_BUILTIN)); }
  2. No faktycznie, ale ja niekumaty, jeden to uC, a drugi to rakietka do ping-ponga. A czy wolno takim nierozgarniętym jak ja porównywać ilość RAM, flash, IO, ADC i MHz, czy też nie? Ech, na wszelki wypadek już nie będę. A faktycznie oba służą głównie do migania ledem w Arduino.
  3. Co do zasady lepsza jest ta zielona płytka bez konwertera USB-UART, programowanie nie jest jakiś skomplikowane, po prostu możesz użyć konwertera USB-UART. Niestety mnie się nie udało dojść do deklarowanych poziomów zużycia energii, choć wyłączałem wszystko zgodnie z datasheet. Dużo lepsze efekty uzyskiwałem na płytce PRO Mini z Atmega328p, po wylutowaniu leda od stanu zasilania w stanie powerdown pobór prądu spada poniżej 200nA (3.3V), po wybudzeniu program rusza z miejsca gdzie go uśpiłeś, a tego nie potrafi ani LGT, ani ESP czy ARM, u nich w największym uśpieniu, po wybudzeniu program rusza od nowa tak jak po resecie, jak coś pomieszałem to mnie wyprowadźcie z błędu. No i nawet z tą niedogodnością to są raczej uA niż nA (ESP). Choć być może ten problem został rozwiązany dla lgt w ostatnich latach, moje testy były jednak jakiś czas temu, dzisiaj znalazłem to: https://github.com/dbuezas/lgt8fx/issues/202 , muszę to przetestować. Miałem tak jak jeden z piszących w tamtych wątku coś około setek uA.
  4. Bronisz pokazu slajdów z uporem wartym lepszej sprawy. Mam ESP32 CAM i widzę porównanie obrazu, Ty nie wiesz z czym to porównujesz. Nie twierdzę, że nie da się tym zrobić fotki, na której da się odróżnić psa od samochodu. Nie zabraniam używania tego jak tam chcesz, skoro taki efekt jest dla Ciebie zadowalający, chcesz wydać więcej i mieć protezę, ale DIY. Są faktycznie kamerki działające tylko z apką producenta, bez możliwości zapisu na SD, odczytu online tylko z płatnej chmury, nawet wielokrotnie droższe, ale to nie ten przypadek. Faktycznie nie miał bym pomysłu jak ją uruchomić bez apki i skonfigurować, mam kamerki nieco droższe, które można skonfigurować przez WWW.
  5. kaczakat

    Przekaźnik 12V DC

    Możesz użyć Arduino, ale na tej płytce są już 2 uC, ESP8266 też się programuje z Arduino IDE. Na tej płytce ESP wysyła komunikat po UART do tego czarnego robaczka o 8 pinach i on przełącza przekaźnik (to drugi uC - jakiś STC). Jak chcesz zastąpić to UNO, to musisz wyciągnąć ESP, podłączyć GND i TX, wysłać odpowiedni komunikat przez UART. Po co to robić skoro masz już gotową podstawkę pod ESP i możesz do niego wgrać swój program, sterować tym nawet przez WWW i WIFI. Do UNO są dedykowane moduły, tańsze i z optoizolacją.
  6. W UNO masz taką tabelkę do PWM: Jak problem występuje np. na pinie 3 to znaczy, że coś innego również korzysta z timera 2, skorzystaj z pinów przypisanych do innego timera, czyli pierwszych 4 w tabelce.
  7. Nie mogło wydzielać tyle ciepła, bo UNO nie pobiera samo w sobie tyle prądu. Jak faktycznie nic tam nie nawywijałeś, a 12V mieści się w specyfikacji zasilania, to wyślij na rękojmię i się nie przejmuj. Sam scalak pokazany na schemacie UNO ma max V=20V i zabezpieczenie wyłączające pracę przy przekroczeniu temperatury. A jak faktycznie chcesz docelowo coś mocno zasilać z wejścia Vin to jednak lepiej użyć zasilacza ~7V, wtedy jest szansa osiągnąć podobne obciążenie linii 5V jak przy zasilaniu z USB.
  8. Darmowy ThingSpeak ma ograniczenie do 15s, ale można zrobić tak, że jak w pole 1 kanału wpiszesz wartość, do drugi ESP to odczyta i coś z tym zrobi. Są też serwery MQTT i na telefon prosta aplikacja, na Arduino biblioteki do obsługi mgtt, tu raczej jest stałe połączenie i nasłuch na kanale. Ja używam swojego serwera Websockets w jednym ESP, inne esp mogą się do niego podłączyć jako klienci i sępić dane w czasie rzeczywistym, przykład serwera wrzuciłem w wątku obok. ESP ma ograniczenie do 4 połączeń, dlatego lepiej jest patrzeć na zewnętrzne serwery. Można też po prostu wgrać Tasmotę w ESP i ustawić komunikację między nimi, jest filmik na Youtube jak z dwóch zrobić zdalnie sterowany termostat, tu też jest ograniczenie do 4 połączeń.
  9. Generalnie to się nie wystawia na zewnątrz, router ma być takim serwerem, ma firewalla i jakieś podstawowe zabezpieczenia, lepiej przekierować porty. Wchodzisz w ustawienia sieci (każdy router ma to subtelnie inaczej, znajdziesz w Google jak w tym modelu to zrobić) i sobie przekierowujesz określone porty, np. możesz mieć przekierowany port 5333 na port 80 urządzenia 192.168.0.22 i do ESP dostaniesz się wtedy po adresie "mojanazwa.ddn.org:5333" czy jak tam sobie ustawiłeś tą nazwę dla swojego IP. Jak chcesz mieć odczyt temperatury to sobie załóż konto na ThingSpeak, możesz założyć darmowo ze 3 kanały, każdy ma 8 pól, w Arduino wrzucasz bibliotekę, podłączasz czujnik, wartość czujnika co 15s czy tam minut wysyłasz na ThingSpeak, to zostaje zapisane w serwerze i masz do tego dostęp jak do każdej strony WWW, możesz sobie obejrzeć aktualną wartość i historię na wykresie. W Androidzie możesz sobie też zainstalować widget ThingSpeak, będzie pobierał dane z serwera i prezentował wartości na pulpicie, możesz tu ustawić alarmy przekroczenia zadanego progu. https://play.google.com/store/apps/details?id=ua.livi.thingspeakmonitor&hl=en_US
  10. No właśnie mam doklejone OTA więc i tak to wysyłam online. Najbardziej rozbudowana wersja na razie zajmuje mi 8kB, 1%? Oczywiście na pewnym etapie rozbudowy strony WWW może być to konieczne, jednak nie planuję robić takich wodotrysków, rozdzielać pliki HTML, JS, CSS. Jak potrzebuję oglądać wykresy to wysyłam na serwer HA lub ThingSpeak. Gdyby to zrobić na Atmega328 z shieldem Ethernet to miałoby bardziej sens, bo Atmega nie ma flash do szastania, ale na razie to odpuściłem, ta biblioteka niby to obsługuje, ale w wersji 1.x i chyba tylko jako klient.
  11. @_LM_ teraz jest też Tasmota, wiele rzeczy, które potrzebowałem można zastąpić gotowcem, ale znowu trzeba się nauczyć jak to konfigurować, a wszystkie opcje to by była spora biblia, multum osób to opracowuje. Jest też chatGPT, miałem jedno okienko tekstowe na początku i ciągle odkładałem by się w to zagłębić, jak zrobić ich kilka wierszy, ale z jedną funkcją, tak by sobie zidentyfikowała, z którego okna jest kliknięcie, dokleiła id i komunikat, potem mi jeszcze wytłumaczył jak inkubować i która rasa jest kur znosi najwięcej jajek rocznie. Kod strony w ogóle nie musi być w ESP, można sobie go zapisać na dysku i stąd otworzyć, tylko podać numer do IP WS ESP. Miałem też wersję w SPIFF z grafikami, gierka w wisielca z kursu JS, ale zrezygnowałem jak znalazłem opcję "R"rawliteral", bez grafiki też działa OK, ma być astetyczny.
  12. Parę lat temu szukałem sposobu jak to zorganizować i niestety poradniki prezentowały tylko proste działanie, to było OK dla jednego czujnika, ale jak chciałem to oglądać na www co robi ESP na bieżąco to wymyślałem np. odświeżanie co 1s, moduł działał losowo od kilku minut do kilku godzin, a im więcej elementów na stronie tym szybciej umierał, bo robiło się z tego sporo tekstu do wysyłania. Może coś tam z tym poprawili w core przez te lata, ale nie mam już potrzeby sprawdzać. Rozwiązaniem było zrobienie tego na Websockets, czyli to co pisze @kostuch, to podobne mechanizmy, WS raczej jest aktualny, zacząłem poszukiwania od Ajax, ale do niczego nie doszedłem w Arduino, a do Websockets znalazłem fajny przykład, szybki kurs youtubowy HTML, JS, CSS na kanale pasja informatyki i zaczęło to mi działać jak chciałem. Można sobie zrobić dowolny panel sterowniczy, online, nie ma potrzeby podłączania wyświetlacza ani robienia menu. Chcę mieć DS po numerze i muszę zmienić na nowy? Wystarczy wkleić nowy numer i kliknąć SEND. Ustawić godzinę z palca - jednym suwakiem o zakresie 0-1339. W załączniku masz prosty przykład, z OTA i WIFImanager. ESP8266 core3.1.2.zip
  13. Bo serial może drukować po literce i zerować napis, który nigdy nie będzie w jednym kawałku czteroliterowym napisem "3 ON". Masz przykład w Arduino SerialEvent, tam to leci w ten deseń, że każdy przylatujący na serial znak jest dodawany do napisu, a dopiero gdy zostanie wykryty znak nowej linii '\n' napis jest uznany za kompletny, ustawiona jest flaga=1, wtedy używasz w innej części kodu tej flagi if(flaga) {blok programu sterujący switchami, zerowanie flagi, zerowanie napisu}. Jak wszystkie polecenia miałby identycznie 4 znaki to też tak można zrobić, że jak zbierzesz 4 znaki to coś z tym robisz, ale to jest wadliwe, bo w razie błędu, literka ucieknie, wszystko się poprzesuwa, dlatego lepiej jest mieć jakiś szczególny znak na końcu, albo na początku i jak masz taki znacznik to wiesz, że zbierasz literki i kiedy masz komplet. Lepiej chyba go wstawić na koniec, a na początek ewentualnie inne znaki jak chcesz zrobić jakieś rozróżnienie, że coś jest komendą, a coś napisem do użycia do np. wyświetlenia. Do porównywania napisów też są inne funkcje, zarówno do napisów string jak i tablic znaków char. I nigdzie nie musi być delay choćby 1ms.
  14. Ledy programowalne wymagają 5V i to negatywnie wpływa na energooszczędność. Przetwarzanie energii to straty. Pojemność AA to 1.2x2000mAh - straty, drugie rozwiązanie to 9Vx150mAh -straty, lepsze rozwiązanie to 18650 i 3.7V x 2500mAh. Jeśli użyjesz zwykłych led i samej Atmegi328p, może być zresztą Attiny do takiego zadania, to możesz ustawić uC na 8MHz, nawet na 1MHz i zasilać go bez żadnego przetwarzania napięcia w zakresie od 2.8-4.3V, akurat w zakresie pracy akumulatorka. Kilka led i PWM może zapewnić przyjemny dla oka efekt przy optymalnym zużyciu energii. Nawet jak zostaniesz przy programowalnych ledach to i tak lepiej użyć akumulatorka 18650, tylko tu też odjąć od pojemności straty. Jest sporo gotowych modułów zapewniających zarówno ładowanie aku jak i od razu wyjście 5V za całe 9.99PLN.
  15. Z całego kodu nie korzystałem tylko z tych ifów niby weryfikujących poprawność transmisji do DS, wywal je i od razu wydrukuj odczytaną temperaturę, to i tak tylko test dla Twoich oczu w wydruku na serial. Nie musisz czekać delay(1000), bez dodatkowych zabiegów biblioteka i tak każe funkcji zlecenia pomiaru czekać w tym miejscu na jej koniec. Trafiłem kiedyś na 10 czujników z jednego zamówienia, które działały tylko pojedynczo poza tym odczyty były bardzo niestabilne, choć krążyły w okolicach prawdopodobnych wartości, raczej wszystkie z Ali po złotypindziesiąt to podróbki, ale te były wyjątkowo nieudane.
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.