Guest ренат

Программа управления светодиодами

10 posts in this topic

Guest ренат   
Guest ренат

Всем здрасти))))

прошу помощи в написании программы

мои знания программирования на ардуино основаны на примерах и школьного курса )))

так вот есть программы 

int LedPin = 8;             // Подключаем светодиод к порту 13
int ButPin = 2;             // Подключаем кнопку к выходу 10
int flag = 0;                // флаг состояния

int LedPinTime = 100;

void setup()
{
  pinMode(LedPin, OUTPUT);   // Инициализируем порт "ledPin" как выходной
}  

void loop()
{
  if(digitalRead(ButPin) == HIGH && flag == 0)      
    {                                              
      digitalWrite(LedPin, !digitalRead(LedPin));
      flag = 1;
    }
  
  if(digitalRead(ButPin) == LOW && flag == 1)
    {
      flag = 0;
    }  
}

собрал из кусков, работает )))))

но не то что мне нужно 

Мне нужно чтобы при нажатие одной кнопки(без фиксации) светодиод загорался на три секунды ( и не важно держишь ты кнопку или кратковременно нажал, он через три секунды потухнет) 

помогите кто может))) я в благодарность могу и на телефон денег кинуть )))) спасибо

Share this post


Link to post
Share on other sites
IMXO    1474
42 минуты назад, Гость ренат сказал:

digitalWrite(LedPin, !digitalRead(LedPin));

заменить на

  digitalWrite(ledPin, HIGH);   // включаем светодиод
  delay(3000);                  // ждем секунду
  digitalWrite(ledPin, LOW);    // выключаем светодиод

 

 

Share this post


Link to post
Share on other sites

ВСЕМ ПРИВЕТ!!! 

нужнана небольшая помощь в доработке )))

каждый светодиод включается своей кнопкой и зажигается только тогда когда другой не горит 

вопрос: как сделать чтобы при включении одного  светодиода, второй гас. т е горит один, не дожидаясь пока он потухнет включаем второй, а тот тухнет. 

очень надо)) помогите пожалуйста

зарание спасибо

const int
button1Pin = 2;
const int button2Pin = 3;
const int led1Pin = 8;
const int led2Pin = 7;
void setup() 
{
 pinMode(led1Pin, OUTPUT);
 pinMode(led2Pin, OUTPUT);
 pinMode(button1Pin,INPUT);
 pinMode(button2Pin,INPUT);
}                 
void loop()
{
 if
 (digitalRead(button1Pin) == HIGH) 
 {
  digitalWrite(led1Pin,HIGH);
  delay(3000);
  digitalWrite(led1Pin,LOW);
 } 
 if(digitalRead(button2Pin) == HIGH) 
 {
  digitalWrite(led2Pin,HIGH);
  delay(3000);
  digitalWrite(led2Pin,LOW);
 }
}

 

Share this post


Link to post
Share on other sites

DC/DC-преобразователи MORNSUN R3. Повышенная надёжность - сниженная стоимость!

Особенностью преобразователей R3 являются улучшенные технические характеристики, повышенная надёжность и сниженная стоимость. Электрическая прочность изоляции представленных преобразователей не менее 1500 В, а температурный диапазон применения -40…105ºС.

Подробнее...

Posted (edited)
1 час назад, IMXO сказал:

шара два раза подряд не катит :rake:

почему два раза подряд )))) я пока ждал вечера сам немного разобрался )))) 

вам спасибо за помощь  первом варианте )))) там я сам справился )))

 а вот как сделать чтобы при включении одного  светодиода, второй гас. т е горит один, не дожидаясь пока он потухнет включаем второй, а тот тухнет.

я не могу обмозговать ))) не укладывается)

т.е. ума не хватает )

может поможете ) 

я в долгу не останусь ))) 

к стати ! знаю я как !!! заменой delay на millis  но как написать не пойму 

наведите на мыслю хотя бы )

спасибо

Edited by ренат07

Share this post


Link to post
Share on other sites

Новые методы уменьшения дрейфа нуля в малошумящих АЦП Texas Instruments

Стабилизация с помощью двойного прерывания с двойным контролем в новых АЦП ADS1235 производства Texas Instruments позволяет снизить до минимума напряжение смещения и достичь высокой точности в измерительных цепях современных прецизионных цифровых приборов.

Подробнее...

IMXO    1474
1 час назад, ренат07 сказал:

к стати ! знаю я как !!! заменой delay на millis  но как написать не пойму 

забавно, даю подсказку он здесь на не нать, твое "ума не хватает" называется "конечный автомат" гугл о нем знает.

твоя задача имеет четыре состояния

состояние_0: диоды выключены
состояние_1: лед1=1, лед2=0 , сброс счетчика милисекунд, переход на состояние_3
состояние_2: лед1=0, лед2=1, сброс счетчика милисекунд, переход на состояние_3
состояние_3: отсчет милисекунд , если отсчитали нужную задержку  переход на состояние_0

все это решается обычными командами перехода switch/case

переход на состояние 1 или 2 устанавливается по нажатию кнопок.

Скрытый текст

void loop()
{
  delay(1); 
  if(digitalRead(ButPin1) == HIGH && flag_1 == 0)      
    {                                              
      task_state=1;
      flag_1 = 1;
    }
  if(digitalRead(ButPin1) == LOW && flag_1 == 1)
    {
      flag_1 = 0;
    } 

   if(digitalRead(ButPin2) == HIGH && flag_2 == 0)      
    {                                              
      task_state=2;
      flag_2 = 1;
    }
   if(digitalRead(ButPin2) == LOW && flag_2 == 1)
    {
      flag_2 = 0;
    } 
  
  switch(task_state)
    {
      case 0:
           digitalWrite(ledPin1, LOW);  
           digitalWrite(ledPin2, LOW); 
       break;
      case 1:
           digitalWrite(ledPin1, HIGH);  
           digitalWrite(ledPin2, LOW); 
           count_delay=0;
           task_state=3;
       break; 
      case 2:
           digitalWrite(ledPin1, LOW);  
           digitalWrite(ledPin2, HIGH);
           count_delay=0;
           task_state=3;
       break; 
      case 3:
           if(count_delay<3000)
              {count_delay++;}
            else
              {task_state=0;}   
       break; 
      default:
           task_state=0;
    }
}

 

 

Share this post


Link to post
Share on other sites
Posted (edited)
 

забавно, даю подсказку он здесь на не нать, твое "ума не хватает" называется "конечный автомат" гугл о нем знает.

хм ))) прикольно )) я даже загуглил 

твой совет изумителен ) честно ))) но узнал я это поздно (((

вот мой текст с millis

тут все работает как мне надо за одним исключением 

Вот смотри: я нажал тактовую кнопку и загорелся светодиод на 3 сек. и погас, если держу три сек. и отпускаю то он горит три сек., а мне для идеальности надо реализовать так: не важно, нажал я кнопку один раз или держу её минуту, светодиод должен гореть три секунды и потухнуть даже если кнопку я не отпустил

я изучил команды ардуино и не нашел ни чего подходящего 

Такое вообще вариант реализовать?

const int
button1Pin = 2;
const int
button2Pin = 3;
const int
led1Pin = 7;
const int
led2Pin = 8;
unsigned long
led1OnTime;
unsigned long led2OnTime;
bool led1On;
bool led2On;
void setup() 
{
 pinMode(led1Pin,OUTPUT);
 pinMode(led2Pin,OUTPUT);
 pinMode(button1Pin,INPUT);
 pinMode(button2Pin,INPUT);
 led1On = false;
 led2On = false;
}
void loop()
{
 if (digitalRead(button1Pin)== HIGH) 
 {
  digitalWrite(led1Pin,HIGH);
  digitalWrite(led2Pin,LOW);
  led1On = true;
  led1OnTime = millis();
 }
 if(digitalRead(button2Pin) == HIGH) 
 {
  digitalWrite(led2Pin,HIGH);
  digitalWrite(led1Pin,LOW);
  led2On = true;
  led2OnTime = millis();
 }
 if(led1On)
 if(millis() -led1OnTime > 3000) 
 {
  digitalWrite(led1Pin,LOW); 
  led1On = false;
 }
 if(led2On)
 if(millis() -led2OnTime > 3000)
 {
  digitalWrite(led2Pin,LOW);
  led2On = false;
 }
}

 

 


void loop()
{
  delay(1); 
  if(digitalRead(ButPin1) == HIGH && flag_1 == 0)      
    {                                              
      task_state=1;
      flag_1 = 1;
    }
  if(digitalRead(ButPin1) == LOW && flag_1 == 1)
    {
      flag_1 = 0;
    } 

   if(digitalRead(ButPin2) == HIGH && flag_2 == 0)      
    {                                              
      task_state=2;
      flag_2 = 1;
    }
   if(digitalRead(ButPin2) == LOW && flag_2 == 1)
    {
      flag_2 = 0;
    } 
  
  switch(task_state)
    {
      case 0:
           digitalWrite(ledPin1, LOW);  
           digitalWrite(ledPin2, LOW); 
       break;
      case 1:
           digitalWrite(ledPin1, HIGH);  
           digitalWrite(ledPin2, LOW); 
           count_delay=0;
           task_state=3;
       break; 
      case 2:
           digitalWrite(ledPin1, LOW);  
           digitalWrite(ledPin2, HIGH);
           count_delay=0;
           task_state=3;
       break; 
      case 3:
           if(count_delay<3000)
              {count_delay++;}
            else
              {task_state=0;}   
       break; 
      default:
           task_state=0;
    }
}

 

 

 

Edited by ренат07

Share this post


Link to post
Share on other sites
IMXO    1474

не надо тупых цитат, это запрещено правилами форума П2.9, придет модер раздела выпишет бан.

52 минуты назад, ренат07 сказал:

тут все работает как мне надо за одним исключением 

если есть исключения значит не работает или нет?

 

54 минуты назад, ренат07 сказал:

Такое вообще вариант реализовать?

ты под спойлером смотрел?

Share this post


Link to post
Share on other sites
3 минуты назад, IMXO сказал:

если есть исключения значит не работает или нет?

работает !))) просто этот момент с потухание светодиода 

да , смотрел конечно )))  но чет не заработала,  const  под свои переписал, может библиотеку какую нибудь не добавил, просто switch case  я так не углублялся)

простите...

я думал вы модератор ;)

Share this post


Link to post
Share on other sites
IMXO    1474
6 минут назад, ренат07 сказал:

но чет не заработала

код рабочий , максимум возможны ложные срабатывания, если функция опроса пинов не давит дребезг контактов, лечится увиличением задержки до 10мс и уменьшением счетчика с 3000 до 300

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By pingyini
      Всем доброго времени суток. Решил я сделать "умную" электронную сигарету на arduino. Концепция заключается в кнопочном управлении мощностью посредством ШИМ, наличии экрана, и некоторыми защитами в виде ограничения максимального времени нажатия и уход камня в сон (режим пониженного энергопотребления) после N секунд простоя.
      Вводные: по нажатию кнопки запускается ШИМ и управляет полевиком, но в целях защиты я хочу ограничить время выполнения кода до 7 секунд(что бы при случайном зажатии кнопки в кармане не получить травматическую ампутацию конечностей)

      Проблема пришла откуда не ждали - обработка нажатой основной кнопки срабатывает как попало. Нажимая кнопку обработчик может сработать сразу и отработает как по маслу, а может и через 5 нажатий не сработать вовсе.  Проверял в живую на Arduino UNO, Pro Mini (328е Меги) и в Proteus'е. Симптомы одни и те же.  Проблема очевидно в коде но я в упор не вижу в чем может быть загвоздка. Уровень у меня "штота умею" поэтому не судите строго. 
       
      #define pwmPin 5 #define buttonStart 3 #define maxOnTime 7000 //максимальное время выполнения условия нажатой кнопки #define RED_LED 7 #define GREEN_LED 8 int power = 150; //boolean StartState; boolean StartStateFlag; //Флаг кнопки Старт unsigned long pressTime; void setup() { pinMode(pwmPin, OUTPUT); pinMode(buttonStart, INPUT); pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); Serial.begin(9600); //чисто для отладки } void loop() { if (digitalRead(buttonStart) && StartStateFlag && ((millis() - pressTime) <= maxOnTime)) { // (1) если кнопка старт нажата И была отпущена И нажата менее 7 секунд выполняем: analogWrite(pwmPin, power); //запуск ШИМ Serial.println("PWM_ON"); digitalWrite(GREEN_LED, HIGH); digitalWrite(RED_LED, LOW); } else { // (2) иначе StartStateFlag = false; // кнопка небыла отпущена analogWrite(pwmPin, 0); digitalWrite(GREEN_LED, LOW); Serial.println("PWM_OFF"); pressTime = millis(); } if (!digitalRead(buttonStart)) { //(3) если кнопка не нажата analogWrite(pwmPin, 0); //остановка ШИМ Serial.println("PWM_OFF"); digitalWrite(RED_LED, HIGH); StartStateFlag = true; //была отпущена и можно входить в условие с нажатой кнопкой (1) } } И файлы: сам скетч, .elf и .hex для шПротеуса и проект Протеус.
      P. S. ШИМ в Протеусе не работает в принципе, в железе все ОК 
      BUTTON_TEST.ino
      BUTTON_TEST.ino.eightanaloginputs.hex
      BUTTON_TEST.ino.elf
      BUTTON_TEST.ino.with_bootloader.eightanaloginputs.hex
      ButtonTest.pdsprj
    • By dimmer
      Необходимо собрать устройство на ардуино: 
      Управление одним сервоприводом (плавная регулировка 180 градусов) по блютуз с телефона.
      Задача
      Питание для привода-аккумулятор (пока не знаю какой именно, нужно подсказать)
      Минимизировать электропотребление, сделать так что б в спящем режиме не было расхода энергии, или почти не было.  Может убрать светодиоды из платы, или ещё каким то образом.
      Устройством буду пользоваться время от времени и не хотелось бы аккумулятор часто заряжать.
      Основные комплектующие в наличии, думал сам разберусь но нет ни времени, не особого желания это изучать. 
      Территориально Москва. Привезу комплектующие куда скажете, но желательно ЗАО

    • By utf16
      Всем доброго времени суток!
      Никак не могу найти простое решение своей проблемы. Подскажите пожалуйста!
      Думаю над сборкой многоканального аудио ресивера с управлением от ардуино. Есть идея собрать усилитель(ресивер) 5.1
      Не хочется травить платы, поэтому задействую 2 двухканальных усилителя на готовых платах на ТДАшках, и 2 одноканальных для центрального канала и сабвуфера, тоже на ТДАшках.
      Ресивер дожен иметь 5.1 канальные входы для подключения к компьютеру (фронт, тыл, центр и сабвуфер), стереовход(AUX), и блютуз(допустим тоже простой стереовход).
      Коммутировать все это дело должна ардуинка с релейными модулями(это все понятно).
      Суть проблемы вот в чем: как коммутировать сигнал с разных источников звука, чтобы не было проникновения каналов в друг друга? Допустим, включаю обьемный звук с компьютера, нажимаю кнопку, арудуина подключает через реле питание усей, сигнал от входов идет каждый на свои усилитель. А потом переключаю допустим на обычный стерео вход, и нужно его как то коммутировать снова на усилитель фронтальной акустики и, например, на усилитель сабвуфера, и при этом чтобы полностью исключить сигнал от входов с компьютера (от входов многоканального звука). 
      Проще говоря, нужно как то иметь около 5-6 входов аудио сигнала и иметь возможность с ардуино перенаправить эти сигналы на 5-6 выходов на усилители.
      Можно ли все это проделать с мультипликаторами, или, допустим, с матрицей вроде MT8816??? Буду благодарен за любые подсказки)
    • By Leonids Dislovojs
      Здравствуйте уважаемые техники, мой вопрос может показаться многим глупым, но я учусь в Латвии на мехатроника, знаю необходимые формулы и умею проводить расчеты, но я не понимаю, по моему, самого важного, при построении печатных плат с микроконтроллерами (в основном atmega328) я не знаю по какому принципу, где, когда и почему нужно добавлять конденсаторы, зачеты сдавал только благодаря копированию конденсаторов с платы Ардуино на свою, все работает но долго схемы копировать я не смогу.
      Можете, пожалуйста, посоветовать какую нибудь литературу или хотя бы простой принцип что бы понять принцип добавления конденсаторов (да и резисторов) в схему при том, что в схеме есть микроконтроллеры, например: сейчас я проектирую схему с участием atmega328 и sx1278, программу написать могу, плату развести могу, но куда и какие элементы ставить, мне не понятно. 
      Спасибо.