Управление VCC Arduino Uno.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Доброго времени суток. Меня интересует такой вопрос: можно ли на ардуино отключить VCC (+5v), но при поступлении на один из пинов сигнала включить питание? Если да, то как?

 Заранне спасибо...

inspiritus
Offline
Зарегистрирован: 17.12.2012

Если интересует пониженное энергопотребление, то для этого существует специальный режим.

если это самоцель, то только средствами арды нет, нельзя, добавьте триггер, взводится Вашим сигналом, сбрасывается программно, управляет питанием.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Мне нужно это для питания симистора. Я хочу до определенного момента держать питание 5v выключеным.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Симистор управляет яркостью галогенки...

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Mestniy96 пишет:

Доброго времени суток. Меня интересует такой вопрос: можно ли на ардуино отключить VCC (+5v), но при поступлении на один из пинов сигнала включить питание? Если да, то как?

 Заранне спасибо...

Зачем вам пином включать?

При появлении сигнала подать его на :
1. Реле.
2. Транзистор.
3. Сииистор.

Включить питание с помощью:
1. Реле.
2. Транзистор.
3. Сииистор.

Пином  сделать подхват для :
1. Реле.
2. Транзистор.
3. Сииистор.

Если нужно- пином отключать:
1. Реле.
2. Транзистор.
3. Сииистор.

И гляньте как подают питание от "Кроны" на транзистортестер.....

https://www.google.ru/search?q=%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B8%D1%8...

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Просто я еще не знаю получиться ли моя схема. У меня есть галогенка и схема на симисторе, для управления этой лампой. Дело в том что Когда я включаю питание лампа загорается, я нажимаю клавишу и лампа начинает с минимума прибавлять указанное мной значение яркости. Все мои попытки изменить код, что-бы при подаче питания лампа не горела, кончались чередой неудачь. Может подскажите что мне делать. Вот скетч:

#include <avr/delay.h>   
int AC_pin = 10;  // выход для симистора     
volatile uint16_t dim;      
uint8_t dimmer=0;// уровень димирования (0-255)  0 = max, 255 = min 
int switchpin2 = 7;
int switchpin1 = 4;
int diagnostik=0;
int Times [] = {255, 200, 150, 100, 50, 0};
void setup()     
{      
  pinMode(AC_pin, OUTPUT);            
  attachInterrupt(0, FrontUp, RISING);  //прерывание по изменению уровня с низкого на высокий 
  pinMode(switchpin1, OUTPUT);
  pinMode(switchpin2, OUTPUT);
}     
// Функция обработки прерывания на подъем       
void FrontUp()       
{     
  detachInterrupt(0);     
  _delay_us(dim+1000);  // отсекаем лишнее  
  digitalWrite(AC_pin, HIGH);  // включить симистор     
  _delay_us(20);      // короткая пауза, чтобы обеспечить включение симистора     
  digitalWrite(AC_pin, LOW);   // выключение симистора(он выключится когда полупериод достигнет нуля)      
  attachInterrupt(0, FrontDown, FALLING);       
}       
// Функция обработки прерывания на спад      
void FrontDown()       
{      
  detachInterrupt(0);       
  _delay_us(dim);  // отсекаем лишнее     
  digitalWrite(AC_pin, HIGH);  // включить симистор     
  _delay_us(20);      // короткая пауза, чтобы обеспечить включение симистора     
  digitalWrite(AC_pin, LOW);   // выключение симистора(он выключится      
  attachInterrupt(0, FrontUp, RISING);       
}     
void loop()
{ 
 int diagnostik = digitalRead(switchpin1);
  if (diagnostik == HIGH && dimmer >=0) 
 {
  dimmer = dimmer - 10;   // Изменяем яркость лампы на 10 значений из 255     
  digitalWrite(AC_pin, dimmer);
  delay(40);
  dim=33*dimmer;
 }
}

 

Mestniy96
Offline
Зарегистрирован: 31.08.2015
//Это то что я пробовал сделать, что-бы стартовое значение лампы было 255

#include <avr/delay.h>   
int AC_pin = 10;  // выход для симистора     
volatile uint16_t dim;      
uint8_t dimmer=255;// уровень димирования (0-255)  0 = max, 255 = min 
int switchpin2 = 7;
int switchpin1 = 4;
int diagnostik=0;
void setup()     
{      
  pinMode(AC_pin, OUTPUT);            
  attachInterrupt(255, FrontUp, RISING);  //прерывание по изменению уровня с низкого на высокий 
  pinMode(switchpin1, OUTPUT);
  pinMode(switchpin2, OUTPUT);
}     
// Функция обработки прерывания на подъем       
void FrontUp()       
{     
  detachInterrupt(0);     
  _delay_us(dim+1000);  // отсекаем лишнее  
  digitalWrite(AC_pin, HIGH);  // включить симистор     
  _delay_us(20);      // короткая пауза, чтобы обеспечить включение симистора     
  digitalWrite(AC_pin, LOW);   // выключение симистора(он выключится когда полупериод достигнет нуля)      
  attachInterrupt(0, FrontDown, FALLING);       
}       
// Функция обработки прерывания на спад      
void FrontDown()       
{      
  detachInterrupt(0);       
  _delay_us(dim);  // отсекаем лишнее     
  digitalWrite(AC_pin, HIGH);  // включить симистор     
  _delay_us(20);      // короткая пауза, чтобы обеспечить включение симистора     
  digitalWrite(AC_pin, LOW);   // выключение симистора(он выключится      
  attachInterrupt(0, FrontUp, RISING);       
}     
void loop()
{ 
 int diagnostik = digitalRead(switchpin1);
 
 if (digitalRead(switchpin2) == HIGH)
 {
 
 if(diagnostik == HIGH && dimmer<=255) 
 {
  dimmer = dimmer - 51;   // пример уменьшения яркости лампы     
  digitalWrite(AC_pin, dimmer);
  delay(100);
  dim=33*dimmer;
 }
}

 

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Все разобрлся. Теперь, как сделать, что при достижении значения 255, при последующем нажатии кнопки лампа не переходила снова в 0...

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

Mestniy96 пишет:

Все разобрлся. Теперь, как сделать, что при достижении значения 255, при последующем нажатии кнопки лампа не переходила снова в 0...

if (x > 255) {x = 255;}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

А нахрена вот эта хрень с передергиванеим прерываний? o_0

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Что вы имеете ввиду Radjah?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Как просто. А я вот такую байду собирался лепить: 

Новичек, все таки. Спасибо огромное Клапауций 001!!!!

 if (diagnostik2 == HIGH && dimmer >=0) 
 {
  dimmer = dimmer + 23,1;
   if (dimmer != 255)
    {  
     digitalWrite(AC_pin, dimmer);
     delay(250);
     dim=33*dimmer;
    }
   else
    {
     dimmer = 255;
     digitalWrite(AC_pin, dimmer);
     delay(250);
     dim=33*dimmer; 
    } 

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Сначала на нарастание, потом на спад прерывание. Нахрена?

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Это же функция обработки прерывания! А что она не нужна повашему? 

Radjah
Offline
Зарегистрирован: 06.08.2014

https://www.arduino.cc/en/Reference/AttachInterrupt

Чем не угодил вариант CHANGE?

И зачем такие длинные функции в обработчике прерываниея?

Словил прерывание, выставил нужный флаг и пошел дальше гулять. А всю грязную работу сделает loop.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Radjah, я как понимаете новичек! Длинная, потомучто по другому не умею, мозги не дошли. А про CHANGE: Для меня есть разница, кога LOW, а когда HIGH. Да и вообще какая в этом разница. 

А вообще спасибо. Буду работать над лаконичностью!!!