Не могу разобраться с многокнопочной рацией

xwep
Offline
Зарегистрирован: 20.01.2021

помогите с кодом! 

Иммется рация, хочу его руссифицировать произношение каналов и приветствия, 

переключатель на 16 каналов

при постановке на первый канал напряжение подается 3,5 В в следующей последовательности:

на 1 канале

0 1 1 0

на 2м канале

0 0 1 0

3 канал

1 0 0 1 

и т.д. ...

Звуковые файлы: 1.wav, 2.wav и т.д. 

написал код но я слабоват в программировании:

#include <SD.h>             // необходимо включить SD библиотеку
#include <TMRpcm.h>         // также необходимо включить данную библиотеку...
#include <SPI.h>
#define chipSelect 4
File root;
TMRpcm music;
 
int Pin = 5;
int Pin1 = 6;
int Pin2 = 7;
int Pin3 = 8;
 
void setup() {
//  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
//  music.volume(7);    //   от 0 до 7. Установка уровня громкости
//  music.quality(0);        //  1 для 2x передескритезации, 0 for для нормального режима
  music.play("s.wav");
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
  music.setVolume(7);    //   от 2 до 7. Установка уровня громкости
  music.quality(0);        //  1 для 2x передескритезации, 0 for для нормального режима 
}
 
 
 
 
void loop() {
  int volts = digitalRead(Pin);
Serial.println(volts);
int volts1 = digitalRead(Pin1);
Serial.println(volts1);
int volts2 = digitalRead(Pin2);
Serial.println(volts2);
int volts3 = digitalRead(Pin3);
Serial.println(volts3);
delay(1000);
{
{  
int k1 = (volts == 0 && volts1 > 0 && volts2 > 0 && volts3 == 0);
if (k1) {music.play("1.wav"); 
}}
int k2 = (volts == 0 && volts1 == 0 && volts2 > 0 && volts3 == 0);
while (k2) {music.play("2.wav"); break;}
int k3 = (volts > 0 && volts1 == 0 && volts2 == 0 && volts3 > 0);
while (k3) {music.play("3.wav"); break;}
int k4 = (volts == 0 && volts1 > 0 && volts2 == 0 && volts3 > 0);
int k5 = (volts > 0 && volts1 > 0 && volts2 == 0 && volts3 == 0);
int k6 = (volts > 0 && volts1 == 0 && volts2 == 0 && volts3 == 0);
int k7 = (volts == 0 && volts1 == 0 && volts2 > 0 && volts3 > 0);
int k8 = (volts == 0 && volts1 > 0 && volts2 > 0 && volts3 > 0);
int k9 = (volts > 0 && volts1 > 0 && volts2 > 0 && volts3 > 0);
int k10 =(volts > 0 && volts1 > 0 && volts2 > 0 && volts3 == 0);
int k11 =(volts == 0 && volts1 == 0 && volts2 == 0 && volts3 == 0);
int k12 =(volts == 0 && volts1 == 0 && volts2 == 0 && volts3 > 0);
int k13 =(volts > 0 && volts1 > 0 && volts2 == 0 && volts3 > 0);
int k14 =(volts == 0 && volts1 > 0 && volts2 == 0 && volts3 == 0);
int k15 =(volts > 0 && volts1 == 0 && volts2 > 0 && volts3 == 0);
int k16 =(volts > 0 && volts1 == 0 && volts2 > 0 && volts3 > 0);
delay(1000);
 
 
 
}
}
сейчас он говорит и повторяет канал, а нужно чтоб один раз сказал и все, и еще нужно чтоб он в то время когда говорил любой канал подавал напряжение на какую нибудь ножку для унч
чисто спортивный интерес, имеется ардуйно нано и сд
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А правила форума почитать не судьба?

xwep
Offline
Зарегистрирован: 20.01.2021

я тут новенький так что прошу сильно не пинать, только заметил ...

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

Ну, а если

xwep пишет:

заметил

так почему не перевыложил?

xwep
Offline
Зарегистрирован: 20.01.2021

помогите с кодом! 

Иммется рация, хочу его руссифицировать произношение каналов и приветствия, 

переключатель на 16 каналов

при постановке на первый канал напряжение подается 3,5 В в следующей последовательности:

на 1 канале

0 1 1 0

на 2м канале

0 0 1 0

3 канал

1 0 0 1 

и т.д. ...

Звуковые файлы: 1.wav, 2.wav и т.д. 

написал код но я слабоват в программировании:

#include <SD.h>             // необходимо включить SD библиотеку
#include <TMRpcm.h>         // также необходимо включить данную библиотеку...
#include <SPI.h>
#define chipSelect 4
File root;
TMRpcm music;
 
int Pin = 5;
int Pin1 = 6;
int Pin2 = 7;
int Pin3 = 8;
 
void setup() {
//  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
//  music.volume(7);    //   от 0 до 7. Установка уровня громкости
//  music.quality(0);        //  1 для 2x передескритезации, 0 for для нормального режима
  music.play("s.wav");
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
  music.setVolume(7);    //   от 2 до 7. Установка уровня громкости
  music.quality(0);        //  1 для 2x передескритезации, 0 for для нормального режима 
}
 
 
 
 
void loop() {
  int volts = digitalRead(Pin);
Serial.println(volts);
int volts1 = digitalRead(Pin1);
Serial.println(volts1);
int volts2 = digitalRead(Pin2);
Serial.println(volts2);
int volts3 = digitalRead(Pin3);
Serial.println(volts3);
delay(1000);
{
{  
int k1 = (volts == 0 && volts1 > 0 && volts2 > 0 && volts3 == 0);
if (k1) {music.play("1.wav"); 
}}
int k2 = (volts == 0 && volts1 == 0 && volts2 > 0 && volts3 == 0);
while (k2) {music.play("2.wav"); break;}
int k3 = (volts > 0 && volts1 == 0 && volts2 == 0 && volts3 > 0);
while (k3) {music.play("3.wav"); break;}
int k4 = (volts == 0 && volts1 > 0 && volts2 == 0 && volts3 > 0);
int k5 = (volts > 0 && volts1 > 0 && volts2 == 0 && volts3 == 0);
int k6 = (volts > 0 && volts1 == 0 && volts2 == 0 && volts3 == 0);
int k7 = (volts == 0 && volts1 == 0 && volts2 > 0 && volts3 > 0);
int k8 = (volts == 0 && volts1 > 0 && volts2 > 0 && volts3 > 0);
int k9 = (volts > 0 && volts1 > 0 && volts2 > 0 && volts3 > 0);
int k10 =(volts > 0 && volts1 > 0 && volts2 > 0 && volts3 == 0);
int k11 =(volts == 0 && volts1 == 0 && volts2 == 0 && volts3 == 0);
int k12 =(volts == 0 && volts1 == 0 && volts2 == 0 && volts3 > 0);
int k13 =(volts > 0 && volts1 > 0 && volts2 == 0 && volts3 > 0);
int k14 =(volts == 0 && volts1 > 0 && volts2 == 0 && volts3 == 0);
int k15 =(volts > 0 && volts1 == 0 && volts2 > 0 && volts3 == 0);
int k16 =(volts > 0 && volts1 == 0 && volts2 > 0 && volts3 > 0);
delay(1000);
 
 
 
}
}
сейчас он говорит и повторяет канал, а нужно чтоб один раз сказал и все, и еще нужно чтоб он в то время когда говорил любой канал подавал напряжение на какую нибудь ножку для унч
чисто спортивный интерес, имеется ардуйно нано и сд
brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014
#include <SD.h>             // необходимо включить SD библиотеку
#include <TMRpcm.h>         // также необходимо включить данную библиотеку...
#include <SPI.h>
#define chipSelect 4
File root;
TMRpcm music;
 
const uint8_t inPins[]={8,7,6,5}; 
const uint8_t outPin=10; // на этой ножке появляется единичка при запуске файла на проигрывание
 
void setup() {
  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
  music.volume(7);    //   от 0 до 7. Установка уровня громкости
  music.quality(0);        //  1 для 2x передескритезации, 0 for для нормального режима
  music.play("s.wav");
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
  music.setVolume(7);    //   от 2 до 7. Установка уровня громкости
  music.quality(0);        //  1 для 2x передескритезации, 0 for для нормального режима 
  for(uint8_t i=0; i<sizeof(inPins);i++){
     pinMode(inPins[i],INPUT);  
  }
  pinMode(outPin,OUTPUT);
  digitalWrite(outPin,LOW);
  Serial.println("initialization done.");
}
 
void loop() {
    static uint8_t old=0xFF;
    static uint32_t timer=0;
    uint8_t in=0;
    for(uint8_t i=0; i<sizeof(inPins);i++){
       in<<=1;
       if(digitalRead(inPins[i])==HIGH){
         in|=1;
       }
    }
    
    if(in!=old){
       digitalWrite(outPin,HIGH);
       char buf[10]={0};
       sprintf(buf, "%d.wav", in+1);
       music.play(buf);
       old=in;  
       timer=millis();
    }

    if(digitalRead(outPin)==HIGH){
       if(millis()-timer>2000){
          digitalWrite(outPin,LOW); 
       }
    }
}

 

xwep
Offline
Зарегистрирован: 20.01.2021

спасибо большое, но каналы не правильно читает ...(((

xwep
Offline
Зарегистрирован: 20.01.2021
int k1 = (volts == 0 && volts1 > 0 && volts2 > 0 && volts3 == 0);
int k2 = (volts == 0 && volts1 == 0 && volts2 > 0 && volts3 == 0);
int k3 = (volts > 0 && volts1 == 0 && volts2 == 0 && volts3 > 0);
int k4 = (volts == 0 && volts1 > 0 && volts2 == 0 && volts3 > 0);
int k5 = (volts > 0 && volts1 > 0 && volts2 == 0 && volts3 == 0);
int k6 = (volts > 0 && volts1 == 0 && volts2 == 0 && volts3 == 0);
int k7 = (volts == 0 && volts1 == 0 && volts2 > 0 && volts3 > 0);
int k8 = (volts == 0 && volts1 > 0 && volts2 > 0 && volts3 > 0);
int k9 = (volts > 0 && volts1 > 0 && volts2 > 0 && volts3 > 0);
int k10 =(volts > 0 && volts1 > 0 && volts2 > 0 && volts3 == 0);
int k11 =(volts == 0 && volts1 == 0 && volts2 == 0 && volts3 == 0);
int k12 =(volts == 0 && volts1 == 0 && volts2 == 0 && volts3 > 0);
int k13 =(volts > 0 && volts1 > 0 && volts2 == 0 && volts3 > 0);
int k14 =(volts == 0 && volts1 > 0 && volts2 == 0 && volts3 == 0);
int k15 =(volts > 0 && volts1 == 0 && volts2 > 0 && volts3 == 0);
int k16 =(volts > 0 && volts1 == 0 && volts2 > 0 && volts3 > 0);
brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну так переименуй файлы на SD как тебе надо. Или в "ищу исполнителя".

#include <SD.h>             // необходимо включить SD библиотеку
#include <TMRpcm.h>         // также необходимо включить данную библиотеку...
#include <SPI.h>
#define chipSelect 4
File root;
TMRpcm music;
 
const uint8_t inPins[]={8,7,6,5}; 
const uint8_t outPin=10; // на этой ножке появляется единичка при запуске файла на проигрывание
const uint8_t chan[]={11,6,14,5,2,16,1,10,12,3,4,13,7,16,8,9}; // таблица каналов
 
void setup() {
  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
  music.volume(7);    //   от 0 до 7. Установка уровня громкости
  music.quality(0);        //  1 для 2x передескритезации, 0 for для нормального режима
  music.play("s.wav");
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
  music.setVolume(7);    //   от 2 до 7. Установка уровня громкости
  music.quality(0);        //  1 для 2x передескритезации, 0 for для нормального режима 
  for(uint8_t i=0; i<sizeof(inPins);i++){
     pinMode(inPins[i],INPUT);  
  }
  pinMode(outPin,OUTPUT);
  digitalWrite(outPin,LOW);
  Serial.println("initialization done.");
}
 
void loop() {
    static uint8_t old=0xFF;
    static uint32_t timer=0;
    uint8_t in=0;
    for(uint8_t i=0; i<sizeof(inPins);i++){
       in<<=1;
       if(digitalRead(inPins[i])==HIGH){
         in|=1;
       }
    }
    
    if(in!=old){
       digitalWrite(outPin,HIGH);
       char buf[10]={0};
       sprintf(buf, "%d.wav", chan[in]);
       music.play(buf);
       old=in;  
       timer=millis();
    }

    if(digitalRead(outPin)==HIGH){
       if(millis()-timer>2000){
          digitalWrite(outPin,LOW); 
       }
    }
}

 

xwep
Offline
Зарегистрирован: 20.01.2021

спасибо большое, так и сделал ...

xwep
Offline
Зарегистрирован: 20.01.2021

взял fd mini player как перевести чтоб стабильно работал?

xwep
Offline
Зарегистрирован: 20.01.2021

взял модуль DFmini и ошибка выходит ... (invalid conversion from 'const char*' to 'uint16_t {aka unsigned int}' [-fpermissive])

что это значит?

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

xwep пишет:

что это значит?

Именно то, что написано: недопустимое преобразование из 'const char *' в 'uint16_t

xwep
Offline
Зарегистрирован: 20.01.2021

как исправить?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

 Сконвертить из текстового представления в цифровое.

xwep
Offline
Зарегистрирован: 20.01.2021

не получается ни в какую, новичок)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Новичек, тогда учись. Я тебе и так много чем помог. Решение твоего второго вопроса элементарно и вообще не интересно, никак....

xwep
Offline
Зарегистрирован: 20.01.2021

купил df mini, так как вольтаж маленький, а там встроенный усилок, записал голоса уже чище, + добавил голос "приветствия", названия каналов 0001,0002 и т.д., приветствие s.mp3, вот теперь не могу программу допилить ... 

xwep
Offline
Зарегистрирован: 20.01.2021

конечно, спасибо тебе за это! будем пробывать ...

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

xwep пишет:

купил df mini, так как вольтаж маленький, а там встроенный усилок, записал голоса уже чище, + добавил голос "приветствия", названия каналов 0001,0002 и т.д., приветствие s.mp3, вот теперь не могу программу допилить ... 

Бывает, нужно работать над собой ;)

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

xwep пишет:

 пробывать ...

Тут явно буква пропущена

xwep
Offline
Зарегистрирован: 20.01.2021

я попытался написать свой, но Ваш лучше работал, может подскажете как Сконвертить из текстового представления в цифровое?

#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

const int inPins[]={8,7,6,5};
String chanel[16]={"0110","0010","1001","0101","1100","1000","0011","0111","1111","1110","0000","0001","1101","0100","1010","1011"};
void setup() {
  Serial.begin (9600); 
    // открываем порт для консоли
 mp3_set_serial (Serial);  //set Serial for DFPlayer-mini mp3 module 
 mp3_set_volume (30);    //устанавливаем уровень громкости
 for(int i=5; i<=8; i++)
    {
      pinMode(i,INPUT);
    }
    mp3_play(20); //приветствие ...
    delay(5000);
}
String old="";
bool hi=false;

void loop() { 
String signal="";
for(int i=5; i<=8; i++)
{
if(digitalRead(i))
signal+='1';
else
signal+='0';
}
Serial.print(signal);
Serial.println("|");

if(!signal.equals(old))
{
int ck;

for(int i=0; i<16; i++)
{
  if(signal.equals(chanel[i]))
  {
    ck=i;
    mp3_play(ck+1);
    Serial.println("True");
    
  }
}
old=signal;
}
  
}

 

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

xwep, тут ничего "конвертировать" не надо.  Вы сами себе проблемы создаете.

Нафига вы список каналов храните в текстовых строках :

String chanel[16]={"0110","0010","1001","0101","1100","1000","0011","0111","1111","1110","0000","0001","1101","0100","1010","1011"};

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

xwep
Offline
Зарегистрирован: 20.01.2021

чтобы этот код пел только в mp3 используя df player

#include <SD.h>             // необходимо включить SD библиотеку
#include <TMRpcm.h>         // также необходимо включить данную библиотеку...
#include <SPI.h>
#define chipSelect 4
File root;
TMRpcm music;
 
const uint8_t inPins[]={8,7,6,5}; 
const uint8_t outPin=10; // на этой ножке появляется единичка при запуске файла на проигрывание
const uint8_t chan[]={11,6,14,5,2,16,1,10,12,3,4,13,7,16,8,9}; // таблица каналов
 
void setup() {
  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
  music.volume(7);    //   от 0 до 7. Установка уровня громкости
  music.quality(0);        //  1 для 2x передескритезации, 0 for для нормального режима
  music.play("s.wav");
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
  music.setVolume(7);    //   от 2 до 7. Установка уровня громкости
  music.quality(0);        //  1 для 2x передескритезации, 0 for для нормального режима 
  for(uint8_t i=0; i<sizeof(inPins);i++){
     pinMode(inPins[i],INPUT);  
  }
  pinMode(outPin,OUTPUT);
  digitalWrite(outPin,LOW);
  Serial.println("initialization done.");
}
 
void loop() {
    static uint8_t old=0xFF;
    static uint32_t timer=0;
    uint8_t in=0;
    for(uint8_t i=0; i<sizeof(inPins);i++){
       in<<=1;
       if(digitalRead(inPins[i])==HIGH){
         in|=1;
       }
    }
    
    if(in!=old){
       digitalWrite(outPin,HIGH);
       char buf[10]={0};
       sprintf(buf, "%d.wav", chan[in]);
       music.play(buf);
       old=in;  
       timer=millis();
    }

    if(digitalRead(outPin)==HIGH){
       if(millis()-timer>2000){
          digitalWrite(outPin,LOW); 
       }
    }
}