Карманное FM Радио на RDA5807, IIC Oled 0.96" и Arduino Pro Mini

b707
Offline
Зарегистрирован: 26.05.2017

otrazhenie пишет:

b707 пишет:

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

не нравится код? а покажи свой " правильный"

тогда и посмотрим чей код лучше....авторский  код работает...а вот Ваш....под вопросом пока

похоже и правда не слыхали....

 

GhostLion
GhostLion аватар
Offline
Зарегистрирован: 30.07.2018

Версия 1.7

1. Добавил функцию уровня сигнала.

2. Оптимизировал код.

//FM Radio OLED Copyright by GhostLion v1.7 GOLD

#include <EEPROM.h>
#include <radio.h>
#include <RDA5807M.h>

#include "U8glib.h"
#include "rus6x10.h"
#include "MyDigitsHelveticaBold24.h"

#define Pin_DOWN 4   // левая кнопка 
#define Pin_UP 2     // правая кнопка 
#define Pin_SET 3    // центральная кнопка
#define FIX_BAND 1

const uint8_t Radio [] U8G_PROGMEM = {0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x40, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0xC0, 0x01, 0x80,0x00, 0x00, 0xC0, 0x01, 0x8E, 0x88, 0x00, 0xC0, 0x01, 0x88, 0xD8, 0x00, 
0xC0, 0x01, 0x88, 0xA8,0x00, 0xC0, 0x01, 0x8C, 0xA8, 0x00, 0xC0, 0x01, 0x88, 0xA8, 0x00, 0xC0, 0x01, 0x80, 0x00, 0x00,0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0x81, 0x04, 0x10, 0x41, 0x05, 0x81, 0x04, 0x10, 
0x41,0x05, 0x95, 0x55, 0x55, 0x55, 0x55, 0x95, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0x80,0x00, 0x00, 
0xF8, 0x01, 0x80, 0x00, 0x03, 0xFE, 0x01, 0x80, 0x00, 0x07, 0x03, 0x01, 0x80, 0x00,0x0C, 0x01, 0x81, 0x80, 0x60, 0x18, 0x00, 0xC1, 0x81, 0xF8, 0x18, 0x00, 0x41, 0x83, 0x9C, 0x10,0x00, 0x61, 0x83, 0x0C, 0x30, 
0x00, 0x61, 0x83, 0x0C, 0x30, 0x00, 0x61, 0x83, 0x0C, 0x30, 0x00,0x61, 0x83, 0x9C, 0x10, 0x00, 0x61, 0x81, 0xF8, 0x18, 0x00, 0x41, 0x80, 0x60, 0x18, 0x00, 0xC1,0x80, 0x00, 0x0C, 0x01, 0x81, 0x80, 0x00, 0x07, 
0x03, 0x01, 0x80, 0x00, 0x03, 0xFE, 0x01, 0x80,0x00, 0x00, 0xF8, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00,0x00, 0x00, 0x02, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC};

const uint8_t Bass[] U8G_PROGMEM = {0x7F, 0xFE, 0x80, 0x01, 0x9B, 0x8D, 0xA2, 0x51, 0xA3, 0x91, 0x9A, 0x4D, 0x8A, 0x45, 0xB3, 0x99,0x80, 0x01, 0x7F, 0xFE};
const uint8_t Stereo[] U8G_PROGMEM = {0x7F, 0xFE, 0x80, 0x01, 0x9B, 0xB9, 0xA1, 0x25, 0xA1, 0x39, 0x99, 0x31, 0x89, 0x29, 0xB1, 0x25,0x80, 0x01, 0x7F, 0xFE};
const uint8_t SM[] U8G_PROGMEM = {0x7F, 0xFE, 0x80, 0x01, 0x8C, 0x51, 0x90, 0xA9, 0x90, 0xA9, 0x8C, 0xA9, 0x84, 0xA9, 0x98, 0x89,0x80, 0x01, 0x7F, 0xFE};

const uint8_t Bat1[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,0x80, 0x02, 0x7F, 0xFC};
const uint8_t Bat2[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01,0x80, 0x02, 0x7F, 0xFC};
const uint8_t Bat3[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01,0x80, 0x02, 0x7F, 0xFC};
const uint8_t Bat4[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01,0x80, 0x02, 0x7F, 0xFC};
const uint8_t Bat5[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81,0x80, 0x02, 0x7F, 0xFC};
const uint8_t Bat6[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1,0x80, 0x02, 0x7F, 0xFC};
const uint8_t Bat7[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA9, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xA9,0x80, 0x02, 0x7F, 0xFC};

const uint8_t Vol1[] U8G_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x60, 0x00, 0x60, 0x00};
const uint8_t Vol2[] U8G_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00,0x6C, 0x00, 0x6C, 0x00};
const uint8_t Vol3[] U8G_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x0D, 0x80, 0x0D, 0x80,0x6D, 0x80, 0x6D, 0x80};
const uint8_t Vol4[] U8G_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x01, 0xB0, 0x01, 0xB0, 0x0D, 0xB0, 0x0D, 0xB0,0x6D, 0xB0, 0x6D, 0xB0};
const uint8_t Vol5[] U8G_PROGMEM = {0x00, 0x06, 0x00, 0x06, 0x00, 0x36, 0x00, 0x36, 0x01, 0xB6, 0x01, 0xB6, 0x0D, 0xB6, 0x0D, 0xB6,0x6D, 0xB6, 0x6D, 0xB6};

const uint8_t L1 [] U8G_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18};
const uint8_t L2 [] U8G_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x18};
const uint8_t L3 [] U8G_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x18, 0x18};
const uint8_t L4 [] U8G_PROGMEM = {0x00, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x18, 0x18};
const uint8_t L5 [] U8G_PROGMEM = {0xFF, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x18, 0x18};

const unsigned int Station[] = {8750,9240,9370,9410,9620,9740,9800,9840,9890,9950,10040,10120,10170,10210,10250,10290,10370,10460,10510,10570,10620,10710,10790};
byte NK = 23; // количество каналов


byte v,k,m,rs, flag1=1,flag2=0,flag3=0;
int Voltage;
unsigned int s,s2;
boolean b,ms,sm,flag=1,MODE=1;
long TimeOut;

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
RDA5807M radio; 

void setup()
{
pinMode(Pin_DOWN,INPUT_PULLUP);
pinMode(Pin_UP,INPUT_PULLUP);
pinMode(Pin_SET,INPUT_PULLUP); 

Inicial();
}

void loop()
{
Parsing();
Menu();
Energy();  
}
//==============================================
void Inicial()
{
 u8g.firstPage();  
do {
  u8g.drawBitmapP (5, 16, 5, 40, Radio);
  u8g.setFont(rus6x10);
  u8g.setPrintPos(40,11);u8g.print(F("FM РАДИО"));
  u8g.setPrintPos(55,45);u8g.print(F("v 1.7 GOLD"));
  u8g.setPrintPos(55,55);u8g.print(F("By GhostLion"));  
   }
while( u8g.nextPage() );

delay(1500);
if (EEPROM[0]!=1)
    {
     EEPROM[0]=1;
     EEPROM[1]=5;
     EEPROM[2]=9; // здесь установить номер текущего канала (моя частота 98.90 "Русское радио") (или 0)
     EEPROM[3]=1;
     EEPROM[4]=1;
     EEPROM[5]=0;
     EEPROM[6]=98;  // частота текущей радиостанции
     EEPROM[7]=90;  // "Русское радио"
     EEPROM[8]=1;
    }
v  = EEPROM[1];               // громкость
k  = EEPROM[2];               // текущий канал
m  = EEPROM[3];               // текущее меню
b  = EEPROM[4];               // супербасс
ms = EEPROM[5];               // моно/стерео
s  = EEPROM[6]*100+EEPROM[7]; // текущая частота
sm = EEPROM[8];               // softmute
s2=s;
radio.init();
radio.setVolume(v);
radio.setMono(ms);
radio.setMute(false);
radio.setBassBoost(b);
radio.setSoftMute(sm);  
radio.setBandFrequency(FIX_BAND, s);
readVcc();
}
//================================================
void Parsing()
{
boolean SET=digitalRead(Pin_SET);
boolean UP=digitalRead(Pin_UP);
boolean DOWN=digitalRead(Pin_DOWN);

if(SET==HIGH && flag1==0)
  {
    flag1=1;
  }
if(SET==LOW && flag1==1)
  {
    flag1=0;
    TimeOut=millis();
    if(MODE==1) {m++; flag=1; if(m>7) m=1;}
  }
  
 if(UP==LOW && flag2==1)
  {
    flag2=0;
  }
   if(UP==HIGH && flag2==0)
   {
    if(MODE==1)
    {
    switch(m)
      {
        case 1:{ (v==15?0:v++); radio.setVolume(v); break; }
        case 2:{ b = 1; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s); break; }
        case 3:{ ms = 0; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s); break; }
        case 4:{sm = 1; radio.setSoftMute(true);radio.setBandFrequency(FIX_BAND,s); break;}
        case 5:{ radio.seekUp(true); delay(3000); s = radio.getFrequency(); Kanal(); break; }
        case 6:{ s=s+10; if (s > 10800) s = 8700; delay(100); radio.setBandFrequency(FIX_BAND,s);Kanal(); break; }
        case 7:{ k++; if (k>NK) k=1; s = Station[k-1]; radio.setBandFrequency(FIX_BAND,s); break;}
      }
   flag=1;
   TimeOut=millis();
    }
   else {(v==15?0:v++);radio.setVolume(v);}
   flag2=1;
   }
   if(DOWN==LOW && flag3==1)
  {
    flag3=0;
  }
   if(DOWN==HIGH && flag3==0)
   {
    if(MODE==1)
    {
    switch(m)
      {
        case 1:{ (v==0?15:v--); radio.setVolume(v); break; }
        case 2:{ b = 0; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s); break; }
        case 3:{ ms = 1; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s); break; }
        case 4:{sm = 0; radio.setSoftMute(false);radio.setBandFrequency(FIX_BAND,s); break;}
        case 5:{ radio.seekDown(true); delay(3000); s=radio.getFrequency(); Kanal(); break; }
        case 6:{ s=s-10; if (s<8700) s=10800; delay(100); radio.setBandFrequency(FIX_BAND,s); Kanal(); break; }
        case 7:{ k--; if (k<1) k=NK; s = Station[k-1]; radio.setBandFrequency(FIX_BAND,s); break;}
      }
   flag=1;
   TimeOut=millis();
   }
   else {(v==0?15:v--);radio.setVolume(v);}
   flag3=1;
  }
}
//================================================
void Menu()
{
float ch;
if(flag==1 && MODE==1)
{
rs = radio.getRSSI();   
ch=float(s)/100; 
u8g.firstPage();  
do {
u8g.setDefaultForegroundColor();
if(Voltage>85) u8g.drawBitmapP (110, 0, 2, 10, Bat7);
  else if(Voltage>70) u8g.drawBitmapP (110, 0, 2, 10, Bat6);
  else if(Voltage>55) u8g.drawBitmapP (110, 0, 2, 10, Bat5);
  else if(Voltage>40) u8g.drawBitmapP (110, 0, 2, 10, Bat4);
  else if(Voltage>25) u8g.drawBitmapP (110, 0, 2, 10, Bat3);
  else if(Voltage>10) u8g.drawBitmapP (110, 0, 2, 10, Bat2);
  else u8g.drawBitmapP (110, 0, 2, 10, Bat1);
if(v<3) u8g.drawBitmapP (13, 0, 2, 10, Vol1);
  else if(v<7) u8g.drawBitmapP (13, 0, 2, 10, Vol2);
  else if(v<10) u8g.drawBitmapP (13, 0, 2, 10, Vol3);
  else if(v<13) u8g.drawBitmapP (13, 0, 2, 10, Vol4);
  else u8g.drawBitmapP (13, 0, 2, 10, Vol5);
if(ms==0) u8g.drawBitmapP (55, 0, 2, 10, Stereo);
if(b==1) u8g.drawBitmapP (75, 0, 2, 10, Bass);
if(sm==1) u8g.drawBitmapP (35, 0, 2, 10, SM);

u8g.setFont(MyDigitsHelveticaBold24);
if(ch<100) u8g.setPrintPos(30,43); else u8g.setPrintPos(23,43);
u8g.print(ch,1);
u8g.setFont(rus6x10);
u8g.print(" MHz");
if (rs>50) u8g.drawBitmapP (0, 0, 1, 10, L5);
  else if(rs>40)  u8g.drawBitmapP (0, 0, 1, 10, L4);
  else if(rs>30)  u8g.drawBitmapP (0, 0, 1, 10, L3);
  else if(rs>20)  u8g.drawBitmapP (0, 0, 1, 10, L2);
  else u8g.drawBitmapP (0, 0, 1, 10, L1);
if(k!=0){
    u8g.drawRFrame (0,32,18,13,2);
    u8g.setPrintPos(3,42);
    if(k<10) u8g.print("0");
    u8g.print(k);
        }
u8g.drawRFrame (0,51,127,12,3);
u8g.setPrintPos(13,61);
 switch(m)
 {
  case 1: {u8g.print(F("- < ГРОМКОСТЬ > +"));break;}
  case 2: {u8g.print(F(" НЕТ < БАСС > ДА"));break;}
  case 3: {u8g.print(F("НЕТ < СТЕРЕО > ДА"));break;}
  case 4: {u8g.print(F("НЕТ < S.MUTE > ДА"));break;}
  case 5: {u8g.print(F(" <  АВТОПОИСК  >"));break;}
  case 6: {u8g.print(F("<  РУЧ. ПОИСК  >"));break;}
  case 7: {u8g.print(F("  <  КАНАЛЫ  >"));break;}
 
 }


}
while( u8g.nextPage() );     
  flag=0;    
}
}
//================================================
void Energy()
{
 if(MODE==1 && millis()-TimeOut>2000) flag=1;
 if(MODE==1 && millis()-TimeOut>8000)
  {
    u8g.sleepOn(); 
    MODE=0;
    if(v!= EEPROM[1]) EEPROM[1] = v;
    if(k!= EEPROM[2]) EEPROM[2] = k;
    if(m!= EEPROM[3]) EEPROM[3] = m;
    if(b!= EEPROM[4]) EEPROM[4] = b;
    if(ms!=EEPROM[5]) EEPROM[5] = ms;
    if(s2!=s){s2=s;   EEPROM[6] = int(s/100); 
                      EEPROM[7] = s%100;
             }
    if(sm!=EEPROM[8]) EEPROM[8] = sm;         
  }
  if(MODE==0 && millis()-TimeOut<500)
  {
    u8g.sleepOff(); 
    readVcc();
    MODE = 1; 
    flag = 1; 
    m = 7;
  }
}
//===================================================
void readVcc() 
{
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#else
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA, ADSC)); // measuring
  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH
  uint8_t high = ADCH; // unlocks both
  long result = (high << 8) | low;

  result = 1.080 * 1023 * 1000 / result; // расчёт реального VCC
  Voltage = int(result);
  Voltage = map(Voltage, 3200, 4200, 0, 100);
  Voltage = constrain(Voltage, 0, 100);
}
//=======================================================
void Kanal()
{
  k = 0;
  for(int x = 0; x < NK; x ++)
    {
      if(s == Station[x]) {k = (x+1); break;}
    }   
}

 

aleksandr1612
aleksandr1612 аватар
Offline
Зарегистрирован: 18.12.2017

GhostLion пишет:
Версия 1.7

Огромное спасибо, компилируется на ура, причем любой ваш код, на рождественских праздниках обязательно соберу, с праздниками и еще раз спасибо!

Zummer
Offline
Зарегистрирован: 25.11.2019

Заинтересовал проект,в среде ардуино несложно выбрать другой экран,у меня есть ili9341,сложно ли переделать программу?если не сложно то переписывать буду сам

b707
Offline
Зарегистрирован: 26.05.2017

Zummer пишет:

Заинтересовал проект,в среде ардуино несложно выбрать другой экран,у меня есть ili9341,сложно ли переделать программу?если не сложно то переписывать буду сам

код перед вами, в нем всего 300 строк. Загляните и оцените, "сложно" это для вас или нет.

Подозреваю. что опыта у вас практически ноль, иначе и вопроса такого не было. Если вы думаете. что достаточно выбрать в ИДЕ нужный экран и все перекомпилируется само - то сразу скажу, что ничего похожего и близко нет. Программу придется переписывать, детально вникая в код.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Проще будет такой экран купить, как в праэкте

Zummer
Offline
Зарегистрирован: 25.11.2019

DetSimen  Зачем мне его покупать если SSD1306 у меня 2 шт и еще одна 32*128,но они мелкие

b707 Насчет программирования-опыт кое какой есть,на уровне новичка, я же просто спросил-можно переделать на другой или нет, я просто не знаю библиотека U2Glib поддерживает ILI9341 или нет,видимо и вам это неизвестно иначе бы просто ответили-"это возможно" либо "это невозможно"

начал соединять ардуино и дисплей,сделаю сам

b707
Offline
Зарегистрирован: 26.05.2017

Zummer пишет:

я же просто спросил-можно переделать на другой или нет

 можно

Цитата:
просто не знаю библиотека U2Glib поддерживает ILI9341 или нет

а причем тут это? Возможность переделать скетч от этого не зависит.

Я еще раз повторю - судя по задаваемым вопросам, вам до этого еще очень далеко.

 

Zummer
Offline
Зарегистрирован: 25.11.2019

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

Ну раз можно буду делать сам,спасибо за ответ,вечерком займусь платой,библиотеку с тачем нашел http://arduino.ru/forum/apparatnye-voprosy/displei-na-ili9341#top но это уже не по вашей теме и здесь лучше не писать,открыть новую тему боюсь-вдруг такая тема уже была (rda5807+ili9341+ds1307+ds18b20) и прикроют мой профиль навсегда хозяева сайта за дублирование темы...

 

Удачи вам и развития проекта!

b707
Offline
Зарегистрирован: 26.05.2017

Zummer пишет:

открыть новую тему боюсь-вдруг такая тема уже была - и прикроют мой профиль навсегда хозяева сайта за дублирование темы...

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

aleksandr1612
aleksandr1612 аватар
Offline
Зарегистрирован: 18.12.2017

Всем доброго дня, может кто подскажет что в скетче надо подправить, чтобы при включении громкость была максимальной, так как использую усилитель ЗЧ, а у него свой регулятор громкости и каждый раз кнопками поднимать громкость не комфортно.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

aleksandr1612 пишет:

Всем доброго дня, может кто подскажет что в скетче надо подправить, чтобы при включении громкость была максимальной, так как использую усилитель ЗЧ, а у него свой регулятор громкости и каждый раз кнопками поднимать громкость не комфортно.

пропробуй написать

110 radio.setVolume(15);

 

aleksandr1612
aleksandr1612 аватар
Offline
Зарегистрирован: 18.12.2017

DetSimen пишет:

пропробуй написать

110 radio.setVolume(15);

спасибо помогло, осталось только индикатор подправить и всё ))

СЕРГЕЙ557
Offline
Зарегистрирован: 25.01.2020

подскажите как сделать чтоб экран  все время работал.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

СЕРГЕЙ557 пишет:

подскажите как сделать чтоб экран  все время работал.

Не отключать его, да и всё.  

СЕРГЕЙ557
Offline
Зарегистрирован: 25.01.2020

нет чтобы не тух через 8секунд .как отключить 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Убрать из кода строчки, отключающие экран через 8 секунд. 

СЕРГЕЙ557
Offline
Зарегистрирован: 25.01.2020

подскажите какая строка

Zummer
Offline
Зарегистрирован: 25.11.2019

254  u8g.sleepOn();
.............................

268   u8g.sleepOff();

в исходнике http://arduino.ru/forum/proekty/karmannoe-fm-radio-na-rda5807-iic-oled-096-i-arduino-pro-mini?page=1#comment-498933

СЕРГЕЙ557
Offline
Зарегистрирован: 25.01.2020

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

 

Deniskyn
Offline
Зарегистрирован: 13.04.2019

Какие функции выполняет индикатор сигнала как у мобильных и индикатор батареи (возможно был задел таки измерять заряд батареи)??? RDS никто не прикрутил?

Николай 28041946
Offline
Зарегистрирован: 11.08.2020

     Всем здравствуйте .Как изменить скетч ,чтоб работала только кнопка переключения каналов по кругу. Вернее чтоб при включении включался пункт меню "каналы".и не выключался. Сам в программировании полный  ноль. Хочу встроить этот приемник  в ВЭФ202

 

Deniskyn
Offline
Зарегистрирован: 13.04.2019

Жаль, но похоже автор забил на проект...

GhostLion
GhostLion аватар
Offline
Зарегистрирован: 30.07.2018

Индикатор сигнала (первый )измеряет уровень фм сигнала, второй показывает громкость, справа индикатор уровня заряда батареи. На RDS не хватает памяти - нужно полностью менять библиотеки ФМ радио или писать свои

GhostLion
GhostLion аватар
Offline
Зарегистрирован: 30.07.2018

Николай 28041946 пишет:

     Всем здравствуйте .Как изменить скетч ,чтоб работала только кнопка переключения каналов по кругу. Вернее чтоб при включении включался пункт меню "каналы".и не выключался. Сам в программировании полный  ноль. Хочу встроить этот приемник  в ВЭФ202

 

Лучше взять на Алике вот такой модуль:

GhostLion
GhostLion аватар
Offline
Зарегистрирован: 30.07.2018

p.s. А еще на Алике есть куча приблуд с встроенным радио, блютуз модулем, кардридером для SD и USB

Deniskyn
Offline
Зарегистрирован: 13.04.2019

Автор, добавьте плс в ваш проект энкодер или Ик пульт..... будет супер Имхо

Ky6AHb
Ky6AHb аватар
Offline
Зарегистрирован: 08.06.2020

GhostLion

Прошивка 1.7 всё работает как было задумано автором, кроме отсутствия делений на индикаторе заряда батареи, только рамка батареи и пусто внутри.

 

Плата WAVGAT Pro Mini ATMEGA328P

Что смотреть, куда копать? Понимаю, что редактировать нужно участок кода с 276 по 282 строку, но что именно прописать?

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Ky6AHb пишет:

Что смотреть, куда копать? Понимаю, что редактировать нужно участок кода с 276 по 282 строку, но что именно прописать?

Если вопрос актуален. Плата скорее всего на LGT8F328P (клон меги 328), вот и копать нужно исходя из этого. С ней еще не разбирался - валяется в закромах. Но скорее всего там инициализация АЦП другая, а здесь жестко под МЕГИ прописана (не на вайринге). Есть тема здесь же: http://arduino.ru/forum/apparatnye-voprosy/obzor-klona-megi328-lgt8f328p

Можно попробовать через analogRead() считать напряжение, должна заработать, но эта сама функция достаточно тормозная и будут подлагивания. 

p-a-h-a
Offline
Зарегистрирован: 17.01.2019

Николай 28041946 пишет:
Всем здравствуйте .Как изменить скетч ,чтоб работала только кнопка переключения каналов по кругу. Вернее чтоб при включении включался пункт меню "каналы".и не выключался. Сам в программировании полный  ноль. Хочу встроить этот приемник  в ВЭФ202

Выбор станции кнопкой Reset либо при замыкании пина RST на землю

#include "RDA5807M.h"
#include <avr/sleep.h>// Необязательная строка для уменьшения энергопотребления
RDA5807M radio;// создаем объект radio

void setup() {
  radio.begin();
  radio.antena(2);// 0 -отключена 1 - земля, 2 - вход FMIN 3 - оба источника
  radio.setStereo(false); // включаем моно режим. Если нужно стерео - удалить эту строку
  radio.bass(true);// Усиление баса. Если не нужно - удалить эту строку

  radio.nextStation();// Автоматический поиск вперед
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);// Необязательная строка для уменьшения энергопотребления
  sleep_mode();// Необязательная строка для уменьшения энергопотребления
}
void loop() {}

Библиотека https://drive.google.com/file/d/1UC76ne0fgzVc9WwlQz_wA7zIapd_Tx6e/view?usp=sharing

А вот прямо для ВЭФ. Запоминает последнюю станцию и воспроизводит ее при включении. Переключается на следующую(предыдущую) при замыкании пина 2(3) на землю:

//Скетч переключения станций вперед-назад при замыкании пинов 2 или 3 на землю. Энергоэфективно (микроконтроллер выключен между нажатиями кнопки)
//Станция запоминается и включается последняя пойманная после подачи питания. Ресурс запоминания 100 000 переключений
#include <EEPROM.h>
#include "RDA5807M.h"
#include <avr/sleep.h>//для уменьшения энергопотребления
RDA5807M radio;// создаем объект radio
uint16_t Frequency = 0;
bool rewers_ = false;// Тут храним направление переключения станции

void setup() {
  pinMode(2, INPUT_PULLUP); // 2 пин с подтяжкой к VCC
  pinMode(3, INPUT_PULLUP); // 2 пин с подтяжкой к VCC
  attachInterrupt(0, init0, FALLING);// Настройка прерывания для просыпания МК и переключения станций
  attachInterrupt(1, init1, FALLING);// Настройка прерывания для просыпания МК и переключения станций
  EEPROM.get(100, Frequency);// Читаем последнюю частоту станции ФМ
  radio.begin();//Инициализация RDA5807M
  radio.setFrequency(Frequency); // Устанавливаем последнюю частоту до выключения
  radio.antena(2);// 0 -отключена 1 - земля, 2 - вход FMIN 3 - оба источника
  radio.setStereo(false); // включаем моно режим. Если нужно стерео - удалить эту строку
  radio.bass(true);// Усиление баса. Если не нужно - удалить эту строку
}

void loop() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);// для уменьшения энергопотребления
  sleep_mode();// для уменьшения энергопотребления выключаем МК до внешнего воздействия
  if (rewers_) {
    radio.nextStation();// Автоматический поиск вперед
  } else {
    radio.prevStation();// Автоматический поиск назад
  }
  Frequency = radio.getFrequency(); // Получаем частоту новой станции
  EEPROM.put(100, Frequency);
}
void init0() {
  rewers_ = false;
}
void init1() {
  rewers_ = true;
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ты бы в своей "библиотеке" для начала все Serial.println() бы выпилил. 

p-a-h-a
Offline
Зарегистрирован: 17.01.2019

DetSimen пишет:

ты бы в своей "библиотеке" для начала все Serial.println() бы выпилил. 


Ты шо, Коля?
Хули чужие библиотеки смотришь? Не тебе написано.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

p-a-h-a пишет:
Хули чужие библиотеки смотришь? Не тебе написано.

У меня своя 

b707
Offline
Зарегистрирован: 26.05.2017

p-a-h-a пишет:
DetSimen пишет:

ты бы в своей "библиотеке" для начала все Serial.println() бы выпилил. 

Ты шо, Коля? Хули чужие библиотеки смотришь? Не тебе написано.

Паха. заканчивай тормозить. Ты  месяц разбирался, как IP адрес на печать вывести - и так и не понял. походу. Так что ты не огрызайся, а слушай, когда тебе более умные люди советуют.

Deniskyn
Offline
Зарегистрирован: 13.04.2019

Господа, кто может добавить в проект энкодер??? и - или Ик пульт..... будет супер

p-a-h-a
Offline
Зарегистрирован: 17.01.2019

За умность не спорю, а за культуру общения... такое себе, меня задело, в том же стиле и написал. Мы можем спокойно и уважительно обращаться друг к другу. По поводу Print в библиотеке, возможно где-то в кеше серверов осталось. Я ночью через 15 минут как пост написал, перезалил. Сейчас проверял, не было принтов. То что не все правильно написано, даже спорить не буду. К сожалению пока ссылки и указатели использовать не умею. Учусь потихоньку. Зато интересно было разобраться в регистрах микросхемы. За IP адрес в соответствующей теме ответил, ты уж прости, в твоем стиле.

Так что предлагаю уважительно в дальнейшем общаться друг к другу. У всех свой интерес пребывания на форуме. Кто-то учится, кому-то нравится на тупые вопросы поотвечать. 

fedic
Offline
Зарегистрирован: 01.03.2021

Ребята, подскажите пожалуйста, где что я делаю не так, проект не компилируется, куча ошибок  среда 1.8.13, выдает следующее:

Arduino: 1.8.13 (Windows 10), Плата:"Arduino Pro or Pro Mini, ATmega328P (5V, 16 MHz)"
 
 
 
In file included from C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:4:0:
 
C:\Users\peter\Documents\Arduino\libraries\_Radio_\src/radio.h:118:1: warning: 'typedef' was ignored in this declaration
 
 typedef struct RADIO_INFO {
 
 ^~~~~~~
 
C:\Users\peter\Documents\Arduino\libraries\_Radio_\src/radio.h:130:1: warning: 'typedef' was ignored in this declaration
 
 typedef struct AUDIO_INFO {
 
 ^~~~~~~
 
C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino: In function 'void Inicial()':
 
C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:82:35: warning: invalid conversion from 'int' to 'RADIO_BAND' [-fpermissive]
 
 radio.setBandFrequency(FIX_BAND, s);
 
                                   ^
 
In file included from C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:4:0:
 
C:\Users\peter\Documents\Arduino\libraries\_Radio_\src/radio.h:176:22: note:   initializing argument 1 of 'virtual void RADIO::setBandFrequency(RADIO_BAND, RADIO_FREQ)'
 
   virtual void       setBandFrequency(RADIO_BAND newBand, RADIO_FREQ newFreq); ///< Set Band and Frequency in one call.
 
                      ^~~~~~~~~~~~~~~~
 
C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino: In function 'void Parsing()':
 
C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:118:81: warning: invalid conversion from 'int' to 'RADIO_BAND' [-fpermissive]
 
         case 2:{ b = 1; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s); break; }
 
                                                                                 ^
 
In file included from C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:4:0:
 
C:\Users\peter\Documents\Arduino\libraries\_Radio_\src/radio.h:176:22: note:   initializing argument 1 of 'virtual void RADIO::setBandFrequency(RADIO_BAND, RADIO_FREQ)'
 
   virtual void       setBandFrequency(RADIO_BAND newBand, RADIO_FREQ newFreq); ///< Set Band and Frequency in one call.
 
                      ^~~~~~~~~~~~~~~~
 
C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:119:78: warning: invalid conversion from 'int' to 'RADIO_BAND' [-fpermissive]
 
         case 3:{ ms = 0; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s); break; }
 
                                                                              ^
 
In file included from C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:4:0:
 
C:\Users\peter\Documents\Arduino\libraries\_Radio_\src/radio.h:176:22: note:   initializing argument 1 of 'virtual void RADIO::setBandFrequency(RADIO_BAND, RADIO_FREQ)'
 
   virtual void       setBandFrequency(RADIO_BAND newBand, RADIO_FREQ newFreq); ///< Set Band and Frequency in one call.
 
                      ^~~~~~~~~~~~~~~~
 
C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:121:96: warning: invalid conversion from 'int' to 'RADIO_BAND' [-fpermissive]
 
         case 5:{ s=s+10; if (s > 10800) s = 8700; delay(100); radio.setBandFrequency(FIX_BAND,s);Kanal(); break; }
 
                                                                                                ^
 
In file included from C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:4:0:
 
C:\Users\peter\Documents\Arduino\libraries\_Radio_\src/radio.h:176:22: note:   initializing argument 1 of 'virtual void RADIO::setBandFrequency(RADIO_BAND, RADIO_FREQ)'
 
   virtual void       setBandFrequency(RADIO_BAND newBand, RADIO_FREQ newFreq); ///< Set Band and Frequency in one call.
 
                      ^~~~~~~~~~~~~~~~
 
C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:122:84: warning: invalid conversion from 'int' to 'RADIO_BAND' [-fpermissive]
 
         case 6:{ k++; if (k>23) k=1; Frequency(); radio.setBandFrequency(FIX_BAND,s);break;}
 
                                                                                    ^
 
In file included from C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:4:0:
 
C:\Users\peter\Documents\Arduino\libraries\_Radio_\src/radio.h:176:22: note:   initializing argument 1 of 'virtual void RADIO::setBandFrequency(RADIO_BAND, RADIO_FREQ)'
 
   virtual void       setBandFrequency(RADIO_BAND newBand, RADIO_FREQ newFreq); ///< Set Band and Frequency in one call.
 
                      ^~~~~~~~~~~~~~~~
 
C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:141:81: warning: invalid conversion from 'int' to 'RADIO_BAND' [-fpermissive]
 
         case 2:{ b = 0; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s); break; }
 
                                                                                 ^
 
In file included from C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:4:0:
 
C:\Users\peter\Documents\Arduino\libraries\_Radio_\src/radio.h:176:22: note:   initializing argument 1 of 'virtual void RADIO::setBandFrequency(RADIO_BAND, RADIO_FREQ)'
 
   virtual void       setBandFrequency(RADIO_BAND newBand, RADIO_FREQ newFreq); ///< Set Band and Frequency in one call.
 
                      ^~~~~~~~~~~~~~~~
 
C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:142:78: warning: invalid conversion from 'int' to 'RADIO_BAND' [-fpermissive]
 
         case 3:{ ms = 1; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s); break; }
 
                                                                              ^
 
In file included from C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:4:0:
 
C:\Users\peter\Documents\Arduino\libraries\_Radio_\src/radio.h:176:22: note:   initializing argument 1 of 'virtual void RADIO::setBandFrequency(RADIO_BAND, RADIO_FREQ)'
 
   virtual void       setBandFrequency(RADIO_BAND newBand, RADIO_FREQ newFreq); ///< Set Band and Frequency in one call.
 
                      ^~~~~~~~~~~~~~~~
 
C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:144:92: warning: invalid conversion from 'int' to 'RADIO_BAND' [-fpermissive]
 
         case 5:{ s=s-10; if (s<8700) s=10800; delay(100); radio.setBandFrequency(FIX_BAND,s); Kanal(); break; }
 
                                                                                            ^
 
In file included from C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:4:0:
 
C:\Users\peter\Documents\Arduino\libraries\_Radio_\src/radio.h:176:22: note:   initializing argument 1 of 'virtual void RADIO::setBandFrequency(RADIO_BAND, RADIO_FREQ)'
 
   virtual void       setBandFrequency(RADIO_BAND newBand, RADIO_FREQ newFreq); ///< Set Band and Frequency in one call.
 
                      ^~~~~~~~~~~~~~~~
 
C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:145:84: warning: invalid conversion from 'int' to 'RADIO_BAND' [-fpermissive]
 
         case 6:{ k--; if (k<1) k=23; Frequency(); radio.setBandFrequency(FIX_BAND,s); break;}
 
                                                                                    ^
 
In file included from C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino:4:0:
 
C:\Users\peter\Documents\Arduino\libraries\_Radio_\src/radio.h:176:22: note:   initializing argument 1 of 'virtual void RADIO::setBandFrequency(RADIO_BAND, RADIO_FREQ)'
 
   virtual void       setBandFrequency(RADIO_BAND newBand, RADIO_FREQ newFreq); ///< Set Band and Frequency in one call.
 
                      ^~~~~~~~~~~~~~~~
 
C:\Users\peter\Documents\Arduino\PROJ\FM Radio\FM Radio\RadioFM_v1.4_Extended\RadioFM_v1.4_Extended.ino: In function 'void Menu()':
 
RadioFM_v1.4_Extended:160:12: error: 'class RDA5807M' has no member named 'getRSSI'
 
 rs = radio.getRSSI();
 
            ^~~~~~~
 
exit status 1
 
'class RDA5807M' has no member named 'getRSSI'
 
Все библиотеки разархивировал в проект.
Заранее спасибо!
mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Судя по всему библиотека не та.

fedic
Offline
Зарегистрирован: 01.03.2021

Библиотеки из архива https://yadi.sk/d/S678nWJY8EChPw

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

А другой библиотеки RDA5807 нет в папке ардуино? Так было, когда 2 библиотеки установлены были, IDE при компиляции файлы из другой папки подключала, т.к. у них названия одинаковые были. Хотя у меня с этой тоже проблемы были. Использую другую - переделал под свои нужды, точнее функции добавил... Сейчас тоже радио пытаюсь сделать: 

fedic
Offline
Зарегистрирован: 01.03.2021

Я тоже думал так, т.е. препроцессор согласно директивам глобального поиска

#include <EEPROM.h>

#include <radio.h>

#include <RDA5807M.h>
 
берет их из ардуиновских папок, с другой стороны ну и заключили бы их в кавычки для локального поиска. И если этого не сделано, то  я и решил что библиотеки одинаковы( хотя размеры разные)
mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Оставь в папке "...Arduino\libraries\" только нужные библиотеки и попробуй.

fedic
Offline
Зарегистрирован: 01.03.2021

т.е. переписать ардуиновские библиотеки  теми что из архива? так?

Ну наконец то скомпилилось!

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Да нет, же. В папке, где у тебя сохраняются скетчи, есть папка libraries. Вот в ней и нужно оставить только библиотеки из архива.

Ну вот и отлично!

geniv82
Offline
Зарегистрирован: 21.02.2019

fedic, попробуйте закоментировать строку rs = radio.getRSSI();

fedic
Offline
Зарегистрирован: 01.03.2021

ну я так и сделал, там в папке "...Arduino\libraries\" были установлены ардуиновские хидеры, ну я и их удалил и накатил из архива

Сейчас все прошло на ура! Только чем шить, у меня только JTAGICE mkII, а его в списке программаторов нет

Короче надо проект переносить в студию. Можно конечно через USBASP, но там драйвер JUNGO конфликтует с драйверами студии, которые без перестановки студии на место не встают. Короче все через одно место... А где в ардуине храниться скомпилированный код и можно ли его выгрузить в hex?

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

А ты не в Ардуино заливаешь? В чистую мегу?

fedic
Offline
Зарегистрирован: 01.03.2021

в ардуино заливаю, как и  раньше я JTAG-ом через переходник JTAG - ISP  превосходно Ардуинки прошивал, да еще и пошагово отлаживал на кристалле по debugWire (по одному проводу RST-reset это делается)

Хотел картинку отправить, но и тут костыли....

Ну наконец то!

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Теперь вопрос отпал... Нет USB-Serial

fedic
Offline
Зарегистрирован: 01.03.2021

Да, и все это из-за этого конфликта, говорят в новых версиях студии без таких костылей, но мне 4-я студия нужна

хотя драйвер CH341 (USB -SERIAL) драйвер стоит и работает, но все равно все упирается в этот конфликт