Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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.

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 😉

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.

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.

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,

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ę 😃

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...