Софтуерно Инженерство
Loading...
Drago88 avatar Drago88 0 Точки

Arduino Uno

Здравейте. Много ще се радвам, ако успеете да ми помогнете с този вярвам елементарен за вас учещите програмиране въпрос, а той е следния? Как трябва да променя кода за да може релето да се включва при натискане на бутона и изключва при повторно натискане?

Благодаря!

 

int buttonPin1 = 3 ; //бутон 1
int relayPin1 = 13 ;  //реле 1
int buttonState = 0;   
void setup() {
  pinMode(buttonPin1, INPUT);
  pinMode(relayPin1, OUTPUT);

}

void loop() {
  buttonState = digitalRead(buttonPin1);
  if (buttonState == HIGH)
 
  { 
    digitalWrite(relayPin1 , HIGH);
    }
   else
   digitalWrite(relayPin1, LOW);
  }

Тагове:
0
Arduino
Borislav_Vulkov avatar Borislav_Vulkov 54 Точки
Best Answer

Здравей колега,
както знаеш съществува съществена разлика м/у кода използвам за управление на микроконтролери и кода писан на езици от високо ниво като C#, Java и т.н. Тази разлика се състой най-вече в това че, за целесъобразната работа на микроконтролера ти е необходим вечен цикъл. В този случай този цикъл е всичко написано м/у "{" и "}" на void loop() цикъла. Скороста с която се четат и изпълняват командите в този цикъл е огромна и е необходимо да се съобразим това.
Това което мога да предложа на пръв поглед е следното:

======================

int buttonPin1 = 3 ; //бутон 1
int relayPin1 = 13 ;  //реле 1
int State = 0;  // Ще отчита последното състояние на релето.
void setup()
{
pinMode(buttonPin1, INPUT);
pinMode(relayPin1, OUTPUT);
}

void loop() {
//Използвам го за състоянието на бутона (когато бутона е натиснат е HIGH, а когато не е LOW).
buttonState = digitalRead(buttonPin1);
While (buttonState == HIGH && State == 0)
   {
   While (buttonState == HIGH)
         {
         digitalWrite(relayPin1 , HIGH);
         }
   State = 1;
   }

While (buttonState == HIGH && State == 1)
   {
   While (buttonState == HIGH)
         {
         digitalWrite(relayPin1 , LOW);
         }
   State = 0;
   }

Предварително се извинявам ако има грешки в синтаксиса. Нямам софтуера и не съм го пробвал.
Нека да разкажа каква е заложената идея. Когато програмата започне да се изпълнява микроконтролера ще изпилни само веднъж кода написан преди void loop() цикъла. След това многократно ще изплнява само него. Нека да приемем, че в самото начало бутона не е натиснат => buttonState = LOW. Въжда се че нищо няма да се случи, защото едно от условията на цилите е този бутон да е натиснат. В следващия момент натискама бутона, когато изпълнението на void loop() цикъла започне от начало. ще се прочете buttonState = digitalRead(buttonPin1); следователно в този момент buttonState = HIGH. Проверяваме условията на първия While цикъл. вижда се че, те са изпълнение. Влизаме в неговото тяло. Проверяват се условията на вложения в него While (buttonState == HIGH) цикъл. В тази ситуация и това е вярно. тялото на този цикъл съдържа само една команда и тя е за активира изхода (да запали релето). До момента на деактивиране на бутона, изпълнението на програмата остава заключено между този вложен цикъл, т.е. тя многократно ще изпълява активиране на вече активирания изход (това не е никакъв проблем). При деактивиране на бутна, условието на вътрешния цикъл вече няма да е изпълнено и програмата продължава от следващия ред след този цикъл. Това е: State = 1. След това се проверяват условията на външния цикъл While (buttonState == HIGH && State == 0), те не са изпълнени и програмата излиза от него. продължава с проверка на втория цикъл While (buttonState == HIGH && State == 1), вижда се че само вторто условие е изпълнено т.е. програмата няма да го изпълни. в тази ситуация релето ще остане в заработило положение. При повторно натискане на бутона ситуацията е аблосютно същата но вече са изпълнение усовията на втория цикъл за деактивиране на изхода т.е. релет ще отпадне. 

Поздрави,
Боби 

0
Drago88 avatar Drago88 0 Точки

Благодаря ти за програмата ще я пробвам! Примера ,които дадох тук го има заложен в софтуера към контролера,а аз леко го коригирах. Нов съм в тази облст(програмирането) и много от нещата не са ми ясни. Аз исках да уптравлявам 4 релета с 4 бутони за сега,а в по-далечно време бих желал да си напиша програма за управлението чрез WIFI modul ,но виждам ,че ще мине време

 :) :) ) . Исках и сам да си доразработя програмата ,като тук питам за програма с едно реле и съответно да си я доразработа до това ,което ми е необходимо.Но явно това ,което съм дал като пример е неефективно от там се променят нещата и съответно, както казах познанията ми в програмирането ми са примитивни и с примера , който си дал няма да успея да се справя! :)

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

0
Borislav_Vulkov avatar Borislav_Vulkov 54 Точки

Здравей отново, 
първо малко да упрена :D. Няма как да се научиш да пишеш код ако не се опитваш да пиишеш код. Това изисква да пробваш, да тестваш и да чупиш кода. Не знам по какъв друг начин чове може да се научи. Това, че уважавш труда на другия е страхотно но няма нищо общо с това промениш нещо в този код.
Ако найстина не се чувстваш подготвен за тавива алгоритми по-добре се върни една стъпка назад и разгледай малко по-елементарни пимерчета. Примерно за управление на един светодиод. Накарай го първо само да мига (пойграй си с честотата на мига), после вкарай повече светодиоди, направи така, че да мигат асинхронно, после вкарай управление с бутони и така нататък. 
http://enkov.com/arduino/arduino.pdf От тук може да намериш интересни решения и примерчета. 

Нещо важно за което не се съобразих вчера!
Освен кода има значение и схемите койт използваш. Управляването на релета не е толкова лесна задача. Правилния начин би бил с използването на транзистори свързани по схема "електронен ключ". За малки релета с напрежение 5 или 12 V аз използвам BD 139 и диоди 1N4007 (не за друго просто са евтини). За съжаление не успях да намеря начин да ти кача схемите тук. Ако имаш интерес, остави ми имейл и ще ти ги изпратя. 

0
Drago88 avatar Drago88 0 Точки

Да не е просто управлението.Имам модул,който само трябва да се свърже. Всичко работи както аз искам, но не ми стига искам да усвоя кода и смятам ,че това което си ми дал ще ми е от ГОЛЯМА ПОЛЗА! А... и да прав си, трябва много писане за да вникнеш в нещата! И не се тревожи за схемите .. намерил съм ги! Знам какво искам,знам и как да го свържа, но малко ми куца писането. Ако искаш да бутваш по едно рамо ще съм ти много благодарен. 

0
Borislav_Vulkov avatar Borislav_Vulkov 54 Точки

Да разбира се!
Не само аз ами и всички останали, нали все пак за това са тези форуми. 

0
Drago88 avatar Drago88 0 Точки

Успях да я направя!

0