Shutter automatisation, better code possible?

Hello,

i am new to arduino programming so i just use my basic skills and known logic. SO i know sometimes there are better and efficient ways to code the task, so i hope someone can give me an advice.

The Project is automatisation of my manual shutter. So far i managed to print a self designed transmission and use an low voltage DC motor to have enough force to pull the shutter up. I use arduino nano pro and l293d motor driver for changing the directions. For Power i use 18650 battery with step up converter to 5 Volt for l293d needed. I also use one endswitch at the top of the shutter to have a reference. The movement and end at the bottom is due time delay.

I think the delay solution like stay at bottom (closed shutter) 7 hours and stay at the top (shutter open) 17 hours is not the best way and also maybe uses a lot of energy. MAybe there is a better solution with kind of calender module or better coding possible?

my code so far working like this.

int motorpin1 = 5;   // Der Konstante motorpin1 wird der Arduino Pin nr 5 zugewiesen
int motorpin2 = 6;   // Der Konstante motorpin1 wird der Arduino Pin nr 6 zugewiesen
int switchPin = 7;   //Der Konstante switchPin wird der Arduino Pin nr 7 zugewiesen
int x;               //Variable ist ein INteger wert also ganze Zahlen

void setup()        //definieren der KOnstanten als Eingang oder Ausgang
{  
pinMode(motorpin1, OUTPUT);  //Die KOnstante motorpin1 ist ein Ausgang
pinMode(motorpin2, OUTPUT);  //Die KOnstante motorpin2 ist ein Ausgang
pinMode(switchPin, INPUT_PULLUP); //Die KOnstante switchPin ist ein ein Eingang
}

void loop()  //Anfang der Hauptschleife
{ 
  if (digitalRead(switchPin)==LOW)  // Wenn der Endschalter betätigt ist, dann fahre das Rollo runter für delay Zeit
  { // Anweisungsblock für wahr 
  //Motor Stop für X stunden ms
  digitalWrite(motorpin1,HIGH); //motor rechts Stop
  digitalWrite(motorpin2,HIGH); //motor rechts Stop 
  //delay(60840000); //  Pause für 17 Stunden abzüglic der Zeit was das Rollo nach oben benötigt ca. das 3x fache von runter und durch 2 geteilt da die zeit nicht stimmt
delay (43200000);
 // Fahre Rollo für delay ms runter
  digitalWrite(motorpin1,HIGH);
  digitalWrite(motorpin2,LOW);
  delay(93000); // Zeit die das Rollo braucht um unten anzukommen. 60 Sec entsprechen 120 Sec = 2 Min wahrscheinlich von dem Nano Pro abhängig
  //Motor Stop für 7 stunden 25200000 ms
  digitalWrite(motorpin1,HIGH); //motor rechts Stop
  digitalWrite(motorpin2,HIGH); //motor rechts Stop 
 // delay(25080000); //  Pause für 7Stunden delay(25200000)  abzüglich die Zeit  was DAs Rollo runter benötigt
delay(2000); 
} 
  else  // Wenn der Schalter nicht belegt ist dann fahre solange hoch bis er gedrückt wird
  {
  // Anweisungsblock für falsch
  do 
  {
  x = switchPin; // prüft ob der Switch gedrückt ist
  } 
  while (x <= 1);    //solange nicht gedrückt also HIGH flanke  entspricht dem Wert 1 fahre das ROllo hoch
  digitalWrite(motorpin1,LOW);    
  digitalWrite(motorpin2,HIGH);
  delay(10); // Prüft alle ms, ob der SChalter gedrückt ist
  }//ende IFschleife
}//Ende der Hauptschleife

void setMotor(int speed, boolean reverse)  //MOtor Konfiguration
{
digitalWrite(motorpin1, ! reverse);
digitalWrite(motorpin2, reverse);
}

What is the problem with the way you are doing the program? Is there something the Arduino should be doing while it's waiting? Power usage is the same either way.

Learn if the program is working properly, don't try to repair it!

Paul

And by all means get your formatting fixed. The ctrl-T key combination in the IDE is magical.

Also powering a shutter motor on a single LiPo battery doesn't sound like it's going to work for long.

  do
  {
  x = switchPin; // prüft ob der Switch gedrückt ist
  }
  while (x <= 1);    //solange nicht gedrückt also HIGH flanke  entspricht dem Wert 1 fahre das ROllo hoch

If you think this reads the pin inside the loop, that is wrong.

The while condition will not exit if x was the product of a digital read but it does exit since switchPin is 7.

Hello,

thank you all for your hints and advice.

i have a new issue. I have now two dc motors and two switches. For one motor and one switch the code was warking finde, but now to get it for two motors and switches seems to be a real issue for me to get it working.

how do i have to change the code to get two motors and switches work?

the most issue is to let one dc motor drive as long it hits the stopswitch and then the second motor the second stopswitch.

please help :confused:

Thank you in Advance for your support.

int motorpin3 = 3;   // Der Konstante motorpin1 wird der Arduino Pin nr 5 zugewiesen
int motorpin4 = 4;   // Der Konstante motorpin1 wird der Arduino Pin nr 6 zugewiesen
int motorpin1 = 5;   // Der Konstante motorpin1 wird der Arduino Pin nr 5 zugewiesen
int motorpin2 = 6;   // Der Konstante motorpin1 wird der Arduino Pin nr 6 zugewiesen
int switchPin = 7;   //Der Konstante switchPin wird der Arduino Pin nr 7 zugewiesen REchtes ROllo
int switchPinL = 8;   //Der Konstante switchPin wird der Arduino Pin nr 8 zugewiesen Linkes ROllo

void setup()        //definieren der KOnstanten als Eingang oder Ausgang
{  
  pinMode(motorpin1, OUTPUT);  //Die KOnstante motorpin1 ist ein Ausgang
  pinMode(motorpin2, OUTPUT);  //Die KOnstante motorpin2 ist ein Ausgang
  pinMode(motorpin3, OUTPUT);  //Die KOnstante motorpin1 ist ein Ausgang
  pinMode(motorpin4, OUTPUT);  //Die KOnstante motorpin2 ist ein Ausgang
  pinMode(switchPin, INPUT_PULLUP); //Die KOnstante switchPin ist ein ein Eingang
  pinMode(switchPinL, INPUT_PULLUP); //Die KOnstante switchPin ist ein ein Eingang
}

void loop()  //Anfang der Hauptschleife
{ 
  if ((digitalRead(switchPin)==LOW) && (digitalRead(switchPinL)==LOW))  
  { 
 
    digitalWrite(motorpin1,HIGH); //motor rechts Stop
    digitalWrite(motorpin2,HIGH); //motor rechts Stop 
    digitalWrite(motorpin3,HIGH); //motor rechts Stop
    digitalWrite(motorpin4,HIGH); //motor rechts Stop 

    delay(57480000); 
  
    digitalWrite(motorpin1,HIGH);
    digitalWrite(motorpin2,LOW);
    digitalWrite(motorpin3,HIGH);
    digitalWrite(motorpin4,LOW);
    delay(90000); 

    digitalWrite(motorpin1,HIGH); //motor rechts Stop
    digitalWrite(motorpin2,HIGH); //motor rechts Stop 
    digitalWrite(motorpin3,HIGH); //motor rechts Stop
    digitalWrite(motorpin4,HIGH); //motor rechts Stop 
    delay(28718000); 

  } 
  else 
    do{
    digitalWrite(motorpin3,LOW);    
    digitalWrite(motorpin4,HIGH);
    digitalWrite(motorpin1,LOW);    
    digitalWrite(motorpin2,HIGH);
    delay(10);  
  }    
  while ((switchPinL <= 1 ) && (switchPinL <= 1));   



}      

void setMotor(int speed, boolean reverse)  
{
  digitalWrite(motorpin1, ! reverse);
  digitalWrite(motorpin2, reverse);
  digitalWrite(motorpin3, ! reverse);
  digitalWrite(motorpin4, reverse);
}

Definitely get rid of all the delays. Then see the first posting on this forum:
Demonstration code for several things at the same time.

That method will allow your program to do more than one thing at a time, like run two motors.

Paul

delay(57480000) makes your Arduino sit there doing nothing for almost 16 hours.

Brokoli, if this makes sense to you then the full lesson is at Gammon Forum : Electronics : Microprocessors : How to do multiple things at once ... like cook bacon and eggs

Say you want to cook breakfast. You need to cook:

Coffee - takes 1 minute
Bacon - takes 2 minutes
Eggs - takes 3 minutes

Now a seasoned cook would NOT do this:

Put coffee on. Stare at watch until 1 minute has elapsed. Pour coffee.
Cook bacon. Stare at watch until 2 minutes have elapsed. Serve bacon.
Fry eggs. Stare at watch until 3 minutes have elapsed. Serve eggs.

The flaw in this is that whichever way you do it, something is going to be cooked too early (and get cold).

In computer terminology this is blocking. That is, you don't do anything else until the one task at hand is over.

What you are likely to do is this:

Start frying eggs. Look at watch and note the time.
Glance at watch from time to time. When one minute is up then ...
Start cooking bacon. Look at watch and note the time.
Glance at watch from time to time. When another minute is up then ...
Put coffee on. Look at watch and note the time.
When 3 minutes are up, everything is cooked. Serve it all up.

In computer terminology this is non-blocking. That is, keep doing other things while you wait for time to be up.

The lesson teaches how to use time in Arduino code but it is about keeping everything going on time.

The techniques are the trees, what they do is the woods. Learn the trees well and you can shape your own woods.

Thank you all for you hints and help.

I did a solution on my own and it works exactly like i wanted to. And it is quiet simple :D.

 */
int motorpin3 = 3;   // Der Konstante motorpin1 wird der Arduino Pin nr 5 zugewiesen Linker MOtor
int motorpin4 = 4;   // Der Konstante motorpin1 wird der Arduino Pin nr 6 zugewiesen
int motorpin1 = 5;   // Der Konstante motorpin1 wird der Arduino Pin nr 5 zugewiesen Rechter Motor
int motorpin2 = 6;   // Der Konstante motorpin1 wird der Arduino Pin nr 6 zugewiesen
int switchPin = 7;   //Der Konstante switchPin wird der Arduino Pin nr 7 zugewiesen REchtes ROllo
int switchPinL = 8;   //Der Konstante switchPin wird der Arduino Pin nr 8 zugewiesen Linkes ROllo

void setup()        //definieren der KOnstanten als Eingang oder Ausgang
{  
  pinMode(motorpin1, OUTPUT);  //Die KOnstante motorpin1 ist ein Ausgang
  pinMode(motorpin2, OUTPUT);  //Die KOnstante motorpin2 ist ein Ausgang
  pinMode(motorpin3, OUTPUT);  //Die KOnstante motorpin1 ist ein Ausgang
  pinMode(motorpin4, OUTPUT);  //Die KOnstante motorpin2 ist ein Ausgang
  pinMode(switchPin, INPUT_PULLUP); //Die KOnstante switchPin ist ein ein Eingang
  pinMode(switchPinL, INPUT_PULLUP); //Die KOnstante switchPin ist ein ein Eingang
}

void loop()  //Anfang der Hauptschleife
{ 
  if ((digitalRead(switchPin)==LOW) && (digitalRead(switchPinL)==LOW))  // Wenn der Endschalter betätigt ist, dann fahre das Rollo runter für delay Zeit
  { // Anweisungsblock für wahr 
    //Motor Stop für X stunden ms
    digitalWrite(motorpin1,HIGH); //motor rechts Stop
    digitalWrite(motorpin2,HIGH); //motor rechts Stop 
    digitalWrite(motorpin3,HIGH); //motor rechts Stop
    digitalWrite(motorpin4,HIGH); //motor rechts Stop 
    delay(50169000); // 14h

    // Fahre Rollo für delay ms runter
    digitalWrite(motorpin1,LOW);
    digitalWrite(motorpin2,HIGH);
    delay(92000);
    digitalWrite(motorpin3,LOW);
    digitalWrite(motorpin4,HIGH);
    digitalWrite(motorpin1,HIGH);
    digitalWrite(motorpin2,HIGH);    
    delay(77500); 
    //Motor Stop für 8 stunden 
    digitalWrite(motorpin1,HIGH); //motor rechts Stop
    digitalWrite(motorpin2,HIGH); //motor rechts Stop 
    digitalWrite(motorpin3,HIGH); //motor rechts Stop
    digitalWrite(motorpin4,HIGH); //motor rechts Stop 
    delay(35830500); //   10h

  }
  if ((digitalRead(switchPin)==LOW) && (digitalRead(switchPinL)==HIGH)) 
  {
    digitalWrite(motorpin3,HIGH);
    digitalWrite(motorpin4,LOW);
    digitalWrite(motorpin1,HIGH); 
    digitalWrite(motorpin2,HIGH);  
    delay(10);  
    while (switchPinL <= 1);
  }
  else 
  {  //solange nicht gedrückt also HIGH flanke  entspricht dem Wert 1 fahre das ROllo hoch 
    digitalWrite(motorpin1,HIGH);    
    digitalWrite(motorpin2,LOW);
    digitalWrite(motorpin3,HIGH);    
    digitalWrite(motorpin4,HIGH);
    delay(10);  
    while (switchPin <= 1);
  }

}      //Ende der Hauptschleife

void setMotor(int speed, boolean reverse)  //MOtor Konfiguration
{
  digitalWrite(motorpin1, ! reverse);
  digitalWrite(motorpin2, reverse);
  digitalWrite(motorpin3, ! reverse);
  digitalWrite(motorpin4, reverse);
}

You really like to lock up your device in delay() calls, don’t you? Nothing else it can do. It won’t react to button presses. It’ll just be sitting there being a brick and nothing you can do about it except power cycling to get it to react to any new inputs.

Hey now, some people like a little bowl of spaghetti now and then, it’s the first recipe taught in programming school.