Skocz do zawartości

Pomocy, sterowanie solarem - pierwszy (trochę) zaawansowany program


rafal:)

Pomocna odpowiedź

Witam,

Zacząłem pisać program do solaru słonecznego mającego podążać za słońcem(porównując naświetlenie na dwóch fotorezystorach).

Mam pewien problem, pierwsza część (obracanie) działa na symulacji, fotorezystory zasymulowane przez potencjometry (jedna skrajna nóżka pod 5V, środkowa pod wejście arduino, druga skrajna do GND), działanie krańcówki postanowiłem sprawdzić podłączając microswitch (działa ok) a sygnał obrotów sprawdzam na diodach.

Pierwszy problem, to nie wiem jak zrealizować funkcję w której sygnał do obracania podawany byłby dopiero po utrzymywaniu się różnicy potencjałów wyższej od histerezy np. przez 10 sekund (żeby nie było wariacji kiedy np. mucha usiądzie na chwilę).

Drugi problem to kiedy wgram pełny program z czujnikami temperatury (do arduino nie podłączyłem nic do sprawdzenia poprawności działanie czujników temperatury) pierwsza część programu przestaje działać.

Ustawiam potencjometry i nic, nie zapalają się diody symbolizujące sygnał do obrotu, czasami tylko dioda mignie na moment.

Czy ktoś byłby w stanie wytułmaczyć mi przyczyny tych problemów, pomóc w poprawieniu programu?

I może jeszcze wytłumaczyć działanie funkcji "float", analiza pokazywała mi błędy na początku więc przeglądałem różne gotowe programy z wykorzystaniem np. czujników i tam była ta funkcja przed wierszami z obliczeniami więc też dodałem i program przeszedł analizę poprawności.

Ale nie mam pojęcia jak działa ta funkcja i czemu jest wymagana przed takimi obliczeniami.

Z góry bardzo dziękuję za pomoc.

Link do komentarza
Share on other sites

1. Pomyśl, da się zrobić.

2. A jak ma działać jak kazałeś mu nic nie robić, poszukaj gdzie...

3. Nie widzę nigdzie funkcji float, poczytaj o typach zmiennych, jeden z pierwszych odcinków kursu Arduino.

4,5,6,7 Przerób cały kurs arduino na Forbocie i dasz radę to zrobić z paluszkiem w ...torcie:-)

Pozdrawiam

P.S. w życiu, za Chiny ludowe nigdy nie będzie wartoscFotorezystora1=wartoscFotorezystora2...

przy takim kodzie silnik od obracania będzie chodził cały czas

Pozdrawiam jeszcze raz 😉

Link do komentarza
Share on other sites

Przerobiłem program w taki sposób:

int histereza;
int czas;
#define obrotLewo 2
#define obrotPrawo 3
#define krancowkaLewa 4
#define krancowkaPrawa 5
#define pompa 6
#define ogrzewanieCentralne 7
#define LEDzielona 8
#define LEDzolta 9
#define LEDczerwona 10

float tempKolektor = ((analogRead(A2) * 5.0) / 1023.0) * 100;

float tempWymiennik = ((analogRead(A3) * 5.0) / 1023.0) * 100;

void setup() {
pinMode(2,OUTPUT); //obrót w lewo
pinMode(3,OUTPUT); //obrót w prawo
pinMode(A0,INPUT); //czujnik lewy
pinMode(A1,INPUT); //czujnik prawy
pinMode(4,INPUT_PULLUP); //krancówka lewa
pinMode(5,INPUT_PULLUP); //krańcówka prawa
}

void loop() {
float oswietlenie1=(analogRead(A0)/10);

float oswietlenie2=(analogRead(A1)/10); 

histereza=15; //im większy współczynnik histerezy tym wieksza 
      //różnica potencjałów pomiędzy czujnikami naświetlenia

if(oswietlenie1-oswietlenie2>histereza
and   digitalRead(krancowkaLewa)==HIGH){ //jeśli krańcówka lewa                      
                                         //jest rozwarta

digitalWrite(obrotLewo,HIGH);
digitalWrite(obrotPrawo,LOW);
} else {
 digitalWrite(obrotLewo,LOW);
 digitalWrite(obrotPrawo,LOW);
}

if(oswietlenie2-oswietlenie1>histereza
and    digitalRead(krancowkaPrawa)==HIGH //jeśli krańcówka 
                                         //prawa jest rozwarta
) {       
 digitalWrite(obrotPrawo,HIGH);
 digitalWrite(obrotLewo,LOW);
} else {
 digitalWrite(obrotLewo,LOW);
 digitalWrite(obrotPrawo,LOW);
}


czas=600000; //10 minut

if(tempKolektor-tempWymiennik>10){
  digitalWrite(pompa,HIGH);
  delay(czas);
  digitalWrite(pompa,LOW);
}
if(tempWymiennik-tempKolektor>5){
  digitalWrite(ogrzewanieCentralne,HIGH);
} else {
 digitalWrite(ogrzewanieCentralne,LOW);
}
if(tempKolektor>70){
 digitalWrite(LEDzolta,HIGH);
 digitalWrite(LEDzielona,LOW);
 digitalWrite(LEDczerwona,LOW);
} else {
 digitalWrite(LEDzielona,HIGH);
 digitalWrite(LEDzolta,LOW);
 digitalWrite(LEDczerwona,LOW);
}

if(tempKolektor>80){
 digitalWrite(LEDczerwona,HIGH);
 delay(1000);
 digitalWrite(LEDczerwona,LOW);
 delay(1000);
 digitalWrite(LEDczerwona,HIGH);
}
}

Teraz obroty działają jak trzeba.

Nadal nie rozwiązałem problemu z opóźnieniem włączenia obrotów przy utrzymującym się spełnionym warunku.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Aleś się pożalił 🙁. Czytałeś artykuł kursu o millis(), a może wpisałeś w wyszukiwarkę Google "arduino program sterowany czasem"?

Może coś takiego Ci się przyda?

int error=0;
int foto_1=0; //stan czujników
int foto_2=0;
int _timeout=10000; //10 sekund

unsigned long czas=0;  //to będze stoper

while(foto_1 && foto_2) //prawda tylko jeśli obydwa foto != 0
{
 czas=millis(); //start stopera
 while(czas+_timeout>millis()) //jeśli nie minął timeout to
   { if(!foto_1 || !foto_2) { error=1; break; } //stan foto się zmienił więc jest to błąd
    //a tu robisz co chcesz, aż nie minie _timeout
   }
 //stan stabilny więc robię co chcę  
if(!error) .........
 //na wszelki wypadek
error=0;
break;
}

Ponieważ w swoim programie chcesz korzystać z czasu to wpisanie w wyszukiwarkę proponowanego hasła rozwiąże Twoje problemy - no chyba, że oczekujesz gotowca.

Co do funkcji float() to w manualu Arduino IDE znajdujesz taką odpowiedź https://www.arduino.cc/reference/en/language/variables/conversion/floatcast/

Każde wbudowane polecenie Arduino IDE wyróżnione jest kolorem - zaznacz je i naciśnij CTRL+SHIFT+F

Jest szansa, że w oknie przeglądarki wyświetli Ci się informacja na ten temat.

Pozdrawiam,

Link do komentarza
Share on other sites

Fajnie wiedzieć, że rozwiązanie jest bardzo proste, ale nikt z nim nie pomoże (bo nie chce lub nie umie tylko tak napisał).

Świetne pomocne forum.

Rafał, kiedy warunek jest spełniony, włącz stoper, jak po upływie czasu nadal będzie spełniony to wtedy robisz co chcesz. Później będziesz to bardziej komplikował. Poczytaj kurs arduino Forbota o millis, albo poszukaj w moich postach wątku o millis, stoperach i zegarach.

Pochwal się rozwiązaniem albo jego próbą i będziemy myśleć dalej.

Miłego, owocnego i nienerwowego wieczoru życzę 😃

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.