Wpis z mikrobloga

Chcę dodać 'else if', tylko zastanawiam się jaki warunek dać aby pwm1 i pwm0 (czyli serwa w i2c) kontynuowały swoje obroty orczykiem?

for(uint8_t cnt=0; cnt<DEV_CNT; cnt++){

if(digitalRead(switch_nr[cnt].sw) == LOW){
if(switch_nr[cnt].state_flag == true) continue;
digitalWrite(switch_nr[cnt].l, HIGH);
digitalWrite(switch_nr[cnt].cl, HIGH);

pwm1.setPWM(cnt, 30, SERVOMAX);
pwm0.setPWM(cnt, 30, switch_nr[cnt].sv);

switch_nr[cnt].state_flag = true;
}else{
if(!switch_nr[cnt].state_flag) continue;
pwm1.setPWM(cnt, 0, SERVOMIN);
pwm0.setPWM(cnt, 0, COUNTER_MIN);

digitalWrite(switch_nr[cnt].l, LOW);
digitalWrite(switch_nr[cnt].cl, LOW);

switch_nr[cnt].state_flag = false;
}
}
}

#programowanie #cpp #arduino
  • 14
@bonaventure: Polecam przerobić jakiś kurs c++ Zelenta czy coś takiego. Sam próbowałem uczyć się programowania na Arduino i później na studiach zobaczyłem, że gówno po tym umiem. Nie chodzi o składnie czy wiedzę a o myślenie i algorytmy.
@bonaventure: Ale co tutaj powoduje delay? Przecież tutaj nie ma żadnego opóźnienia, a z tego co patrzę to setPWM nie jest blokującą funkcją. Chodzi o fragment kodu gdy "nic" się nie dzieje z przyciskiem?
@morsisko:
Aaaa ciągle mylę pojęcia z przyciskami :) Chodzi o przełącznik dźwigniowy ON/OFF.

Ta takie dokładnie działanie chcę, kiedy ON to serwo działa cały czas np. od 0 do 180 i 180 do 0.
Kiedy OFF poprostu wylacza sie.
@bonaventure: No a jaki jest aktualnie efekt działania twojego kodu który teraz masz? Bo z tego co widzę to teraz tak działa, gdy dźwignia/przycisk jest wciśnięta/ON to się kręci, natomiast gdy jest odciśnięta/OFF to przestaje
@bonaventure: No tak, teraz musisz zrobić żeby po określonym czasie ustawiało na SERVOMIN, najprostsze co mi przychodzi do głowy to dodać do tej struktury którą masz (tablica switchnr) pole z czasem kiedy zacząłeś obracać, i na przykład tutaj zrobić:

if (switch_nr[cnt].state_flag == true) continue;
na

if (switch_nr[cnt].state_flag == true && switch_nr[cnt].started + RENEW_TIME > milis()) continue;
i niżej dawać za zmianę servoMIN i servoMAX (o ile to odpowiada za kąt