К аналоговому входу Analog In 0 микроконтроллера Arduino подключен потенциометр (см. Как подключить к Arduino...). Вращением потенциометра изменяется время задержки мигания светодиода на выводе Digital 13. Через терминал Serial Monitor Arduino IDE можно подавать команды:
R -- считать значение задержки из EEPROM
W -- записать текущее значение потенциометра в EEPROM
После сброса микроконтроллера из EEPROM считывается значение, которое используется как время задержки мигания светодиода, но если начать поворачивать потенциометр, то как время задержки мигания светодиода используется уже текущее значение, задаваемое потенциометром. Чтобы светодиод мигал с временем задержки из EEPROM, нужно прочитать значение задержки из EEPROM (команда R).
Скетч использует библиотеку VEduino (скачать), после установки библиотеки его можно найти в меню Файл-Примеры-VEduino-VEduino_EEPROM.
Ниже приведён код скетча:
/**
* This is an example sketch for VEduino Library.
* It shows how to read and write EEPROM.
*
* Connect potentiometer to analog input 0 of the Adruino board.
* Rotate the pot to change the delay of the LED blinks.
* Use Arduino IDE Serial Monitor to read and store current pot value
* in the microcontroller's EEPROM:
* Type W to write stored value.
* Type R to read stored value.
*
*
*/
#include <ve_avr.h> // This sketch uses VEduino Library.
#define LED_PIN 13 // It should blink.
// These variables are volatile, since their values are changing by interrupt handler.
volatile bool bLedOn = false;
uint16_t potValue; // Previous read pot value.
uint16_t ledBlinkDelay; // Delay between LED blinks.
bool usePotValue;
void setup()
{
pinMode(LED_PIN, OUTPUT); // Setup LED pin as OUTPUT pin.
DEV_EEPROM[0] >> ledBlinkDelay; // We take LED blink delay stored in EEPROM at 0
potValue = analogRead(0) << 6; // Pot value multiplied by 2 six times.
usePotValue = false; // To use EEPROM value, not current pot value.
DEV_TIMER1.setClockSelect(TimerW::Prescaler_64); // 16MHz / 64 = 250 kHz. Timer1 will
// increase its TCNT value each 4 us.
DEV_TIMER1.setWaveGenMode(TimerW::FastPWM_OCRA); // Timer1 will compare its TCNT value
// with its OCRA value and
// each time when TCNT1 = OCR1
DEV_TICTRL1.outCompIntEnableA(); // TIMER1_COMPA_vect ISR handler
// will be called.
Serial.begin(19200); // We will use Serial Monitor.
// Type W to store pot value.
// Type R to read stored pot value.
interrupts(); // Enable interrupts.
Serial.println("VEduino EEPROM example");
Serial.println("Type R or W");
}
void loop()
{
uint16_t newPotValue = analogRead(0) << 6; // Read current pot value.
if (! usePotValue) {
if ((newPotValue & 0xF800) != (potValue & 0xF800)) {
usePotValue = true; // use current pot value
ledBlinkDelay = newPotValue;
}
}
else
ledBlinkDelay = newPotValue;
potValue = newPotValue;
if (bLedOn) // If LED should be switched on
digitalWrite(LED_PIN, HIGH); // LED pin should be high voltage level.
else
digitalWrite(LED_PIN, LOW); // LED should be switched off here.
if (Serial.available()) { // Read commands from Serial.
char ch = Serial.read();
switch (ch) {
case 'R': // READ command
case 'r':
Serial.print("Reading value... ");
DEV_EEPROM[0] >> ledBlinkDelay;
Serial.print(ledBlinkDelay);
Serial.println(" OK");
usePotValue = false;
break;
case 'W': // WRITE command
case 'w':
Serial.print("Writing value... ");
DEV_EEPROM[0] = newPotValue;
DEV_EEPROM[0] >> ledBlinkDelay;
Serial.print(ledBlinkDelay);
Serial.println(" OK");
usePotValue = false;
break;
default:
break;
}
}
}
// DEV_TIMER1 Output Compare A interrupt handler
ISR(TIMER1_COMPA_vect)
{
DEV_TIMER1.setOutputCompareA(ledBlinkDelay); // This sets next interrupt timeout.
bLedOn = ! bLedOn; // This says the main program to change LED state.
}
|