Несколько задач (ssd1306, таймеры, прерывания и энергосбережение, оптимизация, уровень заряда)

neonmind
Offline
Зарегистрирован: 02.02.2014

Добрый день!

Есть ряд задач по программированию ардуины (за вознаграждение)

Опишу конфигурацию:

- leonardo pro micro (клон ардуины)

- дисплей на ssd1306 управляемый по i2c

- блок из 3х кнопок

- батарейка на 7.2в

 

А теперь список задач - буду благодарен за решение любой задачи. Если вы можете решить задачу, и знаете, сколько стоит её выполнение - пишите или сюда или на почту [neonmind собака яндекс.ру] или в скайп neonmind.

Задачи по дисплею (если вообще возможно)

- функция типа invertLine( line_num ) инвертирующая выбранную строку (темные пиксели засвечиваются, а яркие гаснут)

- функция скролла вверх вниз диапазона пикселей выбранной строки (не затрагивая другие области)

- функция blinkchar(line_num,start_px,end,px) которая позволяет мигать выбранным символом (при этом я не знаю какой там символ, и нельзя просто записать " ", а потом снова вывести символ)

 

Задачи по прерываниям и энергосбережению

- функция sleep(&on_button_click) уводящая микросхему в режим сна^ до нажатия кнопки

- функция сна^ на выбранный промежуток времени

^(совсем сна, чтоб абсолютный минимум потреблялся, не обычный делэй)

 

Общие задачи

- необходимо измерить примерный уровень заряда от батарейки (напомню 7.2 на gnd и raw) без аппаратных вмешательств, максимум подпояться к какому-нибудь выводу. Хотя бы на 3 сегмента - полный заряд, средний, слабый. Натыкался в интернете на функцию readVcc() ... но мне не помогло, может кто сможет помочь.

- *(со звездочкой)

Есть необходимость вещать сглаживание на разные параметры, поэтому

требуется элегантное решение функции smooth(), которая должна вернуть значение параметра в зависимости от текущего прогресса. Например, зная, что сглаживание начинается с 20го шага и длится 10шагов (и значение должно начать изменяться со 100попугаев до 200 попугаев) функция должна возвращать значение

100 - до 20го шага,

150 на 25 шаге

200 на 30 шаге

200 после 30 шага

+ есть возможность активации по кнопке, то есть процедура сглаживания начинается если была нажата кнопка.

главная сложность в том, что все это нужно делать в категориях FIXED

static int32_t FIXED_Mul(int32_t a, int32_t b) {
  return(((int32_t)a*(int32_t)b) >> FIXED_FBITS);
}
static int32_t FIXED_Div(int32_t a, int32_t b) {
  return(((int32_t)a << FIXED_FBITS)/(int32_t)b);
}

 

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

Спасибо!

 

freearduino
Offline
Зарегистрирован: 21.04.2014

Здравствуйте!
По поводу энергосбережения есть хорошая библиотека LowPower можно посмотреть тут или тут.

Там есть функция:

LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, 
                SPI_OFF, USART0_OFF, TWI_OFF);
 
Прерывания на 8 сек.
Скачайте библиотеку там есть порядка 3-х примеров, там все описано.
neonmind
Offline
Зарегистрирован: 02.02.2014

спасибо большое!

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

сколько стоит написать 2 такие функции?