Ви не увійшли.
запустите таймер например с интервалом в 10 мс
если кнопка нажата суммируйте время,отпустили - проверяйте время удержания
а дальше по времени удержания и текущему состоянию.
Неактивний
Всем привет. Вот такая проблема - не могу научить ардуино понимать числа с запятой. В общем. У меня есть кнопка. Она принимает два положения верхнее и нижнее. При опускании кнопки вниз мониторинг порта говорит что аналоговый пин №Х принимает 0.86 вольт, а в верхнем положении 1.72 . Нужно чтобы при этих вольтажа переключалось два реле. А именно 0.86 - горит только первое реле, 1.72 - горит только второе. Мне кажется что здесь нужен - map, но проблема в том что я не понимаю как это всё должно реализовываться. Помогите пожалуйста.
Неактивний
В общем я тут покумекал и пришёл к вот такому результату:
int analogInput = A0;
int regim=1;
int flag=0;
int value = 0;
float val = 0.0;
float voltage = 0.0;
float R1 = 20000.0;
float R2 = 470000.0;
void setup()
{
Serial.begin(115200);
pinMode(13,INPUT_PULLUP);
pinMode(10,OUTPUT);
pinMode(9,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(A0, INPUT);
}
void loop()
{
value = analogRead(A0);
val = (value * 5) / 1023.0;
voltage = val / (R2/(R1+R2));
Serial.println(voltage);
delay(1);
if (voltage>4)
{digitalWrite(7,HIGH);
digitalWrite(8,HIGH);}
if (voltage<0.5)
{digitalWrite(7,HIGH);
digitalWrite(8,LOW);}
if (voltage>=1.0&& voltage<=1.5 )
{digitalWrite(7,LOW);
digitalWrite(8,HIGH);}
if (voltage>=1.90 && voltage<=1.98)
{if(digitalRead(13)==HIGH&&flag==0)
{regim++;
flag=1;}
if(regim>4)
{regim=1;}
if(digitalRead(13)==LOW&&flag==1)
{flag=0;}
if(regim==2)
{digitalWrite(10,HIGH);
digitalWrite(9,LOW);}
if(regim==4)
{digitalWrite(9,HIGH);
digitalWrite(10,LOW);}
}
}
Неактивний
Mr.White цифру ловить используя ADC - это идиологически неправильно ( т.е. кнопки, импульс c коленвала и т.д. )
все входные сигналы по возможности завязывайте на прерывания, а в основном цикле (void loop() { __NOP(); } ) только отложенная обработка
я понимаю - работает не трогай ) но нужно набивать нужные навыки, после ардуино переход на RTOS будет вызывать трудности, привыкайте работать в несколько потоков
attachInterrupt(0, key_interrupt, RISING);
mode задает режим обработки прерывания. Допустимо использование следующих констанст:
LOW вызывает прерывание, когда на порту LOW
CHANGE прерывание вызывается при смене значения на порту, с LOW на HIGH и наоборот
RISING прерывание вызывается только при смене значения на порту с LOW на HIGH
FALLING прерывание вызывается только при смене значения на порту с HIGH на LOW
Неактивний
Ребят, подскажите пожалуйста какую функцию использовать в качестве таймера который работает сам по себе не задерживая цикл программы как delay. Цель, включать и отключать подсветку дисплея по событиям, не задерживая цикл программы. Заранее благодарен, не бейте ногами второй день с ардуино знакомлюсь..)))
Неактивний
Ребята помогите з кодом.
Нужно чтоб при нажатии кнопки реле замкнулось на 2 сек. И после отпускания кнопки снова замкнулось на 2 секунды.
Ребята помогите з кодом.
Нужно чтоб при нажатии кнопки реле замкнулось на 2 сек. И после отпускания кнопки снова замкнулось на 2 секунды.
немного не понятно, вы кнопку удерживать более 2ух сек будете? А если коротко нажать?
Остання редакція Selen (2019-01-04 07:31:27)
Неактивний
Vadim пише:Ребята помогите з кодом.
Нужно чтоб при нажатии кнопки реле замкнулось на 2 сек. И после отпускания кнопки снова замкнулось на 2 секунды.немного не понятно, вы кнопку удерживать более 2ух сек будете? А если коротко нажать?
Кнопка замкнута або розамкнута. Коротко не получица нажать.
/**/
//#1
const byte ledPin = 13;
enum state1_t {sLedOFF, sLedON} state1;
unsigned long past1;
unsigned long time2s = 2000;
void stand1(state1_t s) {
state1 = s;
past1 = millis();
switch (state1) {
case sLedOFF:
digitalWrite(ledPin, LOW);
break;
case sLedON:
digitalWrite(ledPin, HIGH);
break;
}
}
//#2
const byte btnPin = 2;
enum state2_t {sBtnOFF, sBtnON} state2;
//---------main()-------------------------
void setup() {
//#1
pinMode(ledPin, OUTPUT);
stand1(sLedOFF);
//#2
pinMode(btnPin, INPUT_PULLUP);
state2 = sBtnOFF;
}
void loop() {
//#1
switch (state1) {
case sLedOFF:
break;
case sLedON:
if (millis() - past1 >= time2s) stand1(sLedOFF);
break;
}
//#2
bool tmp = digitalRead(btnPin);
switch (state2) {
case sBtnOFF:
if (!tmp) {
state2 = sBtnON;
stand1(sLedON);
delay(50);
}
break;
case sBtnON:
if (tmp) {
state2 = sBtnOFF;
stand1(sLedON);
delay(50);
}
break;
}
}
Неактивний
/**/ //#1 const byte ledPin = 13; enum state1_t {sLedOFF, sLedON} state1; unsigned long past1; unsigned long time2s = 2000; void stand1(state1_t s) { state1 = s; past1 = millis(); switch (state1) { case sLedOFF: digitalWrite(ledPin, LOW); break; case sLedON: digitalWrite(ledPin, HIGH); break; } } //#2 const byte btnPin = 2; enum state2_t {sBtnOFF, sBtnON} state2; //---------main()------------------------- void setup() { //#1 pinMode(ledPin, OUTPUT); stand1(sLedOFF); //#2 pinMode(btnPin, INPUT_PULLUP); state2 = sBtnOFF; } void loop() { //#1 switch (state1) { case sLedOFF: break; case sLedON: if (millis() - past1 >= time2s) stand1(sLedOFF); break; } //#2 bool tmp = digitalRead(btnPin); switch (state2) { case sBtnOFF: if (!tmp) { state2 = sBtnON; stand1(sLedON); delay(50); } break; case sBtnON: if (tmp) { state2 = sBtnOFF; stand1(sLedON); delay(50); } break; } }
Дякою