93 lines
2.8 KiB
C
93 lines
2.8 KiB
C
#include <Wire.h>
|
|
#define I2C_FREQ 100000UL
|
|
|
|
// Адрес устройства из задания 7
|
|
const int deviceAddress = 8;
|
|
|
|
// Регистры устройства
|
|
byte reg1 = 0;
|
|
byte reg2 = 0;
|
|
|
|
void setup() {
|
|
// Инициализация I2C
|
|
i2c_begin();
|
|
// Назначение функции-обработчика для приема данных по I2C
|
|
Wire.onReceive(receiveData);
|
|
|
|
// Настройка пинов для кнопок
|
|
pinMode(2, INPUT_PULLUP);
|
|
pinMode(3, INPUT_PULLUP);
|
|
pinMode(4, INPUT_PULLUP);
|
|
pinMode(5, INPUT_PULLUP);
|
|
pinMode(6, INPUT_PULLUP);
|
|
pinMode(7, INPUT_PULLUP);
|
|
}
|
|
|
|
void loop() {
|
|
// Обработка нажатий кнопок
|
|
if (digitalRead(2) == LOW) {
|
|
// Включить ШИМ
|
|
reg1 |= 0b00000001;
|
|
sendData();
|
|
} else if (digitalRead(3) == LOW) {
|
|
// Выключить ШИМ
|
|
reg1 &= 0b11111110;
|
|
sendData();
|
|
} else if (digitalRead(4) == LOW) {
|
|
// Увеличить частоту на 25%
|
|
reg1 |= 0b00000010;
|
|
sendData();
|
|
} else if (digitalRead(5) == LOW) {
|
|
// Уменьшить частоту на 20%
|
|
reg1 |= 0b00000100;
|
|
sendData();
|
|
} else if (digitalRead(6) == LOW) {
|
|
// Увеличить скважность
|
|
reg2 |= 0b00000001;
|
|
sendData();
|
|
} else if (digitalRead(7) == LOW) {
|
|
// Уменьшить скважность
|
|
reg2 &= 0b11111110;
|
|
sendData();
|
|
}
|
|
}
|
|
|
|
// Функция-обработчик для приема данных по I2C
|
|
void receiveData(int byteCount) {
|
|
while (Wire.available()) {
|
|
byte reg = Wire.read();
|
|
byte value = Wire.read();
|
|
// Запись значения в соответствующий регистр
|
|
if (reg == 1) {
|
|
reg1 = value;
|
|
// Включение ШИМ
|
|
if (bitRead(reg1, 0) == 1) {
|
|
analogWrite(9, 128);
|
|
} else {
|
|
analogWrite(9, 0);
|
|
}
|
|
// Изменение частоты ШИМ
|
|
if (bitRead(reg1, 1) == 1) {
|
|
analogWriteFrequency(9, 25000);
|
|
} else if (bitRead(reg1, 2) == 1) {
|
|
analogWriteFrequency(9, 8000);
|
|
}
|
|
} else if (reg == 2) {
|
|
reg2 = value;
|
|
// Изменение скважности ШИМ
|
|
int dutyCycle = map(reg2, 0, 255, 0, 1023);
|
|
analogWrite(9, dutyCycle);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Функция для отправки данных по I2C
|
|
void sendData() {
|
|
Wire.beginTransmission(deviceAddress);
|
|
// Отправка значений регистров
|
|
Wire.write(1);
|
|
Wire.write(reg1);
|
|
Wire.write(2);
|
|
Wire.write(reg2);
|
|
Wire.endTransmission();
|
|
} |