• 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
Sterownik ogrzewania wody w basenie.
#11
Trochę pokory i odrobina samokrytyki by się przydała Tobie.
Zamiast się przechwalać czego to nie potrafisz wstawiłbyś kod z pomocą, pewnie zajęło by to mniej czasu niż pitolenie o swojej ponad przeciętnej wiedzy.
Oczywiście musiałby być spełniony jeden warunek - musiałbyś tę wiedzę posiadać.
Ujadasz tylko i nic więcej a to daje do myślenia innym o Tym że jesteś tylko i wyłącznie forumowym trollem.

Jeżeli nie masz nic ciekawego do wniesienia w temacie to po prostu nie wypisuj więcej bredni.

Punktacja, którą posiadasz na tym forum utwierdza mnie tylko w przekonaniu, że jesteś złośliwym egocentrykiem.
 
Odpowiedź
#12
(14-06-2019, 04:44)kagiva napisał(a): Trochę pokory i odrobina samokrytyki by się przydała Tobie.
Zamiast się przechwalać czego to nie potrafisz wstawiłbyś kod z pomocą
Trochę pokory? Raczej kasy!
Kod mogę napisać, 100zł/h. Wyjątkowo niska cena. Jak chcesz kod, złóż zamówienie i po sprawie.

Twoje wypowiedzi utwierdzają mnie, że jesteś cwaniakiem, który chce znaleźć "jelenia" do napisania kodu za free. Weź się do nauki, to dowiesz się dlaczego za napisanie dobrego kodu płaci się 100...400zł/h i  dlaczego stosunkowo prosty kod pisze się 40..160 godzin.
Mnie na prezenty dla cwaniaków o wartości min 4000zł nie stać.

Podpowiedzieć naturalnie mogę:
Kod:
if( !timner ){
timer = 1000; // sekunda

//działamy co sekundę
}

Do tego:
Kod:
ISR (od comp. timera co 1ms){  / dla oszczędności niewielkiej ilości timerów w AVR, można wykorzystać timer0 , którego przerwania sś wywoływane co ok 1ms
 if( timner  ) timner --;
}

Trzeba zadeklarować zmienną:
Kod:
uint16_t volatile timner;
Kumasz cokolwiek?

Na AVR 8-bir, warunek:
Kod:
if( !timner ){
Bezpiecznie sprawdzać z wyłączonymi przerwaniami. Jest do tego stosowna funkcja. Jak ładnie poprosisz to poszukam jak się nazywa. Teraz nie pamiętam, bo pisze na ARM a tam nawet przy 32-bit nie trzeba sztuczek z blokowaniem IRQ.
Dostałeś praktycznie gotowca. Kod dział szybko, zużywa mało flash i ram w przeciwieństwie do zabaw z millis, nie ma problemu 50 dni.
 
Odpowiedź
#13
Kurs na Forbot jednak to coś więcej, miganie led jest użyte dlatego, by nie wprowadzać niepotrzebnie innych terminów komplikujących zadanie. Oczywiście jeśli zaczniesz go przerabiać od ostatniej lekcji, tej z millis, to jej możesz nie zrozumieć. Trzeba trochę nad tym posiedzieć by zmienić sposób myślenia.
Jak uważasz kogoś za trola to go nie karm.
Millis można wykorzystać do odmierzania czasu. W przykładzie w blinkWithoutDelay wystarczy wyrzucić zmiany stanu led i wprowadzić swoją zmienną sekundy++. Ponieważ w ciągu 1s pętla loop powinna się wykonać tysiące razy dodać tu trzeba również flagę, by to co ma się wykonać co sekundę wykonało się tylko raz, tylko w tym konkretnym loop, w którym nastąpiła zmiana sekund. W innym miejscu loop należy jej przypisać zero. Ja używam swoich liczników sekund, minut i flag do nich by zarządzać czasem, wtedy w loop tylko raz odwołuję się do millis, a potem do swoich zmiennych i flag operujących na małych liczbach, porównania są wtedy bardzo szybkie. Każde wywołanie millis trwa kilka us. Ale i tak musiałbyś je wywołać w pętli wiele tysięcy razy by dorównać jednemu delay(1000);.  Z pompą nie 
Kod:
//zalaczenie pompy
if (przycisk==0 and ! pompaWlaczona)
{pompaWlaczona=1;
digitalWrite(pompa,1);
znacznikCzasuWlaczeniaPompy=millis();
}

//wylaczenie pompy

if(pompaWlaczona)
{
znacznikCzasuAktualny=millis();
if((uint32_t)(znacznikCzasuAktualny-znacznikCzasuWlaczeniaPompy)>=zadanyCzasPracyPompy)
{
digitalWrite(pompa,0);
pompaWlaczona=0;
}
}

Użycie dodatkowego timera sprzętowego wg mnie nie ma sensu do tak prostej czynności, skoro i tak już działa timer0 by napędzać micros/millis/delay.
 
Odpowiedź
#14
(14-06-2019, 09:18)kaczakat napisał(a): Ja używam swoich liczników sekund, minut i flag do nich by zarządzać czasem, wtedy w loop tylko raz odwołuję się do millis, a potem do swoich zmiennych i flag operujących na małych liczbach
Małych?

(14-06-2019, 09:18)kaczakat napisał(a):
Kod:
znacznikCzasuAktualny=millis();
Zmienna "znacznikCzasuAktualny" raczej jest 32-bit? Jeśli tak, to pozostałe zmienne:
Kod:
if((uint32_t)(znacznikCzasuAktualny-znacznikCzasuWlaczeniaPompy)>=zadanyCzasPracyPompy)
też sa 32-bit.

Rozwiązanie, które zaproponowałem, ma tą zaletę, że gdy czekamy do 255ms wirtualne timery są wielkości bajtu, do ok 65sek, dwa bajty. Można też, jeśli nie jest wymagana ms dokładność, wirtrualne timery modyfikować co 10 czy 100ms. Przy liczeniu co 100ms, bajt wystarczy aby odmierzać czas 25,5sekundy.

(14-06-2019, 09:18)kaczakat napisał(a): Użycie dodatkowego timera sprzętowego wg mnie nie ma sensu do tak prostej czynności, skoro i tak już działa timer0 by napędzać micros/millis/delay.
Zgadzam się, dlatego napisałem
Cytat:dla oszczędności niewielkiej ilości timerów w AVR, można wykorzystać timer0 , którego przerwania są wywoływane co ok 1ms


PS
Przy porównywaniu wirtualnych timerów dłuższych niż jeden bajt powinno się wyłączać przerwania (albo użyć ARM) ale mamy specyficzną sytuację, bo liczą w dół, porównuje się z zerem i najczęściej nie trzeba wyłączać przerwań. Niesie to za sobą pewne małe niebezpieczeństwo, ale analizę niekorzystnego przypadku zostawiam dociekliwym programistom.
 
Odpowiedź
#15
Sprawa okazała się prostsza niż myślałem.
Wystarczyło pozatrzaskiwać zmienne czasu w zależności od różnicy temperatur.
Kod:
if (tf == 1) {
   czas_start = millis();
   Serial.begin(9600);
   Serial.print("czas start  ");
   Serial.println(czas_start);
   Serial.print("czas teraz  ");
   Serial.println(czas_teraz);

 }
 else
 {
   czas_teraz = millis();
   Serial.begin(9600);
   Serial.print("czas start  ");
   Serial.println(czas_start);
   Serial.print("czas teraz  ");
   Serial.println(czas_teraz);
 }
A później utworzyć warunki ze zwłoką czasu.
Kod:
if ((czas_start - czas_teraz > czas_zwloka)&&(tf ==1))
   {
     digitalWrite(FILTR, LOW);
     lcd.setCursor(18, 3);
     lcd.print("*");
     to = 1;
   }


   if ((TEMP_POMPY <= 2) && (to == 1)&&(czas_teraz - czas_start > czas_zwloka)) {
     digitalWrite(FILTR, HIGH);
     lcd.setCursor(18, 3);
     lcd.print("-");
     to = 0;
   }
 }
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości