Автор Тема: Въпрос за програма - Искам да броя време  (Прочетена 9105 пъти)

krasimir

  • Робо-Новак
  • *****
  • Публикации: 34
    • Профил
Здравейте,

от няколко дена имам ардуино и се опитвам да правя разни неща. Част от това, което искам да направя е когато на един от пиновете имам HIGH да завъртя една сервомашинка за няколко секунди и после да се върне обратно.
Това, което направих е следното: Когато подам "1" за кратко време на пина сервото се завърта, стои там определеното време и се връща обратно. НО, но.. аз искам сервото да се върне и когато на пина непрекъснато има единица. Тоест когато подам единица - дели ще е за една секунда или за един час, сервото да се завърти и после да се върне.

#include <Servo.h>

Servo servo;
int promenliva=0;
int sensor=8;  //na pin 8 postavqam butona
 

void setup()
{
  servo.attach(9);      // na pin 9 postavqm servoto
  pinMode(sensor, INPUT);  //definiram pin 8 kato input
}

void loop()
{
 promenliva=digitalRead(sensor); //na promenliva prisvoqvam stoinostta prochetena ot pin 8
 
if(promenliva==HIGH)  //ako butona se natisne (na pin 8 ima HIGH)
{
servo.write(130); //servoto e zavartqno na "130"
delay(2000);
}

  else
{
 
servo.write(100); //servo se zawyrta "100"

}


}




Мисля си че ако по някакъв начин преброя времето в което на пина има HIGH и после това време го задам като изчакване, нещата ще са ОК.

Но не знам как мога да пусна някакъв брояч.






#include <Servo.h>

Servo servo;
int promenliva=0;
int sensor=8;  //na pin 8 postavqam butona
 

void setup()
{
  servo.attach(9);      // na pin 9 postavqm servoto
  pinMode(sensor, INPUT);  //definiram pin 8 kato input
}

void loop()
{
 promenliva=digitalRead(sensor); //na promenliva prisvoqvam stoinostta prochetena ot pin 8
 
servo.write(100); //servoto e zavartqno na "100"
  if(promenliva==HIGH)  //ako butona se natisne (na pin 8 ima HIGH)
  ПУСКАМ БРОЯЧ
  {
 
   
servo.write(130); //servo se zawyrta "130"
delay(2000);  // v prodylvenie na 2 sek


servo.write(100); //sled tova se vryshta otnovo na "100"
delay(ПОСТАВЯМ ВРЕМЕТО ОТ БРОЯЧА)                    //tolkova vreme kolkoto e natisnat butona. Sled tova kogato se pusne servoto shte ostane pak v syshtoto polojenie zashtoto if funkciqta nqma da e izpylnena
 
   
  }

}


Излишно е да казвам, че съм начинаещ. Ако някой може да помогне ще съм му благодарен.
В областта на Ардуино и програмирането абсолютно начинаещ.

bateAz

  • Зомбиран Роботостроител
  • *****
  • Публикации: 187
    • Профил
Въпрос за програма - Искам да броя време
« Отговор #1 -: Август 06, 2011, 01:08:30 pm »
Въх, трудна работа!  :D
Аз не съм работил с Ардуино, но мога да кажа няколко неща 'от обща култура". Мисля, че ще са приложими и за твоя случай.
Първо: ти трябва да реагираш на вдигането на пина, а не на високото му ниво. Нали правим разлика между "вдигане" и "стоене високо"  :? Това може да се направи по много начини, най-лесният е с 2 цикъла, единият от които чака пинът да стане "ниско", а вторият: да стане "високо" Нещо такова:
while ( digitalRead(sensor) == HIGH ) {;}
while ( digitalRead(sensor) == LOW ) {;}
Смисълът е следният: доката пинът не премине И през двете състояния, програмата няма да продължи. Оттук нататък вече си прави каквото ти душа иска.
После може така:
servo.write(130); //servoto e zavartqno na "130"
delay(2000);
servo.write(100); //servo se zawyrta "100"
Накрая това всичкото трябва да се направи да се изпълнява периодично ( ако това е логиката на програмата ). Я се пробвай!
Не може да не може

Венцислав Караджов, 61 год.

krasimir

  • Робо-Новак
  • *****
  • Публикации: 34
    • Профил
Въпрос за програма - Искам да броя време
« Отговор #2 -: Август 06, 2011, 03:53:30 pm »
Оф на теория звучи много лесно ама като почнеш да го правиш виждаш, че не е точно така.
Това което написа си има логика ама нещо на практика не мога да го напиша точно така както ти каза.

Направих нещо друго, което бях сигурен, че ще работи... да ама не...

#include <Servo.h>

Servo servo;
int promenliva=0;
int sensor=8;  //na pin 8 postavqam butona


void setup()
{
  servo.attach(9);      // na pin 9 postavqm servoto
  pinMode(sensor, INPUT);  //definiram pin 8 kato input
}

void loop()
{
 promenliva=digitalRead(sensor); //na promenliva prisvoqvam stoinostta prochetena ot pin 8
 
servo.write(100); //servoto e zavartqno na "100"
  if(promenliva==HIGH)  //ako butona se natisne (na pin 8 ima HIGH)
 
  {
 
   
servo.write(130); //servo se zawyrta "130"
delay(2000);  // v prodylvenie na 2 sek

do  
  {
  servo.write(100); //sled tova se vryshta otnovo na "100"
  }
while(promenliva==HIGH); //Do kato na vhoda ima "1"

  }
}


Сега вече работи по-добре от преди. Сервото се връща след 2 сек. независимо от това бутона колко време е натиснат. Но след това програмата спира.

П.П. Абе аз една време на C++ учих малко и там си спомням че ако използваме while накрая се поставяше едно "return 0;" което връщаше нещо..

П.П.2
Уш е ясна работата

do
{
//izpylni komanda
}
while(uslovie);


Командата се изпълнява до като условието е вярно.

Играх си с While... винаги когато стигне до него и програмата спира. Има нещо, което не правя както трябва и не мога да разбера какво е.  :(  :(  :(  :?  :?  :?  :evil:
В областта на Ардуино и програмирането абсолютно начинаещ.

bateAz

  • Зомбиран Роботостроител
  • *****
  • Публикации: 187
    • Профил
Въпрос за програма - Искам да броя време
« Отговор #3 -: Август 06, 2011, 04:00:45 pm »
// тук се засилва за въртене ...
while(1)
{
    // тук се върти до умопобъркване, след това започва да се върти тук
}
// е те тука нема да стигне
Не може да не може

Венцислав Караджов, 61 год.

krasimir

  • Робо-Новак
  • *****
  • Публикации: 34
    • Профил
Въпрос за програма - Искам да броя време
« Отговор #4 -: Август 06, 2011, 04:28:01 pm »
Радвам се че си ме разбрал, ама аз не мога да те разбера  :lol:
В областта на Ардуино и програмирането абсолютно начинаещ.

bateAz

  • Зомбиран Роботостроител
  • *****
  • Публикации: 187
    • Профил
Въпрос за програма - Искам да броя време
« Отговор #5 -: Август 06, 2011, 04:41:18 pm »
Цитат на: "krasimir"
Радвам се че си ме разбрал, ама аз не мога да те разбера  :lol:


Обикновено програмите за Embedded ( т.е. за микроконтролери ) се състоят от 2 основни части:
1. инициализация на регистрите на процесора, на платката, някакви начални сметки ( които се изпълняват еднократно ) и т.н. В примера, който дадох това ще се намира в редовете над "while(1)"
2. "основен цикъл", който микропроцесорът непрекъснато изпълнява, т.е. изпълнението на програмата се върти само там. Това е частта между скобите. От него излизане НЯМА ! Обикновено там е реализирана логиката на поведението на контролера.
А примерът ти го дадох, за да видиш как се прави безкраен цикъл.
Ако пак не си ме разбрал, дай да се "чуем" по чата, да не занимаваме форума
Не може да не може

Венцислав Караджов, 61 год.

AA

  • Робо-Новак
  • *****
  • Публикации: 28
    • Профил
Въпрос за програма - Искам да броя време
« Отговор #6 -: Август 10, 2011, 08:30:01 am »
Кода по-долу работи по логиката,която се търси. pin7 е изход и към него има включен светодиод. pin4 е вход - повдигнат е към + а към маса е включено ключето.

 int METKA;                         // индикатор за преминал процес
 int SENSOR;
 void setup()
 {
  pinMode(7,OUTPUT);               // тук е включен светодиод
  pinMode(4,INPUT);                // тук е включено ключето
 }
 void loop()
 {
  digitalWrite(7,HIGH);            //
  METKA=0;                         // начално установяване
LBL:
  SENSOR=digitalRead(4);           // отчитане на състоянието на ключето
  if ((SENSOR==LOW)&&(METKA==0))
  {
    digitalWrite(7,LOW);
    delay(1000);
    digitalWrite(7,HIGH);
    METKA=1;
  }
  SENSOR=digitalRead(4);          // отчитане на състоянието на ключето
  if (SENSOR==HIGH)
  {
    METKA=0;
  }
  goto LBL;
}

Simeon

  • Вече знае какво е робот!
  • *****
  • Публикации: 73
    • Профил
    • http://www.robotev.com
Въпрос за програма - Искам да броя време
« Отговор #7 -: Август 13, 2011, 04:24:40 pm »
krasimir, при while цикъла командите между къдравите скоби се изпълняват ДОКАТО условието е вярно. За да можеш да излезеш от while цикъл трябва микроконтролера да разбере, че условието е престанало да бъде вярно.

Ако сложиш digitalRead(pinaKoitoPolzvash); в къдравите скоби след do, програмата ще продължи СЛЕД като бутонът престане да бъде натиснат.

Не съм сигурен дали начинът, който ползваш е най-удачен. Вместо do..while, aз бих ползвал още една променлива за последния статус на бутона, която при състояние HIGH да става "0", а при състояние LOW - "1" . И след това условието е ако бутонът е натиснат и променливата за последния статус на бутона е "1" да се завърта сервото, да изчаква, и да се връща обратно.
Симеон Янчев, София
www.robotev.com

adrian

  • Новодошъл
  • *****
  • Публикации: 2
    • Профил
Въпрос отностно моят първи опит за програмиране
« Отговор #8 -: Септември 09, 2012, 09:11:41 pm »
http://www.facebook.com/photo.php?fbid=3845653099635&set=a.3409190628346.2136621.1227375738&type=1&theater

Надявам се всички да могат да видят снимката.Накратко програмта която искам да напиша е проста но мисля че нищо неможах да напиша като хората..

Искам след проверка на първите три входа (темп.датчик ,темп.датчик , датчик налягане)микроконтролера да ги вижда като високо ниво, да активира още изхода  "вентилатор" и "ел.клапан" третия изход да го активира за 4 сек. а след получаване на високо ниво от вход "йонизатор" да остави работещи "вентилатор и ел.клапан" ако  не получи високо ниво от  "йонизатор" да повтори операцията 2 или 3 пъти и ако не се получи високо ниво да спре и активира изход сигализиращ авария

надявам се да не съм ви обаркал с обяснението
ето го и моя код до тук

const int buttonPin = 2;
const int buttonPin = 3;
const int buttonPin = 4;
const int buttonPin = 5;
const int ledPin =  13;
const int ledPin =  12;
const int ledPin =  11;
const int ledPin =  10;
const int ledPin =  9;

int buttonState = 0;

void setup() {
   pinMode(ledPin, OUTPUT);
   pinMode(buttonPin, INPUT)
   
void loop(){
   buttonState2 = digitalRead(buttonPin = 2);
   buttonState3 = digitalRead(buttonPin = 3);
   buttonState4 = digitalRead(buttonPin = 4);
   if (buttonState2 == HIGH) {
      (buttonState3 == HIGH) {
      (buttonState4 == HIGH) {  
   then  
      digitalWrite(ledPin = 13, HIGH);
      digitalWrite(ledPin = 12, HIGH);
      digitalWrite(ledPin = 11, HIGH);
      delay(4000);    
   buttonState5 = digitalRead(buttonPin = 5);
   if (buttonState5 == HIGH) {
   then
      digitalWrite(ledPin = 10, HIGH);
   else
      digitalWrite(ledPin = 9, HIGH);


или поне да ми обясните грешките в кода или начина за писане на операция :  ако прави това, тогава да прави другото ,или  ако не го направи, да направи еди какво си

AA

  • Робо-Новак
  • *****
  • Публикации: 28
    • Профил
Въпрос за програма - Искам да броя време
« Отговор #9 -: Септември 10, 2012, 11:41:06 am »
Кода в интерес на истината не съм го поглеждал но алгоритъма е малко мъгляво обяснен - поне според мене. Значи имаш четири входа и четири изхода. Проверяваш трите входа. ( Казваш че искаш микроконтролера да ги вижда като високо ниво - той вижда това което е на входа а не каквото искаме ние). Да кажем че искаш да се продължи нататък по алгоритма ако нивото е високо. А какво се прави ако на някой от входовете нивото е ниско? Предполагам нова проверка на датчиците - така ли е? Нека нивата на трете входа са високи - продължаваме нататък. Пускаме високо ниво на изходите вентилатор, клапан  и запалителна свещ за 4 секунди. След това проверяваме входа йонизатор - ако нивото е ниско спираме изходите, пак проверяваме датчиците и ако всичко там е наред пак активираме изходите за 4 секунди и пак проверяваме входа йонизатор. Ако след три повторения на този цикъл на входа йонизатор не се появи високо ниво, активираме алармата. Какво правим след като сме я активираме - държим я активна докато се намеси оператор ли? Ако пък на входа йонизатор се появи високо ниво примерно при втория опит, казваш че оставяме включени вентилатора и клапана - докога системата трябва да стои в това състояние? Предполагам, че при това положение трябва постоянно да се следят четирите входа и в зависимост от това какво има на тях да се взема решение какво да се прави нататък - така ли е?
    Мисля че трябва да си опишеш много подробно алгоритъма със всичките му възможни разклонения за да ти се получи работеща програма, или пък ако нещо не ти се получава и тогава да може да ти се помогне адекватно.