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
Ingenera avatar Ingenera 22 Точки

Бих посъветвал още ако бутона е механичен, след изчитане на логическа 1ца да се сложи едно изчакване от порядъка на половин секунда за да се избегне механичното трептене на контактите(релно се получават серия от импулси) или да се използва milis  за определяне на дължината на постъпилия от бутона импулс(т.е. да е нужно леко задържане на бутона).Ако не четеш директно от регистъра състоянирто на изхода , то използването на State е добро решение за да се знае дали релето е включено или не - според това се предприема и действието по нататък.Но е добре да се декларира като boolean за да се пести от паметта - в ATmega 328 nqma mnogo :)

0
Drago88 avatar Drago88 0 Точки

Благодаря ти за допълнението, ще го имам в предвид. :) 

0
11/04/2019 15:14:23
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.