Android App for Garden Train
Control the trains of your railway from your phone. Switching between trains by simply changing Bluetooth connections.
Components and supplies
1
Dual H-Bridge motor drivers L298
1
HC-06 Bluetooth Module
1
Arduino Nano R3
Apps and platforms
1
Arduino Train Garden
1
Arduino IDE
Project description
Code
Sketch for Garden Train
arduino
Simple example
1//--------------------------------------// 2// # WWW.ARDUINORAILWAYCONTROL.COM // 3// // 4// ARDUINO GARDEN APP | SECOND SKETCH // 5// // 6// V.1.2019 Steve Massikker // 7//--------------------------------------// 8 9void(* resetFunc) (void) = 0; // RESET FUNCTION 10#include <SoftwareSerial.h> 11 12// SOFTWARE SERIAL 13SoftwareSerial Bluetooth(12, 13); // RX, TX 14 15// L298 16#define L298_ENA 9 17#define L298_IN1 10 18#define L298_IN2 11 19 20// LEDs 21#define FF_LED 3 // Forward Floodlight white LED 22#define BF_LED 4 // Backward Floodlight white LED 23#define FRR_LED 5 // Forward Rear Right red signal LED 24#define FRL_LED 6 // Forward Rear Left red signal LED 25#define BRR_LED 7 // Backward Rear Right red signal LED 26#define BRL_LED 8 // Backward Rear Left red signal LED 27 28// VARIABLES // 29bool stringComplete = false; 30String inputString = ""; 31// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 32byte speedArray [] = {40, 50, 60, 70, 80, 90,100,110,120,130,140,150,160,170,180,190,200,220,240,255}; 33byte speedTrain = 0; 34bool forwardMovingTrain; 35 36void setup() { 37 38// Initializing Serial 39 Bluetooth.begin(9600); 40 Serial.begin(9600); 41 inputString.reserve(4); 42 43// Initializing Motor-Driver 44 pinMode(L298_ENA, OUTPUT); 45 pinMode(L298_IN1, OUTPUT); 46 pinMode(L298_IN2, OUTPUT); 47 48// Initializing LEDs 49 pinMode(FF_LED, OUTPUT); 50 pinMode(BF_LED, OUTPUT); 51 pinMode(FRR_LED, OUTPUT); 52 pinMode(FRL_LED, OUTPUT); 53 pinMode(BRR_LED, OUTPUT); 54 pinMode(BRL_LED, OUTPUT); 55 56// Blinking all LEDs 57 digitalWrite(FF_LED, HIGH); 58 digitalWrite(BF_LED, HIGH); 59 delay(100); 60 digitalWrite(FRR_LED, HIGH); 61 digitalWrite(FRL_LED, HIGH); 62 digitalWrite(BRR_LED, HIGH); 63 digitalWrite(BRL_LED, HIGH); 64 delay(150); 65 digitalWrite(FF_LED, LOW); 66 digitalWrite(BF_LED, LOW); 67 digitalWrite(FRR_LED, LOW); 68 digitalWrite(FRL_LED, LOW); 69 digitalWrite(BRR_LED, LOW); 70 digitalWrite(BRL_LED, LOW); 71 72} 73 74void loop() { 75 76// ---- START PARSING INCOMING APP COMMANDS 77 if (stringComplete) { 78 79 if (inputString =="999") resetFunc(); // RESET AFTER BT CONNECTION 80 81 // Train control 82 if (inputString.charAt(0) =='a') { 83 84 // Speed 85 if (inputString.charAt(1) =='0') { 86 if (inputString.charAt(2) =='0') speedTrain = 0; 87 if (inputString.charAt(2) =='1') speedTrain = speedArray[0]; 88 if (inputString.charAt(2) =='2') speedTrain = speedArray[1]; 89 if (inputString.charAt(2) =='3') speedTrain = speedArray[2]; 90 if (inputString.charAt(2) =='4') speedTrain = speedArray[3]; 91 if (inputString.charAt(2) =='5') speedTrain = speedArray[4]; 92 if (inputString.charAt(2) =='6') speedTrain = speedArray[5]; 93 if (inputString.charAt(2) =='7') speedTrain = speedArray[6]; 94 if (inputString.charAt(2) =='8') speedTrain = speedArray[7]; 95 if (inputString.charAt(2) =='9') speedTrain = speedArray[8]; 96 } 97 if (inputString.charAt(1) =='1') { 98 if (inputString.charAt(2) =='0') speedTrain = speedArray[9]; 99 if (inputString.charAt(2) =='1') speedTrain = speedArray[10]; 100 if (inputString.charAt(2) =='2') speedTrain = speedArray[11]; 101 if (inputString.charAt(2) =='3') speedTrain = speedArray[12]; 102 if (inputString.charAt(2) =='4') speedTrain = speedArray[13]; 103 if (inputString.charAt(2) =='5') speedTrain = speedArray[14]; 104 if (inputString.charAt(2) =='6') speedTrain = speedArray[15]; 105 if (inputString.charAt(2) =='7') speedTrain = speedArray[16]; 106 if (inputString.charAt(2) =='8') speedTrain = speedArray[17]; 107 if (inputString.charAt(2) =='9') speedTrain = speedArray[18]; 108 } 109 if (inputString.charAt(1) =='2') { 110 if (inputString.charAt(2) =='0') speedTrain = speedArray[19]; 111 } 112 113 // Direction and Stop 114 if (inputString.charAt(1) =='d') { 115 if (inputString.charAt(2) =='f') { // (f) Forward 116 digitalWrite(L298_IN1, HIGH); 117 digitalWrite(L298_IN2, LOW); 118 forwardMovingTrain = true; 119 } 120 if (inputString.charAt(2) =='b') { // (b) Backward 121 digitalWrite(L298_IN1, LOW); 122 digitalWrite(L298_IN2, HIGH); 123 forwardMovingTrain = false; 124 } 125 if (inputString.charAt(2) =='s') { // (s) Stop button 126 digitalWrite(L298_IN1, LOW); 127 digitalWrite(L298_IN2, LOW); 128 speedTrain = 0; 129 } 130 } 131 analogWrite(L298_ENA, speedTrain); // Throttle 132 } 133 134 // LEDs control 135 if (inputString.charAt(0) =='l') { 136 // Forward Floodlight white LED 137 if (inputString.charAt(1) =='f') { 138 if (inputString.charAt(2) =='0') digitalWrite(FF_LED, LOW); 139 if (inputString.charAt(2) =='1') digitalWrite(FF_LED, HIGH); 140 } 141 // Backward Floodlight white LED 142 if (inputString.charAt(1) =='b') { 143 if (inputString.charAt(2) =='0') digitalWrite(BF_LED, LOW); 144 if (inputString.charAt(2) =='1') digitalWrite(BF_LED, HIGH); 145 } 146 // Rear red LEDs 147 if (inputString.charAt(1) =='r') { 148 if (inputString.charAt(2) =='0') { 149 digitalWrite(FRR_LED, LOW); 150 digitalWrite(FRL_LED, LOW); 151 digitalWrite(BRR_LED, LOW); 152 digitalWrite(BRL_LED, LOW); 153 } 154 if (inputString.charAt(2) =='1') { 155 if (forwardMovingTrain) { 156 digitalWrite(FRR_LED, LOW); 157 digitalWrite(FRL_LED, LOW); 158 digitalWrite(BRR_LED, HIGH); 159 digitalWrite(BRL_LED, HIGH); 160 } 161 else { 162 digitalWrite(FRR_LED, HIGH); 163 digitalWrite(FRL_LED, HIGH); 164 digitalWrite(BRR_LED, LOW); 165 digitalWrite(BRL_LED, LOW); 166 } 167 } 168 } 169 170 if (inputString.charAt(1) =='0') { 171 digitalWrite(FF_LED, LOW); 172 digitalWrite(BF_LED, LOW); 173 digitalWrite(FRR_LED, LOW); 174 digitalWrite(FRL_LED, LOW); 175 digitalWrite(BRR_LED, LOW); 176 digitalWrite(BRL_LED, LOW); 177 } 178 } 179 180 Serial.println(inputString); 181 inputString = ""; 182 stringComplete = false; 183 } 184 185 bluetoothEvent(); 186} 187 188 189//// FUNCTIONS //// 190 191void bluetoothEvent() { 192 if (Bluetooth.available()) { 193 char inChar = (char)Bluetooth.read(); 194 inputString += inChar; 195 if (inChar == 'z') { 196 stringComplete = true; 197 } 198 } 199}
Sketch for Garden Train
arduino
Simple example
1//--------------------------------------// 2// # WWW.ARDUINORAILWAYCONTROL.COM // 3// // 4// ARDUINO GARDEN APP | SECOND SKETCH // 5// // 6// V.1.2019 Steve Massikker // 7//--------------------------------------// 8 9void(* resetFunc) (void) = 0; // RESET FUNCTION 10#include <SoftwareSerial.h> 11 12// SOFTWARE SERIAL 13SoftwareSerial Bluetooth(12, 13); // RX, TX 14 15// L298 16#define L298_ENA 9 17#define L298_IN1 10 18#define L298_IN2 11 19 20// LEDs 21#define FF_LED 3 // Forward Floodlight white LED 22#define BF_LED 4 // Backward Floodlight white LED 23#define FRR_LED 5 // Forward Rear Right red signal LED 24#define FRL_LED 6 // Forward Rear Left red signal LED 25#define BRR_LED 7 // Backward Rear Right red signal LED 26#define BRL_LED 8 // Backward Rear Left red signal LED 27 28// VARIABLES // 29bool stringComplete = false; 30String inputString = ""; 31// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 32byte speedArray [] = {40, 50, 60, 70, 80, 90,100,110,120,130,140,150,160,170,180,190,200,220,240,255}; 33byte speedTrain = 0; 34bool forwardMovingTrain; 35 36void setup() { 37 38// Initializing Serial 39 Bluetooth.begin(9600); 40 Serial.begin(9600); 41 inputString.reserve(4); 42 43// Initializing Motor-Driver 44 pinMode(L298_ENA, OUTPUT); 45 pinMode(L298_IN1, OUTPUT); 46 pinMode(L298_IN2, OUTPUT); 47 48// Initializing LEDs 49 pinMode(FF_LED, OUTPUT); 50 pinMode(BF_LED, OUTPUT); 51 pinMode(FRR_LED, OUTPUT); 52 pinMode(FRL_LED, OUTPUT); 53 pinMode(BRR_LED, OUTPUT); 54 pinMode(BRL_LED, OUTPUT); 55 56// Blinking all LEDs 57 digitalWrite(FF_LED, HIGH); 58 digitalWrite(BF_LED, HIGH); 59 delay(100); 60 digitalWrite(FRR_LED, HIGH); 61 digitalWrite(FRL_LED, HIGH); 62 digitalWrite(BRR_LED, HIGH); 63 digitalWrite(BRL_LED, HIGH); 64 delay(150); 65 digitalWrite(FF_LED, LOW); 66 digitalWrite(BF_LED, LOW); 67 digitalWrite(FRR_LED, LOW); 68 digitalWrite(FRL_LED, LOW); 69 digitalWrite(BRR_LED, LOW); 70 digitalWrite(BRL_LED, LOW); 71 72} 73 74void loop() { 75 76// ---- START PARSING INCOMING APP COMMANDS 77 if (stringComplete) { 78 79 if (inputString =="999") resetFunc(); // RESET AFTER BT CONNECTION 80 81 // Train control 82 if (inputString.charAt(0) =='a') { 83 84 // Speed 85 if (inputString.charAt(1) =='0') { 86 if (inputString.charAt(2) =='0') speedTrain = 0; 87 if (inputString.charAt(2) =='1') speedTrain = speedArray[0]; 88 if (inputString.charAt(2) =='2') speedTrain = speedArray[1]; 89 if (inputString.charAt(2) =='3') speedTrain = speedArray[2]; 90 if (inputString.charAt(2) =='4') speedTrain = speedArray[3]; 91 if (inputString.charAt(2) =='5') speedTrain = speedArray[4]; 92 if (inputString.charAt(2) =='6') speedTrain = speedArray[5]; 93 if (inputString.charAt(2) =='7') speedTrain = speedArray[6]; 94 if (inputString.charAt(2) =='8') speedTrain = speedArray[7]; 95 if (inputString.charAt(2) =='9') speedTrain = speedArray[8]; 96 } 97 if (inputString.charAt(1) =='1') { 98 if (inputString.charAt(2) =='0') speedTrain = speedArray[9]; 99 if (inputString.charAt(2) =='1') speedTrain = speedArray[10]; 100 if (inputString.charAt(2) =='2') speedTrain = speedArray[11]; 101 if (inputString.charAt(2) =='3') speedTrain = speedArray[12]; 102 if (inputString.charAt(2) =='4') speedTrain = speedArray[13]; 103 if (inputString.charAt(2) =='5') speedTrain = speedArray[14]; 104 if (inputString.charAt(2) =='6') speedTrain = speedArray[15]; 105 if (inputString.charAt(2) =='7') speedTrain = speedArray[16]; 106 if (inputString.charAt(2) =='8') speedTrain = speedArray[17]; 107 if (inputString.charAt(2) =='9') speedTrain = speedArray[18]; 108 } 109 if (inputString.charAt(1) =='2') { 110 if (inputString.charAt(2) =='0') speedTrain = speedArray[19]; 111 } 112 113 // Direction and Stop 114 if (inputString.charAt(1) =='d') { 115 if (inputString.charAt(2) =='f') { // (f) Forward 116 digitalWrite(L298_IN1, HIGH); 117 digitalWrite(L298_IN2, LOW); 118 forwardMovingTrain = true; 119 } 120 if (inputString.charAt(2) =='b') { // (b) Backward 121 digitalWrite(L298_IN1, LOW); 122 digitalWrite(L298_IN2, HIGH); 123 forwardMovingTrain = false; 124 } 125 if (inputString.charAt(2) =='s') { // (s) Stop button 126 digitalWrite(L298_IN1, LOW); 127 digitalWrite(L298_IN2, LOW); 128 speedTrain = 0; 129 } 130 } 131 analogWrite(L298_ENA, speedTrain); // Throttle 132 } 133 134 // LEDs control 135 if (inputString.charAt(0) =='l') { 136 // Forward Floodlight white LED 137 if (inputString.charAt(1) =='f') { 138 if (inputString.charAt(2) =='0') digitalWrite(FF_LED, LOW); 139 if (inputString.charAt(2) =='1') digitalWrite(FF_LED, HIGH); 140 } 141 // Backward Floodlight white LED 142 if (inputString.charAt(1) =='b') { 143 if (inputString.charAt(2) =='0') digitalWrite(BF_LED, LOW); 144 if (inputString.charAt(2) =='1') digitalWrite(BF_LED, HIGH); 145 } 146 // Rear red LEDs 147 if (inputString.charAt(1) =='r') { 148 if (inputString.charAt(2) =='0') { 149 digitalWrite(FRR_LED, LOW); 150 digitalWrite(FRL_LED, LOW); 151 digitalWrite(BRR_LED, LOW); 152 digitalWrite(BRL_LED, LOW); 153 } 154 if (inputString.charAt(2) =='1') { 155 if (forwardMovingTrain) { 156 digitalWrite(FRR_LED, LOW); 157 digitalWrite(FRL_LED, LOW); 158 digitalWrite(BRR_LED, HIGH); 159 digitalWrite(BRL_LED, HIGH); 160 } 161 else { 162 digitalWrite(FRR_LED, HIGH); 163 digitalWrite(FRL_LED, HIGH); 164 digitalWrite(BRR_LED, LOW); 165 digitalWrite(BRL_LED, LOW); 166 } 167 } 168 } 169 170 if (inputString.charAt(1) =='0') { 171 digitalWrite(FF_LED, LOW); 172 digitalWrite(BF_LED, LOW); 173 digitalWrite(FRR_LED, LOW); 174 digitalWrite(FRL_LED, LOW); 175 digitalWrite(BRR_LED, LOW); 176 digitalWrite(BRL_LED, LOW); 177 } 178 } 179 180 Serial.println(inputString); 181 inputString = ""; 182 stringComplete = false; 183 } 184 185 bluetoothEvent(); 186} 187 188 189//// FUNCTIONS //// 190 191void bluetoothEvent() { 192 if (Bluetooth.available()) { 193 char inChar = (char)Bluetooth.read(); 194 inputString += inChar; 195 if (inChar == 'z') { 196 stringComplete = true; 197 } 198 } 199}
Downloadable files
Simple circuit for Garden Train
Simple circuit for Garden Train

Comments
Only logged in users can leave comments