Хранить переменную?

Я хочу иметь переключатель, который при включении будет захватывать аналоговый номер и, по сути, "замораживать" его. Аналогично тому, как STO> работает на TI83. Что я должен использовать? Извините за отсутствие технических терминов, я не уверен, что искать, и поэтому не знаю, что использовать. Спасибо вам :)

, 👍1

Обсуждение

Сохраните/заморозьте его навсегда, чтобы его можно было извлечь после выключения питания, или просто сохраните его в памяти, пока питание включено?, @Mark Smith

@MarkSmith извините, я должен был уточнить. Просто пока включено питание., @mpgiii

Тогда вам не нужно делать ничего особенного - это то, что делают переменные*. Просто прочитайте его: "значение int = analogRead (...);". "значение" теперь содержит значение, которое вы прочитали., @Mark Smith

@MarkSmith, но он будет непрерывно считывать мой аналоговый вход, который будет меняться. Я хочу, чтобы, когда я нажму кнопку, она захватила этот номер и не продолжала считывать с аналогового, @mpgiii

Только если ты прикажешь. Можете ли вы придумать способ сказать, чтобы он читался только при нажатии кнопки? (Можете ли вы придумать способ сказать ему, чтобы он что-то делал, когда нажата кнопка?), @Mark Smith

@MarkSmith Я планировал использовать переключатель, а не кнопку, поэтому я буду использовать оператор if, но это будет циклически., @mpgiii


6 ответов


0

Вы можете использовать EEPROM на Arduino. Например:

#include <EEPROM.h>

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;

  }
}

При использовании EEPROM ваше значение будет сохранено в энергонезависимой памяти, то есть оно останется в памяти даже после цикла питания, аналогичного тому, как работает STO>>.

,

Как отмечено в [EEPROMWrite](https://www.arduino.cc/en/Reference/EEPROMWrite) страница на arduino.cc, “Срок службы памяти EEPROM составляет 100 000 циклов записи/стирания, поэтому вам, возможно, потребуется соблюдать осторожность в отношении того, как часто вы записываете в нее”. Вышеприведенная программа не соблюдает осторожность. При 3,3 мс на запись EEPROM вышеуказанная программа завершит 100000 записей в "valAddr" примерно за 6 минут, если вывод 3 высокий., @James Waldby - jwpat7

Да, определенно будьте осторожны с этим. Если ваша кнопка удерживается в приложении, вам придется написать код, чтобы убедиться, что он записывает только один раз и регистрирует нажатие кнопки только один раз (отмена)., @Airfield20


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
}
,

Я не использую кнопку, я использую переключатель. Я просто хочу, чтобы при первом включении переключателя он замораживал номер, а при выключении он размораживался., @mpgiii

Что значит "разморозить"? Выбросить номер? Читать постоянно?, @Mark Smith


1

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

  1. Настройте внешнее прерывание на передних краях входа, где подключена кнопка/переключатель. Обратите внимание, что только контакты 2 и 3 Uno способны к внешним прерываниям.

  2. Напишите очень простой ISR, который просто устанавливает значение True для глобальной изменчивой переменной (флаг, сигнализирующий о том, что кнопка/переключатель активирована) и больше ничего не делает.

  3. В цикле() проверьте, была ли переменная флага изменена прерыванием. Если это так, то:

    • Снимите/выключите кнопку/переключатель (необязательно, но настоятельно рекомендуется).
    • Считайте аналоговый вход по вашему выбору и сохраните его значение или делайте с ним все, что хотите.
    • Сбросьте переменную флага в значение False, чтобы ее можно было изменить при следующем запуске прерывания.
,

0

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

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);
}
,

0

Считывайте аналоговый вход и сохраняйте его непрерывно. Если переключатель выключен, также запишите значение в значение "заморозка":

void loop(){
   int value, freeze;

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

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

,

0

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

легко:

  1. включите ацп в свободном режиме и в isr запишите значение ацп в буфер.

  2. следите за состоянием кнопки в isr. если он изменится, сохраните значение буфера в другом месте.

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

,