Зберігати змінну?

I want to have a switch, that when on, will grab an analog number and essentially "freeze" it. Similarly to how STO> works on a TI83. What should I be using? Excuse my lack of technical terms, I'm not sure what to search and therefore do not know what to use. Thank you :)

0
Зберігайте/заморожуйте його постійно, щоб його можна було витягти після вимкнення живлення або просто утримувати його в пам'яті, поки живлення буде увімкнено?
додано Автор af., джерело
Тоді вам не потрібно робити нічого особливого - ось, які змінні роблять . Просто прочитайте його: int value = analogRead (...); . value тепер містить значення, яке ви прочитали.
додано Автор af., джерело
Тільки якщо ви це скажете. Чи можете ви придумати спосіб, щоб повідомити його тільки для читання, коли натиснута кнопка? (Чи можна подумати про те, як сказати, що робити, коли натискається кнопка?)
додано Автор af., джерело
@MarkSmith вибачте, мав роз'яснити. Просто, поки влада включена.
додано Автор Luis Rojas, джерело
@ MarkSmith але він буде постійно читати мій аналоговий вхід, який буде змінюватися. Я хочу, щоб це так, коли я натискаю кнопку вона буде захопити, що номер і не продовжувати читати з аналогового
додано Автор Luis Rojas, джерело
@ MarkSmith я планував використовувати перемикач, а не кнопку, тому я буду використовувати оператор if, але це буде цикл.
додано Автор Luis Rojas, джерело

6 Відповіді

Нижче наведено простий спосіб відстеження перемикання та керування станом, який потрібно керувати:

int analogPin = 0;
int switchPin = 3;
int switched = 0;//the last-known state of the switch
int lastRead = 0;//the last-desired analog sample

void setup() {
  pinMode(switchPin, INPUT_PULLUP);//connect switch to switchPin+GND w/o resistors
}

void loop() {

  if(digitalRead(switchPin)){//switch on:
    if(!switched){//switch on, but was unknown
      lastRead = analogRead(analogPin);//the wanted leading-edge value
      switched = 1;//seen it on
    }//end if switch changed?
  }else{//switch off:
    if(switched) switched = 0;     // remember that switch is off
    lastRead = analogRead(analogPin);//the latest value
  }


  Serial.println("Value is " + String(lastRead));
  delay(500);
}
1
додано

Ви можете скористатися EEPROM на Arduino. Наприклад:

#include 

int valAddr = 0;

#define analogPin 0
#define buttPin 3
void setup() {
  pinMode(buttPin,INPUT);
}

void loop() {
  /***
    Need to divide by 4 because analog inputs range from
    0 to 1023 and each byte of the EEPROM can only hold a
    value from 0 to 255.
  ***/
  if(digitalRead(buttPin)){
     int val = analogRead(analogPin)/4;
     EEPROM.write(valAddr, val);
     //access this value again by using int newvalue = EEPROM.read(valAddr)*4;

  }
}

By using EEPROM your value will be stored in non-volatile memory, meaning it will stay in memory even after a power cycle which is similar to how STO> works.

1
додано
Як зазначено на сторінці EEPROMWrite на сторінці arduino.cc, “Пам'ять EEPROM має вказане життя 100000 циклів запису/стирання, тому вам може бути потрібно бути обережним щодо того, як часто ви пишете на нього. На 3,3 мс на запис EEPROM, вище програма завершить 100000 пише valAddr протягом приблизно 6 хвилин, якщо контакт 3 високий.
додано Автор Martin C. Martin, джерело
Так, безумовно будьте обережні. Якщо у вашій програмі ваша кнопка утримується вниз, вам потрібно буде написати код, щоб переконатися, що він записує лише один раз і реєструє лише один раз клацання (debounce).
додано Автор Randolf Richardson, джерело

Прочитайте аналоговий вхід і зберігайте його безперервно. Якщо вимикач вимкнено, також запишіть значення у значення "заморозити":

void loop(){
   int value, freeze;

   value = analogRead(ANALOGPIN);
   if( !digitalRead(SWITCHPIN) ){
      freeze = value;  //sw is off, upd freeze value
   }
}

Це не враховує можливого підстрибування перемикача. Це може бути або не мати значення залежно від фактичної швидкості вибірки аналогового входу і того, що ви збираєтеся робити з замороженим виходом, оскільки відскакування перемикача буде коротшим, ніж людське сприйняття, але достатньо довго (можливо, 10 секунд) помічати і реагувати на зміни.

0
додано

Прочитайте лише аналоговий штифт, якщо натиснути кнопку.

#define analogPin 0
#define buttPin 3

int analogVal = 0;

void setup() {
  pinMode(buttPin,INPUT);
}

void loop() {
   //You can do stuff here

   //If the button is pressed...
    if (digitalRead(buttPin)
    {
       //..read the analogue pin
        analogVal = analogRead(analogPin)/4;
    }

   //You can do stuff here
}
0
додано
Що ви маєте на увазі "розморожувати"? Викинути число? Читати постійно?
додано Автор af., джерело
Я не використовую кнопку, я використовую перемикач. Я просто хочу, коли перемикач вперше увімкнуто, він застигне номер, а коли вимкнеться, він розморозиться.
додано Автор Luis Rojas, джерело

він буде постійно читати мій аналоговий вхід.

легко:

  1. матимуть adc у вільному режимі і в isr записує значення adc у буфер.

  2. спостерігати за станом кнопки в ISR. якщо він змінюється, збережіть значення буфера в інше.

є простіші способи зробити це, але менше реального часу. потрібно стежити за атомічністю, якщо задіяно багатобайтове значення.

0
додано

Моя рекомендація:

  1. Configure an external interrupt on the raising edges of the input where the button/switch is wired. Note that only pins 2 and 3 of Uno are capable of external interrupts.

  2. Write a very simple ISR that just sets to True a global volatile variable (a flag to signal that the button/switch has been actuated) and does nothing else.

  3. In the loop() check if the flag variable has been changed by the interrupt. If that's the case, then:

    • Debounce/deglitch the button/switch (optional, but highly recommended).
    • Read the analog input of your choice and store its value or do whatever you want to do with it.
    • Reset the flag variable to False so it can be changed the next time the interrupt is fired.
0
додано