26-06-2019, 13:35
Witam.
W Arduino, jak i w programowanie jestem zielony jak ten szczypiorek, niemniej jednak postanowiłem zabrać się za swój pierwszy kod. Cały plan wygląda mniej więcej tak: mam dwa MOSFET-y połączone z dwoma silnikami, po jednym microswitchu dla nich, trzy microswitche odpowiadające za czas ich poruszania się oraz spust. Naciśnięcie jednego microswitcha od silnika, jednego od prędkości i spustu powinno dać mi określony czas poruszania się tego silnika. Jednak czytałem, że nie da się zawrzeć kilku pętli jednocześnie w kodzie. A jeśli miałyby się uruchamiać osobno? Da się coś z tym zrobić?
Z góry dziękuję za pomoc
W Arduino, jak i w programowanie jestem zielony jak ten szczypiorek, niemniej jednak postanowiłem zabrać się za swój pierwszy kod. Cały plan wygląda mniej więcej tak: mam dwa MOSFET-y połączone z dwoma silnikami, po jednym microswitchu dla nich, trzy microswitche odpowiadające za czas ich poruszania się oraz spust. Naciśnięcie jednego microswitcha od silnika, jednego od prędkości i spustu powinno dać mi określony czas poruszania się tego silnika. Jednak czytałem, że nie da się zawrzeć kilku pętli jednocześnie w kodzie. A jeśli miałyby się uruchamiać osobno? Da się coś z tym zrobić?
Kod:
// PRZYPISYWANIE PINÓW
int MOSFET_1 = 6; //MOSFET AK
int MOSFET_2 = 7; //MOSFET SKORPION
int TRIGGER_PIN = A0; //SPUST
int SWITCH_PIN_1 = 2; //SELEKTOR BURST
int SWITCH_PIN_2 = 3; //SELEKTOR POJEDYŃCZY
int SWITCH_PIN_3 = 4; //SELEKTOR CIĄGŁY
int SELEKTOR_AK = 9; //WYBÓR AK
int SELEKTOR_SKORPION = 10; //WYBÓR SKORPION
float R1 = 100; //ROZDZIELACZ NAPIĘCIA REZYSTOR R1
float R2 = 10; //ROZDZIELACZ NAPIĘCIA REZYSTOR R2
// CZAS BURSTA
int MAX_MOSFET_1 = 200;
int MAX_MOSFET_2 = 180;
// CZAS POJEDYŃCZY
int MAX_MOSFET_1_SIN = 60;
int MAX_MOSFET_2_SIN = 70;
// CZAS POJEDYŃCZY
int MAX_MOSFET_1_AUTO = 999;
int MAX_MOSFET_2_AUTO = 999;
//POCZĄTKOWE DANE
int TriggerStatus = LOW; //STATUS SPUSTU NA POCZĄTKU
int TriggerReadValue = 0; //DANE CZYTANE PRZEZ PIN A0 => 0-1024
int CurrentSleepTime = 0; //CZAS W JAKIM MOSFET BYŁ WŁĄCZONY
//WCZYTYWANIE PINÓW JAKI INPUT/OUTPUT
void setup() {
pinMode(13, OUTPUT); //PIN LED
pinMode(MOSFET_1, OUTPUT); //PIN MOSFETU AK JAKO SYGNAŁOWY
pinMode(MOSFET_2, OUTPUT); //PIN MOSFETU SCORPION JAKO SYGNAŁOWY
pinMode(SWITCH_PIN_1,INPUT); //PIN SELEKTORA BURST JAKO ZASILANIE
pinMode(SWITCH_PIN_2,INPUT); //PIN SELEKTORA POJEDYŃCZY JAKO ZASILANIE
pinMode(SWITCH_PIN_3,INPUT); //PIN SELEKTORA CIĄGŁY JAKO ZASILANIE
digitalWrite(MOSFET_1,LOW); //UPEWNIĆ SIĘ CZY MOSFET_1 NIE JEST ZASILANY
digitalWrite(MOSFET_2,LOW); //UPEWNIĆ SIĘ CZY MOSFET_2 NIE JEST ZASILANY
digitalWrite(13,LOW); //UPEWNIĆ SIĘ CZY LED NIE JEST ZASILANY
}
// CZYTANIE POZYCJI SPUSTU
void ReadTrigger()
{
int TriggerReadValue = analogRead(TRIGGER_PIN);
TriggerStatus = LOW;
if(TriggerReadValue > 20) {
TriggerStatus = HIGH;
}
}
// CZYTANIE POZYCJI MOSFET_1
void SetMosfet_1(int val)
{
digitalWrite(13, val); // CZY LED WŁĄCZONY/WYŁĄCZONY ŻEBY SPRAWDZIĆ CO ROBI MOSFET_1
digitalWrite(MOSFET_1, val); // CZY MOSFET_1 WŁĄCZONY/WYŁĄCZONY
}
// CZYTANIE POZYCJI MOSFET_2
void SetMosfet_2(int val)
{
digitalWrite(13, val); // CZY LED WŁĄCZONY/WYŁĄCZONY ŻEBY SPRAWDZIĆ CO ROBI MOSFET_2
digitalWrite(MOSFET_2, val); // turn the Monfet on / off
}
//RODZAJE OGNIA REPLIK
void loop() {
//LOOP CZYTANIA BURSTA AK
ReadTrigger();
int TriggerSelector_1_1 = digitalRead(TRIGGER_PIN) && digitalRead(SELEKTOR_AK); //SPRAWDŹ CZY SPUST I SELEKTOR AK SĄ WŁĄCZONE
if (TriggerSelector_1_1 == HIGH) //JEŚLI POWYŻSZE SĄ PRAWDĄ
{
SetMosfet_1(HIGH); //WŁĄCZ MOSFET
while (TriggerSelector_1_1 == HIGH)
{
int isBurstMode_1 = digitalRead(SWITCH_PIN_1);
if(isBurstMode_1 == HIGH) //JEŻELI SELEKTORY SĄ WŁĄCZONE MAMY BURSTA
{
if(CurrentSleepTime < MAX_MOSFET_1) //JEŻELI NIE DOKOŃCZYŁ CYKLU
{
CurrentSleepTime = CurrentSleepTime + 1; //POZOSTAW MOSFET WŁĄCZONY I ZWIĘKSZ OCZEKIWANIE O 1
} else {
SetMosfet_1(LOW); //JEŻELI DONOŃCZYŁ CYKL WYŁĄCZ MOSFET
}
delay(1); //CZEKAJ JEDNĄ MILISEKUNDE
}
ReadTrigger(); //SPRAWDZ CZY SPUST WYŁĄCZONY
}
SetMosfet_1(LOW); //UPEWNIJ SIĘ ŻE MOSFET WYŁĄCZONY
CurrentSleepTime = 0; //ZRESETUJ PĘTLĘ KIEDY SPUST PUSZCZONY
}
//LOOP CZYTANIA BURSTA SKORPION
ReadTrigger();
int TriggerSelector_2_1 = digitalRead(TRIGGER_PIN) && digitalRead(SELEKTOR_SKORPION); //SPRAWDŹ CZY SPUST I SELEKTOR SKORPIONA SĄ WŁĄCZONE
if (TriggerSelector_2_1 == HIGH) //JEŚLI POWYŻSZE SĄ PRAWDĄ
{
SetMosfet_2(HIGH); //WŁĄCZ MOSFET
while (TriggerSelector_2_1 == HIGH)
{
int isBurstMode_2 = digitalRead(SWITCH_PIN_1);
if(isBurstMode_2 == HIGH) //JEŻELI SELEKTORY SĄ WŁĄCZONE MAMY BURSTA
{
if(CurrentSleepTime < MAX_MOSFET_2)//JEŻELI NIE DOKOŃCZYŁ CYKLU
{
CurrentSleepTime = CurrentSleepTime + 1; //POZOSTAW MOSFET WŁĄCZONY I ZWIĘKSZ OCZEKIWANIE O 1
} else {
SetMosfet_2(LOW); //JEŻELI DONOŃCZYŁ CYKL WYŁĄCZ MOSFET
}
delay(1); //CZEKAJ JEDNĄ MILISEKUNDE
}
ReadTrigger(); //SPRAWDZ CZY SPUST WYŁĄCZONY
}
SetMosfet_2(LOW); //UPEWNIJ SIĘ ŻE MOSFET WYŁĄCZONY
CurrentSleepTime = 0; //ZRESETUJ PĘTLĘ KIEDY SPUST PUSZCZONY
}
//LOOP CZYTANIA POJEDYŃCZEGO AK
ReadTrigger();
int TriggerSelector_1_2 = digitalRead(TRIGGER_PIN) && digitalRead(SELEKTOR_AK); //SPRAWDŹ CZY SPUST I SELEKTOR AK SĄ WŁĄCZONE
if (TriggerSelector_1_2 == HIGH) //JEŚLI POWYŻSZE SĄ PRAWDĄ
{
SetMosfet_1(HIGH); //WŁĄCZ MOSFET
while (TriggerSelector_1_2 == HIGH)
{
int isSingleMode_1 = digitalRead(SWITCH_PIN_2);
if(isSingleMode_1 == HIGH) //JEŻELI SELEKTORY SĄ WŁĄCZONE MAMY POJEDYNCZY
{
if(CurrentSleepTime < MAX_MOSFET_1_SIN) //JEŻELI NIE DOKOŃCZYŁ CYKLU
{
CurrentSleepTime = CurrentSleepTime + 1; //POZOSTAW MOSFET WŁĄCZONY I ZWIĘKSZ OCZEKIWANIE O 1
} else {
SetMosfet_1(LOW); //JEŻELI DONOŃCZYŁ CYKL WYŁĄCZ MOSFET
}
delay(1); //CZEKAJ JEDNĄ MILISEKUNDE
}
ReadTrigger(); //SPRAWDZ CZY SPUST WYŁĄCZONY
}
SetMosfet_1(LOW); //UPEWNIJ SIĘ ŻE MOSFET WYŁĄCZONY
CurrentSleepTime = 0; //ZRESETUJ PĘTLĘ KIEDY SPUST PUSZCZONY
}
//LOOP CZYTANIA POJEDYŃCZEGO SKORPION
ReadTrigger();
int TriggerSelector_2_2 = digitalRead(TRIGGER_PIN) && digitalRead(SELEKTOR_SKORPION); //SPRAWDŹ CZY SPUST I SELEKTOR SKORPIONA SĄ WŁĄCZONE
if (TriggerSelector_2_2 == HIGH) //JEŚLI POWYŻSZE SĄ PRAWDĄ
{
SetMosfet_2(HIGH); //WŁĄCZ MOSFET
while (TriggerSelector_2_2 == HIGH)
{
int isSingleMode_2 = digitalRead(SWITCH_PIN_2);
if(isSingleMode_2 == HIGH) //JEŻELI SELEKTOR JEST WŁĄCZONY MAMY POJEDYNCZY
{
if(CurrentSleepTime < MAX_MOSFET_2_SIN) //JEŻELI NIE DOKOŃCZYŁ CYKLU
{
CurrentSleepTime = CurrentSleepTime + 1; //POZOSTAW MOSFET WŁĄCZONY I ZWIĘKSZ OCZEKIWANIE O 1
} else {
SetMosfet_2(LOW); //JEŻELI DONOŃCZYŁ CYKL WYŁĄCZ MOSFET
}
delay(1); //CZEKAJ JEDNĄ MILISEKUNDE
}
ReadTrigger(); //SPRAWDZ CZY SPUST WYŁĄCZONY
}
SetMosfet_2(LOW); //UPEWNIJ SIĘ ŻE MOSFET WYŁĄCZONY
CurrentSleepTime = 0; //ZRESETUJ PĘTLĘ KIEDY SPUST PUSZCZONY
}
//LOOP CZYTANIA CIĄGŁEGO AK
ReadTrigger();
int TriggerSelector_1_3 = digitalRead(TRIGGER_PIN) && digitalRead(SELEKTOR_AK); //SPRAWDŹ CZY SPUST I SELEKTOR AK SĄ WŁĄCZONE
if (TriggerSelector_1_3 == HIGH) //JEŚLI POWYŻSZE SĄ PRAWDĄ
{
SetMosfet_1(HIGH); //WŁĄCZ MOSFET
while (TriggerSelector_1_3 == HIGH)
{
int isSingleMode_1 = digitalRead(SWITCH_PIN_3);
if(isSingleMode_1 == HIGH) //JEŻELI SELEKTOR JEST WŁĄCZONY MAMY CIĄGŁY
{
if(CurrentSleepTime < MAX_MOSFET_1_AUTO) //JEŻELI NIE DOKOŃCZYŁ CYKLU
{
CurrentSleepTime = CurrentSleepTime + 1; //POZOSTAW MOSFET WŁĄCZONY I ZWIĘKSZ OCZEKIWANIE O 1
} else {
SetMosfet_1(LOW); //JEŻELI DONOŃCZYŁ CYKL WYŁĄCZ MOSFET
}
delay(1); //CZEKAJ JEDNĄ MILISEKUNDE
}
ReadTrigger(); //SPRAWDZ CZY SPUST WYŁĄCZONY
}
SetMosfet_1(LOW); //UPEWNIJ SIĘ ŻE MOSFET WYŁĄCZONY
CurrentSleepTime = 0; //ZRESETUJ PĘTLĘ KIEDY SPUST PUSZCZONY
}
//LOOP CZYTANIA CIĄGŁEGO SKORPION
ReadTrigger();
int TriggerSelector_2_3 = digitalRead(TRIGGER_PIN) && digitalRead(SELEKTOR_SKORPION); //SPRAWDŹ CZY SPUST I SELEKTOR SKORPIONA SĄ WŁĄCZONE
if (TriggerSelector_2_3 == HIGH) //JEŚLI POWYŻSZE SĄ PRAWDĄ
{
SetMosfet_2(HIGH); //WŁĄCZ MOSFET
while (TriggerSelector_2_3 == HIGH)
{
int isSingleMode_2 = digitalRead(SWITCH_PIN_3);
if(isSingleMode_2 == HIGH) //JEŻELI SELEKTOR JEST WŁĄCZONY MAMY CIĄGŁY
{
if(CurrentSleepTime < MAX_MOSFET_2_AUTO) //JEŻELI NIE DOKOŃCZYŁ CYKLU
{
CurrentSleepTime = CurrentSleepTime + 1; //POZOSTAW MOSFET WŁĄCZONY I ZWIĘKSZ OCZEKIWANIE O 1
} else {
SetMosfet_2(LOW); //JEŻELI DONOŃCZYŁ CYKL WYŁĄCZ MOSFET
}
delay(1); //CZEKAJ JEDNĄ MILISEKUNDE
}
ReadTrigger(); //SPRAWDZ CZY SPUST WYŁĄCZONY
}
SetMosfet_2(LOW); //UPEWNIJ SIĘ ŻE MOSFET WYŁĄCZONY
CurrentSleepTime = 0; //ZRESETUJ PĘTLĘ KIEDY SPUST PUSZCZONY
}
}