Robot Car - Shift Register, Sensors, and App interfacing
A bluetooth controlled multi-functionality robot car.
Components and supplies
1
BMP180
1
Capacitor 10 µF
1
Solderless Breadboard Full Size
4
Yellow Wheel
2
5 mm LED: Red
1
PLA Filament
4
DC Motor, 12 V
1
DHT11 Temperature & Humidity Sensor (4 pins)
1
Dual H-Bridge motor drivers L298
1
Pack of Resistors
1
Arduino Nano R3
1
HM-10
2
High Brightness LED, White
1
Jumper wires (generic)
1
Toggle Switch, Toggle
1
4xAA battery holder
1
Grove - Gas Sensor(MQ2)
1
Female/Female Jumper Wires
Tools and machines
1
Scissor, Electrician
1
3D Printer (generic)
1
Tape, Electrical
Apps and platforms
1
Dabble
Project description
Code
Code
c_cpp
1#define CUSTOM_SETTINGS 2#define INCLUDE_GAMEPAD_MODULE 3#define INCLUDE_TERMINAL_MODULE 4 5#include <Dabble.h> 6#include <ShiftRegister74HC595.h> 7#include <Wire.h> 8#include <SFE_BMP180.h> 9#include <MQ2.h> 10#include <dht.h> 11 12int numberOfShiftRegisters = 1; 13int serialDataPin = 12; 14int clockPin = 10; 15int latchPin = 11; 16 17ShiftRegister74HC595<1> sr(serialDataPin, clockPin, latchPin); 18 19SFE_BMP180 bmp180; 20dht DHT; 21 22const int dht = 5; 23 24String str = "Pressure Sensor "; 25String str1 = "Gas Sensor "; 26String str2 = "Humidity Sensor "; 27String str3 = "Light Sensor "; 28 29const int GAS_SENSOR = A6; 30int lpg, co, smoke; 31 32MQ2 mq2(GAS_SENSOR); 33 34const int ENA = 0; 35const int N1 = 1; 36const int N2 = 2; 37const int N3 = 3; 38const int N4 = 4; 39const int ENB = 5; 40 41const int HEADLIGHT = 6; 42int HEADLIGHT_STATUS = HIGH; 43unsigned long previousMillis = 0; 44const long interval = 500; 45 46const int BACKLIGHT = 7; 47 48const int RIGHT = A3; 49const int MIDDLE = A2; 50const int LEFT = A1; 51 52int rightRead, middleRead, leftRead; 53 54int wheelsState = 1; 55 56const int FRONT1 = 9; 57const int FRONT2 = 8; 58 59const int BACK1 = 7; 60const int BACK2 = 6; 61 62int front1Read, front2Read, back1Read, back2Read; 63 64const int LDR = A7; 65 66void setup() 67{ 68 pinMode(GAS_SENSOR, INPUT); 69 70 Dabble.begin(9600); 71 Serial.begin(9600); 72 73 sr.set(HEADLIGHT, HIGH); 74 75 pinMode(FRONT1, INPUT); 76 pinMode(FRONT2, INPUT); 77 pinMode(BACK1, INPUT); 78 pinMode(BACK2, INPUT); 79 80 mq2.begin(); 81 bool success = bmp180.begin(); 82 83 if (success) { 84 Serial.println("BMP180 init success"); 85 } 86} 87 88void buttonRead() 89{ 90 if (wheelsState == HIGH) { 91 if (GamePad.isUpPressed()) 92 { 93 Serial.println("Up"); 94 sr.set(BACKLIGHT, LOW); 95 sr.set(ENA, HIGH); 96 sr.set(N1, LOW); 97 sr.set(N2, HIGH); 98 sr.set(ENB, HIGH); 99 sr.set(N3, HIGH); 100 sr.set(N4, LOW); 101 } 102 103 else if (GamePad.isDownPressed()) 104 { 105 Serial.println("Down"); 106 sr.set(BACKLIGHT, HIGH); 107 sr.set(ENA, HIGH); 108 sr.set(N1, HIGH); 109 sr.set(N2, LOW); 110 sr.set(ENB, HIGH); 111 sr.set(N3, LOW); 112 sr.set(N4, HIGH); 113 } 114 115 else if (GamePad.isLeftPressed()) 116 { 117 Serial.println("Left"); 118 sr.set(BACKLIGHT, LOW); 119 sr.set(ENA, HIGH); 120 sr.set(N1, HIGH); 121 sr.set(N2, LOW); 122 sr.set(ENB, HIGH); 123 sr.set(N3, HIGH); 124 sr.set(N4, LOW); 125 } 126 127 else if (GamePad.isRightPressed()) 128 { 129 Serial.println("Right"); 130 sr.set(BACKLIGHT, LOW); 131 sr.set(ENA, HIGH); 132 sr.set(N1, LOW); 133 sr.set(N2, HIGH); 134 sr.set(ENB, HIGH); 135 sr.set(N3, LOW); 136 sr.set(N4, HIGH); 137 } 138 else 139 { 140 sr.set(ENA, LOW); 141 sr.set(N1, LOW); 142 sr.set(N2, LOW); 143 sr.set(ENB, LOW); 144 sr.set(N3, LOW); 145 sr.set(N4, LOW); 146 } 147 } 148 else 149 { 150 sr.set(ENA, LOW); 151 sr.set(N1, LOW); 152 sr.set(N2, LOW); 153 sr.set(ENB, LOW); 154 sr.set(N3, LOW); 155 sr.set(N4, LOW); 156 } 157} 158void headLights() { 159 if (GamePad.isTrianglePressed()) { 160 unsigned long currentMillis = millis(); 161 162 if (currentMillis - previousMillis >= interval) { 163 previousMillis = currentMillis; 164 165 HEADLIGHT_STATUS = !HEADLIGHT_STATUS; 166 sr.set(HEADLIGHT, HEADLIGHT_STATUS); 167 } 168 } 169} 170 171void sensorReadings() 172{ 173 if (Terminal.available() > 0) { 174 if (Terminal.compareString(str)) { 175 char status; 176 double T, P; 177 bool success = false; 178 179 status = bmp180.startTemperature(); 180 181 if (status != 0) { 182 delay(1000); 183 status = bmp180.getTemperature(T); 184 185 if (status != 0) { 186 status = bmp180.startPressure(3); 187 188 if (status != 0) { 189 delay(status); 190 status = bmp180.getPressure(P, T); 191 192 if (status != 0) { 193 Terminal.println("Pressure: "); 194 Terminal.println(P); 195 Terminal.println(" hPa"); 196 197 Terminal.println("Temperature: "); 198 Terminal.println(T); 199 Terminal.println("C"); 200 } 201 } 202 } 203 } 204 } 205 else if (Terminal.compareString(str1)) { 206 float* values = mq2.read(true); 207 lpg = mq2.readLPG(); 208 co = mq2.readCO(); 209 smoke = mq2.readSmoke(); 210 211 Terminal.println("LPG"); 212 Terminal.println(lpg); 213 Terminal.println("CO2"); 214 Terminal.println(co); 215 Terminal.println("Smoke"); 216 Terminal.println(smoke); 217 Terminal.println("PPM"); 218 } 219 else if (Terminal.compareString(str2)) { 220 int chk = DHT.read11(dht); 221 Terminal.println(DHT.humidity); 222 Terminal.println("%"); 223 } 224 else if (Terminal.compareString(str3)) { 225 int lightValue = analogRead(LDR); 226 Terminal.println("Light Value: "); 227 if (lightValue >= 900) { 228 Terminal.println("High"); 229 } 230 else if (lightValue <= 899 && lightValue >= 880) { 231 Terminal.println("Medium"); 232 } 233 else { 234 Terminal.println("Low"); 235 } 236 } 237 } 238} 239 240void liftDetection() 241{ 242 rightRead = digitalRead(RIGHT); 243 middleRead = digitalRead(MIDDLE); 244 leftRead = digitalRead(LEFT); 245 246 if (rightRead == 1 || middleRead == 1 || leftRead == 1) { //on ground 247 wheelsState = HIGH; 248 } 249 if (rightRead == 0 && middleRead == 0 && leftRead == 0) { //off ground 250 wheelsState = LOW; 2514 } 252} 253 254 255void obstactleDetection() { 256 front1Read = digitalRead(FRONT1); 257 front2Read = digitalRead(FRONT2); 258 back1Read = digitalRead(BACK1); 259 back2Read = digitalRead(BACK2); 260 261 if (front1Read == HIGH || front2Read == HIGH || back1Read == HIGH || back2Read == HIGH) { 262 sr.set(ENA, LOW); 263 sr.set(N1, LOW); 264 sr.set(N2, LOW); 265 sr.set(ENB, LOW); 266 sr.set(N3, LOW); 267 sr.set(N4, LOW); 268 } 269} 270void loop() { 271 Dabble.processInput(); 272 273 obstactleDetection(); 274 liftDetection(); 275 buttonRead(); 276 sensorReadings(); 277 headLights(); 278}
Code
c_cpp
1#define CUSTOM_SETTINGS 2#define INCLUDE_GAMEPAD_MODULE 3#define INCLUDE_TERMINAL_MODULE 4 5#include <Dabble.h> 6#include <ShiftRegister74HC595.h> 7#include <Wire.h> 8#include <SFE_BMP180.h> 9#include <MQ2.h> 10#include <dht.h> 11 12int numberOfShiftRegisters = 1; 13int serialDataPin = 12; 14int clockPin = 10; 15int latchPin = 11; 16 17ShiftRegister74HC595<1> sr(serialDataPin, clockPin, latchPin); 18 19SFE_BMP180 bmp180; 20dht DHT; 21 22const int dht = 5; 23 24String str = "Pressure Sensor "; 25String str1 = "Gas Sensor "; 26String str2 = "Humidity Sensor "; 27String str3 = "Light Sensor "; 28 29const int GAS_SENSOR = A6; 30int lpg, co, smoke; 31 32MQ2 mq2(GAS_SENSOR); 33 34const int ENA = 0; 35const int N1 = 1; 36const int N2 = 2; 37const int N3 = 3; 38const int N4 = 4; 39const int ENB = 5; 40 41const int HEADLIGHT = 6; 42int HEADLIGHT_STATUS = HIGH; 43unsigned long previousMillis = 0; 44const long interval = 500; 45 46const int BACKLIGHT = 7; 47 48const int RIGHT = A3; 49const int MIDDLE = A2; 50const int LEFT = A1; 51 52int rightRead, middleRead, leftRead; 53 54int wheelsState = 1; 55 56const int FRONT1 = 9; 57const int FRONT2 = 8; 58 59const int BACK1 = 7; 60const int BACK2 = 6; 61 62int front1Read, front2Read, back1Read, back2Read; 63 64const int LDR = A7; 65 66void setup() 67{ 68 pinMode(GAS_SENSOR, INPUT); 69 70 Dabble.begin(9600); 71 Serial.begin(9600); 72 73 sr.set(HEADLIGHT, HIGH); 74 75 pinMode(FRONT1, INPUT); 76 pinMode(FRONT2, INPUT); 77 pinMode(BACK1, INPUT); 78 pinMode(BACK2, INPUT); 79 80 mq2.begin(); 81 bool success = bmp180.begin(); 82 83 if (success) { 84 Serial.println("BMP180 init success"); 85 } 86} 87 88void buttonRead() 89{ 90 if (wheelsState == HIGH) { 91 if (GamePad.isUpPressed()) 92 { 93 Serial.println("Up"); 94 sr.set(BACKLIGHT, LOW); 95 sr.set(ENA, HIGH); 96 sr.set(N1, LOW); 97 sr.set(N2, HIGH); 98 sr.set(ENB, HIGH); 99 sr.set(N3, HIGH); 100 sr.set(N4, LOW); 101 } 102 103 else if (GamePad.isDownPressed()) 104 { 105 Serial.println("Down"); 106 sr.set(BACKLIGHT, HIGH); 107 sr.set(ENA, HIGH); 108 sr.set(N1, HIGH); 109 sr.set(N2, LOW); 110 sr.set(ENB, HIGH); 111 sr.set(N3, LOW); 112 sr.set(N4, HIGH); 113 } 114 115 else if (GamePad.isLeftPressed()) 116 { 117 Serial.println("Left"); 118 sr.set(BACKLIGHT, LOW); 119 sr.set(ENA, HIGH); 120 sr.set(N1, HIGH); 121 sr.set(N2, LOW); 122 sr.set(ENB, HIGH); 123 sr.set(N3, HIGH); 124 sr.set(N4, LOW); 125 } 126 127 else if (GamePad.isRightPressed()) 128 { 129 Serial.println("Right"); 130 sr.set(BACKLIGHT, LOW); 131 sr.set(ENA, HIGH); 132 sr.set(N1, LOW); 133 sr.set(N2, HIGH); 134 sr.set(ENB, HIGH); 135 sr.set(N3, LOW); 136 sr.set(N4, HIGH); 137 } 138 else 139 { 140 sr.set(ENA, LOW); 141 sr.set(N1, LOW); 142 sr.set(N2, LOW); 143 sr.set(ENB, LOW); 144 sr.set(N3, LOW); 145 sr.set(N4, LOW); 146 } 147 } 148 else 149 { 150 sr.set(ENA, LOW); 151 sr.set(N1, LOW); 152 sr.set(N2, LOW); 153 sr.set(ENB, LOW); 154 sr.set(N3, LOW); 155 sr.set(N4, LOW); 156 } 157} 158void headLights() { 159 if (GamePad.isTrianglePressed()) { 160 unsigned long currentMillis = millis(); 161 162 if (currentMillis - previousMillis >= interval) { 163 previousMillis = currentMillis; 164 165 HEADLIGHT_STATUS = !HEADLIGHT_STATUS; 166 sr.set(HEADLIGHT, HEADLIGHT_STATUS); 167 } 168 } 169} 170 171void sensorReadings() 172{ 173 if (Terminal.available() > 0) { 174 if (Terminal.compareString(str)) { 175 char status; 176 double T, P; 177 bool success = false; 178 179 status = bmp180.startTemperature(); 180 181 if (status != 0) { 182 delay(1000); 183 status = bmp180.getTemperature(T); 184 185 if (status != 0) { 186 status = bmp180.startPressure(3); 187 188 if (status != 0) { 189 delay(status); 190 status = bmp180.getPressure(P, T); 191 192 if (status != 0) { 193 Terminal.println("Pressure: "); 194 Terminal.println(P); 195 Terminal.println(" hPa"); 196 197 Terminal.println("Temperature: "); 198 Terminal.println(T); 199 Terminal.println("C"); 200 } 201 } 202 } 203 } 204 } 205 else if (Terminal.compareString(str1)) { 206 float* values = mq2.read(true); 207 lpg = mq2.readLPG(); 208 co = mq2.readCO(); 209 smoke = mq2.readSmoke(); 210 211 Terminal.println("LPG"); 212 Terminal.println(lpg); 213 Terminal.println("CO2"); 214 Terminal.println(co); 215 Terminal.println("Smoke"); 216 Terminal.println(smoke); 217 Terminal.println("PPM"); 218 } 219 else if (Terminal.compareString(str2)) { 220 int chk = DHT.read11(dht); 221 Terminal.println(DHT.humidity); 222 Terminal.println("%"); 223 } 224 else if (Terminal.compareString(str3)) { 225 int lightValue = analogRead(LDR); 226 Terminal.println("Light Value: "); 227 if (lightValue >= 900) { 228 Terminal.println("High"); 229 } 230 else if (lightValue <= 899 && lightValue >= 880) { 231 Terminal.println("Medium"); 232 } 233 else { 234 Terminal.println("Low"); 235 } 236 } 237 } 238} 239 240void liftDetection() 241{ 242 rightRead = digitalRead(RIGHT); 243 middleRead = digitalRead(MIDDLE); 244 leftRead = digitalRead(LEFT); 245 246 if (rightRead == 1 || middleRead == 1 || leftRead == 1) { //on ground 247 wheelsState = HIGH; 248 } 249 if (rightRead == 0 && middleRead == 0 && leftRead == 0) { //off ground 250 wheelsState = LOW; 2514 } 252} 253 254 255void obstactleDetection() { 256 front1Read = digitalRead(FRONT1); 257 front2Read = digitalRead(FRONT2); 258 back1Read = digitalRead(BACK1); 259 back2Read = digitalRead(BACK2); 260 261 if (front1Read == HIGH || front2Read == HIGH || back1Read == HIGH || back2Read == HIGH) { 262 sr.set(ENA, LOW); 263 sr.set(N1, LOW); 264 sr.set(N2, LOW); 265 sr.set(ENB, LOW); 266 sr.set(N3, LOW); 267 sr.set(N4, LOW); 268 } 269} 270void loop() { 271 Dabble.processInput(); 272 273 obstactleDetection(); 274 liftDetection(); 275 buttonRead(); 276 sensorReadings(); 277 headLights(); 278}
Downloadable files
Circuit Diagram
Circuit Diagram

Comments
Only logged in users can leave comments