#include <Wire.h>#include <LCD.h>#include <LiquidCrystal_I2C.h>#define I2C_ADDR 0x27 // Define I2C Address where the PCF8574A is#define BACKLIGHT_PIN 3#define En_pin 2#define Rw_pin 1#define Rs_pin 0#define D4_pin 4#define D5_pin 5#define D6_pin 6#define D7_pin 7//typedef struct { //unsigned int Start: 1; / / Using only one bit if possible //unsigned int Counter: / / and 'counter that is incremented with millis () //unsigned int Preset; / / Is set to choose the period of the timer //unsigned int Done: 1; / / Result when the timer counter and '> = preset //timer};//extern Timer timer [N_timers];int n = 1;LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); char incomingByte; //motor A connected between OUT1 and OUT2//motor B connected between OUT3 and OUT4//Motor Aint PWMA = 3; //Speed control int AIN1 = 9; //Directionint AIN2 = 8; //Direction//Motor Bint PWMB = 5; //Speed controlint BIN1 = 11; //Directionint BIN2 = 12; //Direction// Relaisint Rel1 = 6;int Rel2 = 7;// constants won't change. Used here to // set pin numbers:const int ledPin = 13; // the number of the LED pin// Variables will change:int ledState = LOW; // ledState used to set the LEDlong previousMillis = 0; // will store last time LED was updatedlong previousMillis1 = 0; long previousMillis2 = 0;// the follow variables is a long because the time, measured in miliseconds,// will quickly become a bigger number than can be stored in an int.long interval = 500; // interval at which to blink (milliseconds)long Blok = 10000; // interval at which to blink (milliseconds)long Wacht = 5000; // interval at which to blink (milliseconds)void setup(){ lcd.begin (16,2); // Switch on the backlight lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home // Print a message to the LCD. lcd.setCursor(2,0); //Start at character 2 on line 0 lcd.print("Arduino Uno"); lcd.setCursor(1,1); lcd.print("L298 M-Sturing"); Serial.begin(9600); Serial.println("Arduino test programma : Motorsturingen en blok meldingen"); Serial.println(); Serial.println("Stuur comando's"); Serial.println(); Serial.println("1 = Blok 1 vrijgeven 5 = Blok 2 vrijgeven"); Serial.println("2 = Blok 1 bezet melden 6 = Blok 2 bezet melden"); Serial.println("3 = Motor B starten 7 = Motor A starten"); Serial.println("4 = Motor B stoppen 8 = Motor A stoppen"); Serial.println(); Serial.println("9 = Motoren A en B stoppen en blok 1 en 2 bezet melden"); Serial.println(); Serial.print(">"); //Set all the pins we need to output pins // pinMode(STBY, OUTPUT); pinMode(PWMA, OUTPUT); pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(PWMB, OUTPUT); pinMode(BIN1, OUTPUT); pinMode(BIN2, OUTPUT); pinMode(2, OUTPUT); pinMode(4, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(10, OUTPUT); pinMode(ledPin, OUTPUT);}void loop (){ // Controlle led om te zien of het programma nog werkt. unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) ledState = HIGH; else ledState = LOW; // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); } if (Serial.available()) { //read serial as a character //char ser = Serial.read(); if (Serial.available() > 0) { // kijk of de seriele verbinding beschikbaar is. incomingByte = Serial.read(); // Lees een 'byte'. } // Begin Case 1: Blok1 vrij if(incomingByte == '1') { Serial.println("Case 1: Blok 1 : Vrij"); digitalWrite(Rel2, HIGH); tekst(); // Einde Case 1: Blok1 vrij } // Begin Case 2: Blok 1 bezet if(incomingByte == '2') { Serial.println("Case 2: Blok 1 : Bezet"); digitalWrite(Rel2, LOW); tekst(); // Einde Case 2: Blok 1 Bezet } // Begin Case 3: Motor B on if(incomingByte == '3') { Serial.println("motor B: Low speed"); move(0, 64, 1); //motor B, full speed, left low(); wacht(); Serial.println("motor B: half speed"); move(0, 128, 1); //motor B, half speed, left half(); wacht(); Serial.println("motor B: full speed"); move(0, 255, 1); //motor B, low speed, left full(); Serial.println("Case 3: Motor B draait op full speed totdat er een stop comando komt."); //stop(); tekst(); // Einde Case 3: Motor B on } // Begin Case 4: Motor B off if(incomingByte == '4') { Serial.println("motor B: Full speed"); move(0, 255, 1); //motor B, full speed full(); wacht(); Serial.println("motor B: Half speed"); move(0, 128, 1); //motor B, half speed half(); wacht(); Serial.println("motor B: Low speed"); move(0, 64, 1); //motor B, low speed low(); wacht(); Serial.println("motor B: Stop"); move(0, 0, 0); //motor B, stop Serial.println("Case 4: Motor B staat stil omdat er een stop comando gegeven is."); tekst(); // Einde Case 4: Motor B off } // Begin Case 5 : Blok 2 On if(incomingByte =='5'){ Serial.println("Case 5: Blok 2 : Vrij"); digitalWrite(Rel1, HIGH); tekst(); // Einde Case 5 : Blok On } // Begin Case 6: Blok 2 Off if(incomingByte == '6') { Serial.println("Case 6: Blok 2 : Bezet"); digitalWrite(Rel1, LOW); tekst(); } // Begin Case 7: Motor A On if(incomingByte == '7') { Serial.println("motor A: low speed"); move(1, 64, 1); //motor A, full speed, left low(); wacht(); Serial.println("motor A: half speed"); move(1, 128, 1); //motor A, half speed, left half(); wacht(); Serial.println("motor A: full speed"); move(1, 255, 1); //motor A, low speed, left full(); Serial.println("Case 7: Motor A draait op full speed totdat er een stop comando komt."); tekst(); // Einde Case 7: Motor A on } // Begin Case 8: Motor A Off if(incomingByte == '8') { Serial.println("motor A: Full speed"); move(1, 255, 1); //motor A, full speed full(); wacht(); Serial.println("motor A: Half speed"); move(1, 128, 1); //motor A, half speed half(); wacht(); Serial.println("motor A: Low speed"); move(1, 64, 1); //motor A, low speed low(); // sub-routine low wacht();// sub-routine wacht Serial.println("motor A: Stop"); move(1, 0, 0); //motor A, stop Serial.println("Case 8: Motor A staat stil omdat er een stop comando gegeven is."); tekst(); } // Einde Case 8: Motor B off // Begin Case 9 : Noodstop if(incomingByte == '9') { Serial.println("Case 9 Noodstop :Motoren A+B stop en blok 1+2 bezet"); stop(); digitalWrite(Rel1, LOW); Serial.println("Blok 1: Bezet"); digitalWrite(Rel2, LOW); Serial.println("Blok 2: Bezet"); lcd.home (); // go home lcd.setCursor(0,1); lcd.print("Noodstop gemaakt"); tekst(); } // Einde Case 9 : Noodstop }}void move(int motor, int speed, int direction){ //Move specific motor at speed and direction //motor: 0 for B 1 for A //speed: 0 is off, and 255 is full speed //direction: 0 clockwise, 1 counter-clockwise //digitalWrite(STBY, HIGH); //disable standby boolean inPin1 = LOW; boolean inPin2 = HIGH; if(direction == 1){ inPin1 = HIGH; inPin2 = LOW; } if(motor == 1){ digitalWrite(AIN1, inPin1); digitalWrite(AIN2, inPin2); analogWrite(PWMA, speed); } else{ digitalWrite(BIN1, inPin1); digitalWrite(BIN2, inPin2); analogWrite(PWMB, speed); }}void stop(){ //Motor A en B stoppen move(0, 0, 0);// motor A stop move(1, 0, 0);// motor B stop }void wacht(){ unsigned long currentMillis1 = millis(); long wacht = 7500; // Wacht 7.5 Seconden if(currentMillis1 - previousMillis1 > wacht) { previousMillis1 = currentMillis1; } lcd.home (); // go home lcd.setCursor(0,1); //lcd.print("Wacht 5 seconden"); Serial.println("Wacht 5 seconden"); delay(5000); }void blok(){ unsigned long currentMillis2 = millis(); long blok = 7500; // Wacht 10 Seconden if(currentMillis2 - previousMillis2 > blok) { previousMillis2 = currentMillis2; } lcd.home (); // go home lcd.setCursor(0,1); lcd.print("Wacht :Blok vrij"); Serial.println("Wacht tot blok vrij is."); delay(10000); }void tekst(){ lcd.home (); // go home lcd.setCursor(0,1); lcd.print(">"); Serial.print(">"); }void low(){ lcd.home (); // go home lcd.setCursor(0,1); lcd.print(" Speed low ");}void half(){ lcd.home (); // go home lcd.setCursor(0,1); lcd.print(" Speed half "); } void full(){ lcd.home (); // go home lcd.setCursor(0,1); lcd.print(" Speed full "); }
if (Serial.available()) { //read serial as a character //char ser = Serial.read(); if (Serial.available() > 0) { // kijk of de seriele verbinding beschikbaar is. incomingByte = Serial.read(); // Lees een 'byte'. }
/***** Global vars ***********************************************/
/****************************************************************************** * Definitions ******************************************************************************/
unsigned long currentMillis2 = millis(); long blok = 7500; // Wacht 10 Seconden if(currentMillis2 - previousMillis2 > blok) { previousMillis2 = currentMillis2; }
const char StringMotorB[] = "motor B: ";const char StringHalf[] = "half";const char StringLow[] = "low";const char StringSpeed[] = " speed";void printMotorLowSpeed(){ Serial.print(StringMotorB); Serial.print(StringLow); Serial.println(StringSpeed);}void printMotorHalfSpeed(){ Serial.print(StringMotorB); Serial.print(StringHalf); Serial.println(StringSpeed);}
#include <Wire.h>#include <LCD.h>#include <LiquidCrystal_I2C.h>/***** Global vars ***********************************************/#define BACKLIGHT_PIN 3LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); // adressering lcd displaychar incomingByte; /****************************************************************************** * Definitions ****************************************************************************** *motor A is aangesloten op OUT1 en OUT2 van de motorsturing *motor B is aangesloten op OUT3 en OUT4 van de motorsturing ******************************************************************************/const char StringMotorA[] = "motor A: "; const char StringMotorB[] = "motor B: ";const char StringFull[] = "full";const char StringHalf[] = "half";const char StringLow[] = "low";const char StringSpeed[] = " speed";// constants won't change. Used here to // set pin numbers:const int ledPin = 13; // Pin nummer LedPinconst int blok1Pin = 6; // Pin nummer Blok 1const int blok2Pin = 7; // Pin nummer Blok 2const unsigned int Interval = 500;const unsigned int WachtTrein = 7500;const unsigned int BlokVrij = 10000;// Variables will change: //Motor Aint PWMA = 3; //Speed control int AIN1 = 9; //Directionint AIN2 = 8; //Direction//Motor Bint PWMB = 5; //Speed controlint BIN1 = 11; //Directionint BIN2 = 12; //Directionint ledState = LOW; // ledState used to set the LEDint wachtState = LOW;int blokState = LOW;long previousMillis = 0; // will store last time LED was updatedlong previousMillisWacht = 0; long previousMillisBlok = 0;// the follow variables is a long because the time, measured in miliseconds,// will quickly become a bigger number than can be stored in an int.//long interval = 500; // interval at which to blink (milliseconds)void setup(){ lcd.begin (16,2); // Een 16 characters en twee regels display comando //lcd.begin (20,4); // Voor een 20 characters en vier regelelig display. // Switch on the backlight lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home // Print a message to the LCD. lcd.setCursor(2,0); //Start at character 2 on line 0 lcd.print("Arduino Uno"); lcd.setCursor(1,1); lcd.print("L298 M-Sturing"); Serial.begin(9600); // Deze tekst is alleen op een terminal programma te zien of met het serial monitor van het arduino programma. Serial.println("Arduino test programma : Motorsturingen en blok meldingen"); Serial.println(); Serial.println("Stuur comando's"); Serial.println(); Serial.println("1 = Blok 1 vrijgeven 5 = Blok 2 vrijgeven"); Serial.println("2 = Blok 1 bezet melden 6 = Blok 2 bezet melden"); Serial.println("3 = Motor B starten 7 = Motor A starten"); Serial.println("4 = Motor B stoppen 8 = Motor A stoppen"); Serial.println(); Serial.println("9 = Motoren A en B stoppen en blok 1 en 2 bezet melden"); Serial.println(); Serial.print(">"); //Set all the pins we need to output pins // pinMode(STBY, OUTPUT); pinMode(PWMA, OUTPUT); pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(PWMB, OUTPUT); pinMode(BIN1, OUTPUT); pinMode(BIN2, OUTPUT); pinMode(2, OUTPUT); pinMode(4, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(10, OUTPUT); pinMode(ledPin, OUTPUT);}void loop (){ // Controlle led om te zien of het programma nog werkt. unsigned long currentMillis = millis(); if(currentMillis - previousMillis > Interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (ledState == LOW) ledState = HIGH; else ledState = LOW; // set the LED with the ledState of the variable: digitalWrite(ledPin, ledState); } if (Serial.available()) { //read serial as a character //char ser = Serial.read(); if (Serial.available() > 0) { // kijk of de seriele verbinding beschikbaar is. incomingByte = Serial.read(); // Lees een 'byte'. } // Begin Taak 1: Blok1 vrij if(incomingByte == '1') { Serial.println("Taak 1: Blok 1 : Vrij"); digitalWrite(blok2Pin, HIGH); tekst(); // Einde Taak 1: Blok1 vrij } // Begin Taak 2: Blok 1 bezet if(incomingByte == '2') { Serial.println("Taak 2: Blok 1 : Bezet"); digitalWrite(blok2Pin, LOW); tekst(); // Einde Taak 2: Blok 1 Bezet } // Begin Taak 3: Motor B on if(incomingByte == '3') { Serial.println("motor B: Low speed"); move(0, 64, 1); //motor B, full speed, left low(); wacht(); Serial.println("motor B: half speed"); move(0, 128, 1); //motor B, half speed, left half(); wacht(); Serial.println("motor B: full speed"); move(0, 255, 1); //motor B, low speed, left full(); Serial.println("Taak 3: Motor B draait op full speed totdat er een stop comando komt."); //stop(); tekst(); // Einde Taak 3: Motor B on } // Begin Taak 4: Motor B off if(incomingByte == '4') { Serial.println("motor B: Full speed"); move(0, 255, 1); //motor B, full speed full(); wacht(); Serial.println("motor B: Half speed"); move(0, 128, 1); //motor B, half speed half(); wacht(); Serial.println("motor B: Low speed"); move(0, 64, 1); //motor B, low speed low(); wacht(); Serial.println("motor B: Stop"); move(0, 0, 0); //motor B, stop Serial.println("Taak 4: Motor B staat stil omdat er een stop comando gegeven is."); tekst(); // Einde Taak 4: Motor B off } // Begin Taak 5 : Blok 2 On if(incomingByte =='5'){ Serial.println("Taak 5: Blok 2 Vrij"); digitalWrite(blok1Pin, HIGH); tekst(); // Einde Taak 5 : Blok On } // Begin Taak 6: Blok 2 Off if(incomingByte == '6') { Serial.println("Taak 6: Blok 2 Bezet"); digitalWrite(blok1Pin, LOW); tekst(); // Einde Taak 6: Blok 2 bezet } // Begin Taak 7: Motor A On if(incomingByte == '7') { Serial.println("motor A: low speed"); move(1, 64, 1); //motor A, full speed, left low(); wacht(); Serial.println("motor A: half speed"); move(1, 128, 1); //motor A, half speed, left half(); wacht(); Serial.println("motor A: full speed"); move(1, 255, 1); //motor A, low speed, left full(); Serial.println("Taak 7: Motor A draait op full speed totdat er een stop comando komt."); tekst(); // Einde Taak 7: Motor A on } // Begin Taak 8: Motor A Off if(incomingByte == '8') { Serial.println("motor A: Full speed"); move(1, 255, 1); //motor A, full speed full(); wacht(); Serial.println("motor A: Half speed"); move(1, 128, 1); //motor A, half speed half(); wacht(); Serial.println("motor A: Low speed"); move(1, 64, 1); //motor A, low speed low(); // sub-routine low wacht();// sub-routine wacht Serial.println("motor A: Stop"); move(1, 0, 0); //motor A, stop Serial.println("Taak 8: Motor A staat stil omdat er een stop comando gegeven is."); tekst(); } // Einde Taak 8: Motor B off // Begin Taak 9 : Noodstop if(incomingByte == '9') { Serial.println("Taak 9 Noodstop :Motoren A+B stop en blok 1+2 bezet"); stop(); digitalWrite(blok1Pin, LOW); Serial.println("Blok 1: Bezet"); digitalWrite(blok2Pin, LOW); Serial.println("Blok 2: Bezet"); lcd.home (); // Home postitie cursor lcd.setCursor(0,1); lcd.print("Noodstop gemaakt"); tekst(); } // Einde Taak 9 : Noodstop }}void move(int motor, int speed, int direction){ //Move specific motor at speed and direction //motor: 0 for B 1 for A //speed: 0 is off, and 255 is full speed //direction: 0 clockwise, 1 counter-clockwise //digitalWrite(STBY, HIGH); //disable standby boolean inPin1 = LOW; boolean inPin2 = HIGH; if(direction == 1){ inPin1 = HIGH; inPin2 = LOW; } if(motor == 1){ digitalWrite(AIN1, inPin1); digitalWrite(AIN2, inPin2); analogWrite(PWMA, speed); } else{ digitalWrite(BIN1, inPin1); digitalWrite(BIN2, inPin2); analogWrite(PWMB, speed); }}void stop(){ //Motor A en B stoppen move(0, 0, 0);// motor A stop move(1, 0, 0);// motor B stop }void wacht(){ unsigned long currentMillis = millis(); // long wacht = 7500; // Wacht 7.5 Seconden if(currentMillis - previousMillisWacht > WachtTrein) { previousMillisWacht = currentMillis; } if (wachtState == LOW) wachtState = HIGH; else wachtState = LOW; lcd.home (); // go home lcd.setCursor(0,1); //lcd.print("Wacht 5 seconden"); Serial.println("Wacht 5 seconden"); }void blok(){ unsigned long currentMillis = millis(); if(currentMillis - previousMillisBlok > BlokVrij) { previousMillisBlok = currentMillis; } if (blokState == LOW) blokState = HIGH; else blokState = LOW; lcd.home (); // go home lcd.setCursor(0,1); lcd.print("Wacht :Blok vrij"); Serial.println("Wacht tot blok vrij is."); digitalWrite(blok1Pin, LOW); }void tekst(){ lcd.home (); // go home lcd.setCursor(0,1); lcd.print(">"); Serial.print(">"); }void low(){ lcd.home (); // go home lcd.setCursor(0,1); lcd.print(" Speed low ");}void half(){ lcd.home (); // go home lcd.setCursor(0,1); lcd.print(" Speed half "); } void full(){ lcd.home (); // go home lcd.setCursor(0,1); lcd.print(" Speed full "); }
void wacht(int time){ previousMillisWacht = millis(); //Wacht vanaf dit moment wachtState = HIGH; //Zet een flag dat we inderdaad aan het wachten zijn wachtTrein = time; //dit hoeft niet maar zo is het mogelijk variabele tijden te wachten, zo lang willen we wachten)
void wachtCheck(){\ //Alleen bekijken als we wachten, anders kunnen we gelijk door if(wachtState == HIGH){ //We wachten tot er echt wat gedaan moet worden if(millis() - previousMillisWacht > wachtTrein) { wachtState = LOW; //Laat zien dat we niet meer wachten /* Doe hier alles wat je wilt doen als je klaar bent met wachten Bla bla bla */ } }}
#DEFINE NRBLOKKEN 2 //Aantal blokken, nu dus maar tweepreviousMillisWacht[NRBLOKKEN];wachtState[NRBLOKKEN];wachtTrein[NRBLOKKEN];
void wacht(int blok, int time){ previousMillisWacht[blok] = millis(); //Wacht vanaf dit moment wachtState[blok] = HIGH; //Zet een flag dat we inderdaad aan het wachten zijn wachtTrein[blok] = time; //dit hoeft niet maar zo is het mogelijk variabele tijden te wachten)
void wachtCheck(){ //Nu moeten we dit gaan door voor alle blokken for(unsigned int i = 0; x < NRBLOKKEN; i++){ //Alleen bekijken als we wachten, anders kunnen we gelijk door if(wachtState[i] == HIGH){ //We wachten tot er echt wat gedaan moet worden if(millis() - previousMillisWacht[i] > wachtTrein[i]) { wachtState[i] = LOW; //Stop met wachten switch(i){ case(0): /* Doe hier alles wat je wilt doen als je klaar bent met wachten voor blok 0 (dat is dus het EERSTE blok, beginnen bij 0 Bla bla bla */ break; case(1): /* Doe hier alles wat je wilt doen als je klaar bent met wachten voor blok 1 Bla bla bla */ break; /* case(x) enz voor meer blokken */ } } } }}
//Maakt alle wachtState LOWvoid initWachtState(){ for(unsigned int i = 0; x < NRBLOKKEN; i++){ wachtState[i] = LOW; }}
wachtState = LOW;
initWachtState()
// test programma keuze hand autoint keuzePin = 2;int ledPin = 3;int led1Pin = 4;int keuze = 0;void setup(){ pinMode(2, INPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); Serial.begin(9600); Serial.print("Arduino uno test programma"); keuze = digitalRead(keuzePin); if (keuze == LOW){ //digitalWrite(ledPin,HIGH); automatisch();} else if (keuze == HIGH){ //digitalWrite(led1Pin,HIGH); } hand(); }void loop(){ }void automatisch(){ Serial.println("Automatische gekozen"); digitalWrite(led1Pin, LOW); digitalWrite(ledPin, HIGH); delay(2000);}void hand(){ Serial.println("Handbediening gekozen"); digitalWrite(led1Pin, HIGH); digitalWrite(ledPin, LOW);}
// test programma keuze hand auto met behulp van het : Switch(), case statementint keuzePin = 2;int ledPin = 3;int led1Pin = 4;int keuze = 0;void setup(){ pinMode(2, INPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); Serial.begin(9600); Serial.print("Arduino uno test programma"); } void loop(){ keuze = digitalRead(keuzePin); switch (keuze) { case 0: digitalWrite(led1Pin, HIGH); delay(2000); digitalWrite(led1Pin, LOW); Serial.println("Keuze staat op handbediening"); break; case 1: digitalWrite(ledPin, HIGH); delay(2000); digitalWrite(ledPin, LOW); Serial.println("Keuze staat op automatisch"); break; } }