Робот 4WD продолжает мерзнуть
#include <dht.h>
#include <Servo.h>
#define servoPin 11
// Create a servo object
Servo Servo1;
//Ultrasonic Sensor
#define trigPin 9
#define echoPin 10
// defines variables
long duration;
int distance;
//sensor pins
#define gasSens A4
dht DHT;
#define DHT11_PIN 2
//motor driver pins
#define in1 8
#define in2 7
#define in3 6
#define in4 5
//infared pins
#define lftIr 12
#define ctrIr 4
#define rghIr 3
#define buzzer 13
int dist=1000;
int lastVal=0;
int degVal;
int leftDist;
int rightDist;
int gasVal;
int logicVal=49;
int buzzerTrig=0;
unsigned long curTime;
void setup() {
// put your setup code here, to run once:
Servo1.attach(servoPin);
Servo1.write(100);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(lftIr,INPUT);
pinMode(ctrIr,INPUT);
pinMode(rghIr,INPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
curTime=millis();
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
if(Serial.available() > 0){ // Checks whether data is comming from the serial port
logicVal = Serial.read(); // Reads the data from the serial port
}
if(millis()-curTime>=10000){
int chk = DHT.read11(DHT11_PIN);
gasVal=analogRead(gasSens);
Serial.print(DHT.temperature);
Serial.print(" C");
Serial.print("|");
Serial.print(DHT.humidity);
Serial.print("%");
Serial.print("|");
Serial.print(gasVal);
Serial.print("|");
if(gasVal>500){Serial.println("Dangerous gas levels");buzzerTrig=1;}
else{Serial.println("normal");buzzerTrig=0;}
curTime=millis();
}
if(buzzerTrig==1){
buzzerCall();
logicVal==48;
}
if(logicVal=='1'){
dist=distanceCall();
int leftIr=digitalRead(lftIr);
int centerIr=digitalRead(ctrIr);
int rightIr=digitalRead(rghIr);
if (leftIr==LOW && rightIr==HIGH){
stopAll();
while(leftIr==LOW){
rightMov();
leftIr=digitalRead(lftIr);
}
stopAll();
}
else if (leftIr==HIGH && rightIr==LOW){
stopAll();
while(rightIr==LOW){
leftMov();
rightIr=digitalRead(rghIr);
}
stopAll();
}
else if (leftIr==LOW && centerIr==LOW && rightIr==LOW){
stopAll();
while(leftIr==LOW || centerIr==LOW || rightIr==LOW){
backMov;
leftIr=digitalRead(lftIr);
centerIr=digitalRead(ctrIr);
rightIr=digitalRead(rghIr);
}
stopAll();
}
else if (leftIr==HIGH && centerIr==LOW && rightIr==HIGH){
stopAll();
while(centerIr==LOW){
backMov;
centerIr=digitalRead(ctrIr);
}
stopAll();
delay(10);
leftMov();
delay(500);
stopAll();
}
else{
fowardMov();
}
}
}
int distanceCall(){
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance= duration*0.034/2;
return distance;
}
void fowardMov(){
digitalWrite(in2,HIGH);
digitalWrite(in4,HIGH);
digitalWrite(in1, LOW);
digitalWrite(in3, LOW);
}
void backMov(){
digitalWrite(in1,HIGH);
digitalWrite(in3,HIGH);
digitalWrite(in2, LOW);
digitalWrite(in4, LOW);
}
void rightMov(){
digitalWrite(in1, HIGH);
digitalWrite(in4, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
}
void leftMov(){
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in1, LOW);
digitalWrite(in4, LOW);
}
void stopAll(){
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void buzzerCall(){
tone(buzzer, 5000);
delay(500);
noTone(buzzer);
tone(buzzer, 1000);
delay(500);
noTone(buzzer);
}
Цель состоит в том, чтобы робот избегал препятствий и двигался автономно, используя только инфракрасные датчики. Раньше я питал все от батареек, но иногда они трясутся и медленно двигаются, поэтому я решил питать их по отдельности. Как вы думаете, проблема в моем коде или проблема в оборудовании? Спасибо
Ответы
Я не удивлен, что у вас возникли проблемы, поскольку у вас очень сложная система. При устранении неполадок в сложных системах важно разбить его на очень простые «куски» и убедиться, что каждый простой элемент работает отдельно.
Я бы удалил из вашей системы все, кроме кода трех ИК-датчиков, и использовал бы генератор случайных чисел для генерации случайного числа от 0 до 7. Затем я бы использовал двоичное представление этого числа для генерации возвращаемых значений для digitalRead. () вызывает датчики с соответствующими распечатками, чтобы показать вам, какие значения были сгенерированы и какое влияние эти значения произвели. Я думаю, вы обнаружите, что одно или несколько из 8 возможных значений вызывают проблемы, поскольку у вас есть только предложения IF для 4 (или 6, если вы посчитаете две двузначные системы дважды).