Здравствуйте, появился вопрос. Хочу использовать библиотеку GyverTM1637 и пьезо пищалку в проекте. Но, вместе они не хотят работать, пьезо пищалка (пассивная) при использовании библиотеки начинает звенеть постоянно, на команды tone() или analogWrite() не реагирует вообще. Скорее всего, они используют один и тот же таймер, но мне не хватает знаний как заставить их работать, не мешая друг другу. Пробовал очень много способов, и подключал пищалку к аналоговым пинам, и к D10/D11, которые, вроде как, используют разные таймеры, все бесполезно.
C++:
#include <GyverTM1637.h>
#define BUZ 10
#define DIO 13
#define CLK 12
//убрал лишние строки, которые не влияют на проблему
GyverTM1637 disp(CLK, DIO);
byte numberSegments[10] = {
0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110,
0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111,
};
uint32_t Timer1;
uint32_t Timer2;
uint32_t Timer3;
void setup() {
pinMode(BUZ, OUTPUT);
Serial.begin(9600);
disp.brightness(7); // яркость, 0 - 7 (минимум - максимум)
}
void workMode() {
disp.clear();
static int a, b, c, d;
bool flag = 1;
disp.point(flag);
disp.displayByte(numberSegments[a], numberSegments[b], numberSegments[c], numberSegments[d]);
Timer1 = millis(); // сброс таймера
Timer2 = millis(); // сброс таймера
while(1){
if (!digitalRead(SWCH)) {
relaxMode();
}
if(millis() - Timer2 >= 500) {
flag = !flag;
disp.point(flag);
Timer2 = millis(); // сброс таймера
}
if (millis() - Timer1 >= 60000) { // ищем разницу (1 мин)
d++;
if(d == 10){d = 0; c++;}
if(c == 6) {c = 0; b++;}
if(b == 10){b = 0; a++;}
if(a == 6) {a = 0;}
Timer1 = millis(); // сброс таймера
break;
}
}
if(d == 1) {
disp.displayByte(numberSegments[a], numberSegments[b], numberSegments[c], numberSegments[d]);
for(int i = 0; i <= 10; i++){
tone(BUZ, 800);
digitalWrite(RED, 1);
Timer3 = millis(); // сброс таймера
while(1){
if (!digitalRead(POW)) {
relaxMode();
}
if(millis() - Timer3 >= 1000) {
noTone(BUZ);
Timer3 = millis(); // сброс таймера
break;
}
}
}
}
workMode();
}
void relaxMode() {
digitalWrite(RED, 0);
disp.displayByte(_0, _0, _0, _0);
noTone(BUZ);
relaxMode();
}
void loop() {
workMode();
}