Имитация различных шкал на дисплее 128*64

lilik
Offline
Зарегистрирован: 19.10.2017

https://electronics-project-hub.com/analog-clock-using-arduino/

А замысел уже реализовали, дешево и сердито :-)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

lilik пишет:

https://electronics-project-hub.com/analog-clock-using-arduino/

А замысел уже реализовали, дешево и сердито :-)

сервы слишком много жрут

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, жрут-то ладно - понты дороже денег.

Проблема в том, что они неправильно звучат.

Часы должны тикать. Причём тикать с частотой 5 герц, как это делают кошерные механизмы из шестерёнок и винтиков, а не 1 герц как тикают богомерзкие кварцевые.

lilik
Offline
Зарегистрирован: 19.10.2017

Дошёл заказанный дисплей по мотивам темы http://arduino.ru/forum/apparatnye-voprosy/podklyuchenie-displeya-gmg12864-06d-na-st7565r

Попробовал его на шкалах.

Вывод: не очень то он годится для шкал.

lilik
Offline
Зарегистрирован: 19.10.2017

Подвижные элементы отрисовки тускнеют при движении. Библиотека U8g2lib имеет своеобразие как я понял (а другой для этого экране не очень  есть :-) - при рисовании элементов с координатами за пределами 0-127, 0-63 их не должно быть на экране, а они есть в виде различных артефактов. В скетче пришлось вводить ограничение на допустимые значения координат.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lilik пишет:

 

Подвижные элементы отрисовки тускнеют при движении.

Это особенность любых tf-дисплеев и от библиотеки никак не зависит.

Цитата:

Библиотека U8g2lib имеет своеобразие как я понял (а другой для этого экране не очень  есть :-) - при рисовании элементов с координатами за пределами 0-127, 0-63 их не должно быть на экране, а они есть в виде различных артефактов. В скетче пришлось вводить ограничение на допустимые значения координат.

Перед разработчиком всегда стоит дилемма: чему отдать предпочтение, скорости или универсальности.

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

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

lilik пишет:

https://electronics-project-hub.com/analog-clock-using-arduino/

А замысел уже реализовали, дешево и сердито :-)

сервы слишком много жрут


А так? На каждый сегмент по серве.) Во где тикают!

lilik
Offline
Зарегистрирован: 19.10.2017

Тикают раз в минуту :-)

lilik
Offline
Зарегистрирован: 19.10.2017

Для часов экранчик пойдёт (как и для всяких меню на отдельном МК :-). Забавно-символично смотреть как секундная стрелка расщепляется на 2 и одна гаснет. Попробовал этот же скетч на маленьком ssd1306 экране. Он поедает 86 процентов динамической памяти и пишется предупреждение о возможной некорректной работе. Зато на этой же библиотеке можно запустить ещё кучу разных экранов. интересно, а можно эту кучу одновременно запустить?

/////////////////   часы с мелодией
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);
//SDA-A4,SCL-A5
#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS3231);
extern const unsigned char schkala_C[];
///////////////////////////
// НОВОГОДНЯЯ МЕЛОДИЯ фрагмент
int tonePin = 7; 
const struct sound{ 
  int freq, duration, dly; 
  } sounds[] PROGMEM = {
    {293, 225, 250}, {493, 225, 250}, {440, 225, 250}, {391, 225, 250}, {293, 450, 750}, 
    {293, 225, 250}, {293, 225, 250}, {493, 225, 250}, {440, 225, 250}, {391, 225, 250}, 
    {329, 450, 750}, {329, 225, 250}, {329, 225, 250}, {523, 225, 250}, {493, 225, 250}, 
    {440, 225, 250}, {587, 450, 750}, {587, 225, 250}, {659, 225, 250}, {587, 225, 250}, 
    {523, 225, 250}, {440, 225, 250}, {493, 675, 750}
};
const uint8_t melodieLength = sizeof(sounds) / sizeof(sound);
sound SoundSRAM;
///////////////////////////////
int t=222;// пауза между считываниями данных
float minuti = 0.00; //пременные хранения углов
float tcshasi = 0.00; //
float sekundi = 0.00; //
int dlina_1 = 60;//задаём геометрию-форму стрелок часов
int dlina_2 = 28;

void setup()
{
 u8g2.begin(); 
 u8g2.setContrast (20); 
 time.begin();
 }

void loop()
{
 if(time.minutes==0&&time.seconds<10){midi();}// играем мелодию в начале каждого часа 
 vremia_A();
 delay(t); 
}
////////////////////////////////////////
void vremia_A (){
 time.gettime();//
 sekundi=time.seconds*2*PI/60.0;//
 minuti=time.minutes*2*PI/60.0;//
 tcshasi=time.hours*2*PI/12.0+minuti/12.0 ;//
 
  u8g2.clearBuffer();//очистка экрана
  u8g2.drawXBMP(0, 0, 128, 64,schkala_C);// рисование  контура часов по рисунку 
  u8g2.drawLine(63,32,63 + cos(sekundi - PI / 2) * (dlina_1), 32 + sin(sekundi - PI / 2)* (dlina_2));//секундная стрелка рисуется
  u8g2.drawLine(63 + cos(minuti-0.5 - PI / 2) * (dlina_1*0.15), 32 + sin(minuti-0.5 - PI / 2) * (dlina_2*0.15) , 63 + cos(minuti - PI / 2) * (dlina_1*1.1), 32 + sin(minuti - PI / 2) * (dlina_2*1.1)); //минутная стрелка рисуется
  u8g2.drawLine(63 + cos(minuti+0.5 - PI / 2) * (dlina_1*0.15), 32 + sin(minuti+0.5 - PI / 2) * (dlina_2*0.15) , 63 + cos(minuti - PI / 2) * (dlina_1), 32 + sin(minuti - PI / 2) * (dlina_2)); //минутная стрелка рисуется
  u8g2.drawLine(63 + cos(tcshasi-0.5 - PI / 2) * (dlina_1*0.15), 32 + sin(tcshasi-0.5 - PI / 2) * (dlina_2*0.15) , 63 + cos(tcshasi - PI / 2) * (dlina_1*0.5), 32 + sin(tcshasi - PI / 2) * (dlina_2*0.5)); //часовая стрелка рисуется
  u8g2.drawLine(63 + cos(tcshasi+0.5 - PI / 2) * (dlina_1*0.15), 32 + sin(tcshasi+0.5 - PI / 2) * (dlina_2*0.15) , 63 + cos(tcshasi - PI / 2) * (dlina_1*0.5), 32 + sin(tcshasi - PI / 2) * (dlina_2*0.5)); //часовая стрелка рисуется
  u8g2.drawCircle( 63, 32, 4);//точка крепления стрелки
  u8g2.sendBuffer();  
  }
  ///////////////////////////////////////
  void midi() {
  for (uint8_t i = 0; i < melodieLength; i++) {
    memcpy_P( &SoundSRAM, &sounds[i], sizeof(sound));
    tone(tonePin, SoundSRAM.freq, SoundSRAM.duration);
    vremia_A();//не забываем двигать стрелки часов во время исполнения мелодии
   delay(SoundSRAM.dly);
  }
}
/////////////////////////////////////////

 

Green
Offline
Зарегистрирован: 01.10.2015

lilik пишет:

Тикают раз в минуту :-)


Аха, особенно много шума при переходах через 0-ли.) Человеку делал countdown до конца проекта.