Хранить переменную?
Я хочу иметь переключатель, который при включении будет захватывать аналоговый номер и, по сути, "замораживать" его. Аналогично тому, как STO> работает на TI83. Что я должен использовать? Извините за отсутствие технических терминов, я не уверен, что искать, и поэтому не знаю, что использовать. Спасибо вам :)
@mpgiii, 👍1
Обсуждение6 ответов
Вы можете использовать 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
Считывайте аналоговый вывод только в том случае, если кнопка нажата.
#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
Моя рекомендация:
Настройте внешнее прерывание на передних краях входа, где подключена кнопка/переключатель. Обратите внимание, что только контакты 2 и 3 Uno способны к внешним прерываниям.
Напишите очень простой ISR, который просто устанавливает значение
True
для глобальнойизменчивой
переменной (флаг, сигнализирующий о том, что кнопка/переключатель активирована) и больше ничего не делает.В
цикле()
проверьте, была ли переменная флага изменена прерыванием. Если это так, то:- Снимите/выключите кнопку/переключатель (необязательно, но настоятельно рекомендуется).
- Считайте аналоговый вход по вашему выбору и сохраните его значение или делайте с ним все, что хотите.
- Сбросьте переменную флага
в значение False
, чтобы ее можно было изменить при следующем запуске прерывания.
Вот простой способ отслеживания переключателя и управления состоянием, которым вам нужно управлять:
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);
}
Считывайте аналоговый вход и сохраняйте его непрерывно. Если переключатель выключен, также запишите значение в значение "заморозка":
void loop(){
int value, freeze;
value = analogRead(ANALOGPIN);
if( !digitalRead(SWITCHPIN) ){
freeze = value; // sw is off, upd freeze value
}
}
Это не учитывает возможное отскакивание переключателя. Это может иметь или не иметь значения в зависимости от фактической частоты дискретизации аналогового входа и того, что вы собираетесь делать с замороженным выходом, поскольку отскок переключателя будет короче, чем человеческое восприятие, но достаточно продолжительным (возможно, 10 секунд мс), чтобы микроконтроллер заметил изменения и отреагировал на них.
он будет непрерывно считывать мой аналоговый вход.
легко:
включите ацп в свободном режиме и в isr запишите значение ацп в буфер.
следите за состоянием кнопки в isr. если он изменится, сохраните значение буфера в другом месте.
есть более простые способы сделать это, но меньше реального времени, чем это. нужно следить за атомарностью, если используется многобайтовое значение.
- Сохранение файла .txt на SD-карту и чтение данных каждого содержимого в файл txt, а затем сохранение его в переменной
- Объявленная переменная внутри void setup не видится в void loop
- Сбросить переменную каждую 1 секунду на Arduino.
- Глобальный или локальный
- Использование переменной для индексации массива
- Использование одной и той же переменной между операторами if в loop()
- Функция управления сервоприводами
- Глобальная переменная меняет свое значение при повторном запуске цикла
Сохраните/заморозьте его навсегда, чтобы его можно было извлечь после выключения питания, или просто сохраните его в памяти, пока питание включено?, @Mark Smith
@MarkSmith извините, я должен был уточнить. Просто пока включено питание., @mpgiii
Тогда вам не нужно делать ничего особенного - это то, что делают переменные*. Просто прочитайте его: "значение int = analogRead (...);". "значение" теперь содержит значение, которое вы прочитали., @Mark Smith
@MarkSmith, но он будет непрерывно считывать мой аналоговый вход, который будет меняться. Я хочу, чтобы, когда я нажму кнопку, она захватила этот номер и не продолжала считывать с аналогового, @mpgiii
Только если ты прикажешь. Можете ли вы придумать способ сказать, чтобы он читался только при нажатии кнопки? (Можете ли вы придумать способ сказать ему, чтобы он что-то делал, когда нажата кнопка?), @Mark Smith
@MarkSmith Я планировал использовать переключатель, а не кнопку, поэтому я буду использовать оператор if, но это будет циклически., @mpgiii