Automatisk navigering Robot med Gas (MQ-2), temperatur & fuktighet (DHT11) sensorer (8 / 12 steg)
Steg 8: Koden
De bibliotek som behövs för denna kod ska fungera är:
- dht.h bibliotek för modulen DHT11.
- LiquidCrystal_I2C.h bibliotek för att kontrollera LCD med hjälp av I2C-modul.
- Servo.h bibliotek för kontroll av Servo
- AFMotor.h bibliotek för användning av L293D Motor sköld
- Wire.h biblioteket som tillåter kommunikation med I2C moduler
- LCD.h bibliotek för allmänna LCD användningen.
Koden: (Obs Lägg < > runt #include bibliotekets E.G #include dht.h bör #include eller istället ladda ner den bifogade filen heter "FinalAutoNavBotCode.ino" tack: D)
#include dht.h
DHT DHT;
#include LiquidCrystal_I2C.h
#include Servo.h
#include AFMotor.h
#include Wire.h
#include LCD.h
berättar arduino vad varje pin användning är ansluten till
#define trigPin 13
#define echoPin 12
#define servoMainPin 10
#define BACKLIGHT_PIN 7
#define LED_ON 1
#define DHT11_PIN 5 < /p >< p > Servo servoMain; Definiera våra Servo
AF_DCMotor motor2 (2, MOTOR12_64KHZ). skapa motor #2, 64KHz pwm
AF_DCMotor motor1 (1, MOTOR12_64KHZ); skapa motor #1, 64KHz pwm
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, positiv); Addr, sv, Rw, Rs, d4, d5, d6, d7, backlighpin, polaritet
int jag = 0;
int state = 0;
void setup() //Sets varje definierad pin som indata eller utdata så att arduino vad som väntar på varje pin
{
Serial.BEGIN(9600); Ställ in följetong bibliotek på 9600 bps
servoMain.attach(servoMainPin); servo på digital stift 10
pinMode (trigPin, produktionen); Unltrasonic utgång
pinMode (echoPin, ingång); Ultraljuds-ingång
motor2.setSpeed(200); ställa in hastigheten till 200
motor1.setSpeed(200); ställa in hastigheten till 200
LCD.BEGIN (16,4); initiera lcd
lcd.setBacklight(LED_ON); Slå på bakgrundsbelysningen
State = 0;
Delay(2000); vänta 2 sekunder
}
Ping-funktion för att få avståndet från HC-SR04
osignerade långa ping()
{
Utlösa uSonic sensorn (HC-SR04) att skicka ut en ping
lång varaktighet, avstånd; Inledande sträcka åtgärd
digitalWrite (trigPin, låg); Lagt till denna rad
delayMicroseconds(1); Lagt till denna rad
digitalWrite (trigPin, hög); delayMicroseconds(1000); -Tagit bort denna rad
delayMicroseconds(1); Lagt till denna rad
digitalWrite (trigPin, låg);
längd = pulseIn (echoPin, hög);
avståndet = (längd/2) / 29,1;
Delay(100);
ClearLCD();
avkastning (avstånd);
}
Framåt Fuction anger motors gå vidare
void forward()
{
Serial.println("forward");
motor2.setSpeed(200); ställa in hastigheten till 200
motor1.setSpeed(200); ställa in hastigheten till 200
motor2.Run(forward); framöver
motor1.Run(forward); framöver
Delay(200);
botstopF();
}
Rätt funktion anger motorer för rätt
void right()
{
Serial.println("Right");
motor2.setSpeed(200); ställa in hastigheten till 200
motor1.setSpeed(200); ställa in hastigheten till 200
motor2.Run(Backward); gå bakåt
motor1.Run(forward); framöver
Delay(200);
botstopR();
}
Vänster funktion anger motorer för vänster
void left()
{
Serial.println("left");
motor2.setSpeed(200); ställa in hastigheten till 200
motor1.setSpeed(200); ställa in hastigheten till 200
motor2.Run(forward); framöver
motor1.Run(Backward); gå bakåt
Delay(200);
botstopL();
}
Tillbaka funktionen ställer in motorer går bakåt
void back()
{
Serial.println("back");
motor2.setSpeed(200); ställa in hastigheten till 200
motor1.setSpeed(200); ställa in hastigheten till 200
motor2.Run(Backward); gå bakåt
motor1.Run(Backward); gå bakåt
Delay(100);
botstopB();
}
Funktionen används för att stoppa motorer när framöver
void botstopF()
{
motor2.setSpeed(0); ställa in hastigheten till 200
motor1.setSpeed(0); ställa in hastigheten till 200
motor2.Run(forward); framöver
motor1.Run(forward); framöver
Delay(100);
}
Funktionen används för att stoppa motorer när man går bakåt, på grund av problem med allmänna stopp
void botstopB()
{
motor2.setSpeed(0); ställa in hastigheten till 200
motor1.setSpeed(0); ställa in hastigheten till 200
motor2.Run(Backward); framöver
motor1.Run(Backward); framöver
Delay(100);
}
Tydliga LCD-displayen
void clearlcd()
{
LCD.Clear();
LCD.Home();
}
Funktionen att samla DHT11 sensordata för temp, returnerar läsning
osignerade långa DHTTemp()
{
int chk = DHT.read11(DHT11_PIN);
Serial.println ("Temparature");
Serial.println (DHT.temperature, 1);
Return (DHT.temperature);
}
Funktionen att samla DHT11 sensordata för humi, returnerar läsning
osignerade långa DHTHum()
{
int chk = DHT.read11(DHT11_PIN);
Serial.println ("luftfuktighet");
Serial.println (DHT.humidity, 1);
Return (DHT.humidity);
}
Funktionen att samla in data från MQ-2 sensor, konverterar till spänning returnerar konverterade värdet som flöte
float MQ2()
{
float sensor_volt;
float sensorValue;
sensorValue = analogRead(A0);
sensor_volt = sensorValue/1024 * 5.0;
Serial.println ("MQ-2 Volt:");
Serial.println(sensor_volt);
Return (sensor_volt);
}
void loop()
{
Long int forwdis, leftdis, rightdis, temp, hum;
float gas.
Används för att ansluta bluetooth-enhet via bluetooth-modul
IF(Serial.available() > 0)
{
State = Serial.read();
Serial.Print ("jag fick:");
Serial.println(State);
Delay(10);
}
När bluetooth-anslutning skickar 0 i denna stat som är själv navigering
om (statligt == '0')
{
gas = MQ2(); Kör MQ2 funktion sparar värdet i gas
lcd.setCursor(6,1);
LCD.Print("gas:"); Visa gas på LCD-skärm
LCD.Print(gas); Skriver ut gas
Temp = DHTTemp(); Kör DHTTemp funktion sparar värdet i temp
lcd.setCursor(6,2);
LCD.Print("Temp:"); Visar temp på LCD-skärmen visar
LCD.Print(temp); Tryck temp
hum = DHTHum(); Kör DHTHum funktion spara värdet i hum
lcd.setCursor(16,2);
LCD.Print("Humi:"); Visar hum på LCD
LCD.Print(hum); Utskrifter Hum
servoMain.write(90); Centrum Servo
Delay(150);
forwdis = ping(); Kör Ping fucntion reurns avstånd sparar som framåt avstånd
Serial.println (forwdis); Skriva ut framåt avstånd
i ++;
om (jag == 8) / / används som LCD-skärmen skulle ibland bryta, detta kunde rensa det fastställande problem kommenterar ut om inga problem
{
ClearLCD();
Jag = 0;
}
om (forwdis > = 12) //If framåt dis är större än 12 cm håll framöver
{
Forward();
ClearLCD();
lcd.setCursor(7,0);
LCD.Print("forward"); Visningsriktningen för movment
lcd.setCursor(12,4);
LCD.Print(forwdis); Skriva ut avståndet i cm
LCD.Print("cm");
}
annat om (forwdis < 12) //If avståndet är mindre än 12 cm sedan
{
Back();
Titta vänster och hamna på avstånd
servoMain.write(165);
Delay(150);
leftdis = ping();
Serial.println (leftdis);
Ser rätt och få rätt avstånd
servoMain.write(15);
Delay(150);
rightdis = ping();
Serial.println (rightdis);
Återställa servo centrum hårstrån
servoMain.write(90);
Delay(150);
Om vänster avståndet är mer än rätt då gå vänster
om (leftdis > rightdis)
{
ClearLCD();
lcd.setCursor(7,0);
LCD.Print("left"); Visningsriktningen för movment
lcd.setCursor(13,4);
LCD.Print(leftdis); Skriva ut avståndet i cm
Left();
}
Om rätt avstånd är större än vänster avstånd går rätt
annars om (rightdis > leftdis)
{
ClearLCD();
lcd.setCursor(7,0);
LCD.Print("Right"); Visningsriktningen för movment
lcd.setCursor(13,4);
LCD.Print(rightdis); Skriva ut avståndet i cm
Right();
}
Om varje är samma går bakåt och tydliga LCD
annat if (rightdis == leftdis)
{
ClearLCD();
Back();
}
}
}
Om Bluetooth-anslutning skickar ändra 1 status i inaktivt läge i detta läge motors paus medan sensorer fortfarande läsa
annars om (statligt == '1') / / om 1 framlänges
{
motor2.Run(release);
motor1.Run(release);
ClearLCD();
lcd.setCursor(7,0);
LCD.Print("Idle"); Visningsriktningen för movment
Serial.println ("inaktiv");
gas = MQ2();
lcd.setCursor(6,1);
LCD.Print("gas:");
LCD.Print(gas);
Temp = DHTTemp();
lcd.setCursor(6,2);
LCD.Print("Temp:");
LCD.Print(temp);
hum = DHTHum();
lcd.setCursor(16,2);
LCD.Print("Humi:");
LCD.Print(hum);
motor2.Run(release);
motor1.Run(release);
Delay(1000);
}
}