Ciao leo, benvenuto nel forum! (Se non lo avessi già fatto, preparati nell'apposita sezione eh
)
If ed else vanno benissimo se i collegamenti sono giusti, ma ricordati di racchiudere la funzione in un loop, in modo che controlli sempre. Posto qui il codice aggiornato a ieri del mio robottino, spero ti sia utile, controlla la parte "exploration e usdis".
//------------------------------------------------/*/*variables and libraries*\*\---------------------------------------------
#include <IRremote.h>
const int receiver = 6;
IRrecv irrecv(receiver);
decode_results results;
const int mot1fr = 2;
const int mot1bk = 3;
const int mot2fr = 4;
const int mot2bk = 5;
const int trigger = 7;
const int echo = 8;
const int mode = A0;
const int rgRed = A1;
const int rgGreen = A2;
int valmode = 0;
int valecho = 0;
int usdelay = 0;
int usdistance = 0;
int valir = 0;
//------------------------------------------------/*/*setup*\*\------------------------------------------------
void setup() {
pinMode(mot1fr, OUTPUT);
pinMode(mot1bk, OUTPUT);
pinMode(mot2fr, OUTPUT);
pinMode(mot2bk, OUTPUT);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
irrecv.enableIRIn();
}
//------------------------------------------------/*/*loop*\*\------------------------------------------------
void loop() {
valmode = analogRead(mode);
if (valmode >= 0 && valmode <= 10) {
manual();
manualLed();
} else if (valmode >= 20 && valmode <= 30) {
resetLed();
analogWrite(rgGreen, 255);
exploration();
} else {
motorStop();
waitingLed();
}
}
//------------------reset led status------------------
void resetLed() {
analogWrite(rgRed,0);
analogWrite(rgGreen,0);
}
//------------------manual mode led status------------------
void manualLed() {
resetLed();
analogWrite(rgRed, 255);
analogWrite(rgGreen, 128);
delay(150);
analogWrite(rgGreen, 0);
delay(150);
}
//------------------waiting led status------------------
void waitingLed() {
resetLed();
analogWrite(rgRed,255);
analogWrite(rgGreen,255);
delay(150);
analogWrite(rgGreen,128);
analogWrite(rgRed,0);
delay(150);
analogWrite(rgGreen, 0);
analogWrite(rgRed, 128);
delay(150);
}
//------------------exploration mode------------------
void exploration() {
while (!irrecv.decode(&results)) {
usdis();
if (usdistance > 10) {
goForward();
} else {
turnLeft();
analogWrite(rgRed, 128);
delay(100);
analogWrite(rgRed, 128);
delay(100);
}
}
motorStop();
}
//------------------manual mode------------------
void manual() {
if (irrecv.decode(&results)) {
switch(results.value) {
case 16615543:
goForward();
break;
case 16619623:
goBack();
break;
case 16591063:
turnLeft();
break;
case 16607383:
turnRight();
break;
case 16623703:
motorStop();
break;
}
irrecv.resume();
}
}
//------------------ultrasonic module controller------------------
void usdis() {
digitalWrite(trigger, LOW );
digitalWrite(trigger,HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW);
usdelay = pulseIn(echo, HIGH );
usdistance = 0.034 * usdelay / 2;
}
//------------------------------------------------/*/*motor controller*\*\------------------------------------------------
void motorStop() {
digitalWrite(mot1fr,LOW);
digitalWrite(mot1bk, LOW);
digitalWrite(mot2fr, LOW);
digitalWrite(mot2bk, LOW);
}
void goForward() {
motorStop();
digitalWrite(mot1fr, HIGH);
digitalWrite(mot2fr, HIGH);
}
void goBack() {
motorStop();
digitalWrite(mot1bk, HIGH);
digitalWrite(mot2bk, HIGH);
}
void turnRight() {
motorStop();
digitalWrite(mot2bk, HIGH);
digitalWrite(mot1fr, HIGH);
}
void turnLeft() {
motorStop();
digitalWrite(mot1bk, HIGH);
digitalWrite(mot2fr, HIGH);
}
Ciao.
P.s. essendo da telefono non posso controllare il tuo codice, spero quindi di non aver detto qualcosa effettivamente già eseguito.