-
Kris123t
-
-
Не в сети
-
Новый участник
-
- Сообщений: 4
- Спасибо получено: 1
-
Репутация: 0
-
|
Да в ШИМ нельзя писать в стартовой части, которая исполняется один раз, потом в таймерах - можно, но делай delay(2) между соседними записями если идут подряд или 2-3 арифметических команды между записями. У меня есть код который регулирует яркость шим по опросу кнопок + и - к примеру и управляет светом по нажатию на кнопку - короткое нажатие: вкл или выкл, длинное - перебирает варианты света по трем каналам. Осторожно, возможен быдлокод первая программа
// valdes[0] - промежуточное время удержания кнопки
// valdes[1] - итоговое время удержание кнопки
// valdes[2] - статус света:0 выкл весь, 1- вкл весь, 2,3,4- включено по одной паре, 5,6,7 - включено по 2 пары
// valdes[3] - уровень PWM
static os_timer_t esp_timer1; //Объявляем первый таймер, он гоняет цикл опроса кнопки каждые 100 млс
static os_timer_t esp_timer2; //Объявляем второй таймер, он гоняет цикл опроса кнопок + - каждые 20 млс
int gpio = 5; //выносим номер клавиши gpio для удобства редактирования
int butplus = 13; // указываем номер кнопки + ШИМ
int butminus = 14; // указываем номер кнопки - ШИМ
int wmax = 190; // максимальная яркость ШИМ (от 0 до 255)
int x = 12; //сюда пишем номера gpio выходов на управление светом
int y = 4; //сюда пишем номера gpio выходов на управление светом
int z = 16; //сюда пишем номера gpio выходов на управление светом
read_buttom_pwm(){//функция читающая +- ШИМ
if(digitalRead(13) == 0 && valdes[3] < wmax){//если кнопка + нажата
valdes[3]++;
analogWrite(0,valdes[3]);
}
if(digitalRead(14) == 0 && valdes[3] >0){//если кнопка - нажата
valdes[3]--;
analogWrite(0,valdes[3]);
}
}
read_gpio(){//функция, читающая GPIO для света
if(digitalRead(gpio) == 0){//если кнопка нажата , то...
valdes[0]++;
}
if(digitalRead(gpio)==1 & valdes[0]>0) { //если кнопку только что отпустили
valdes[1]=valdes[0];
valdes[0]=0;
if(valdes[1] < 10) { //если нажатие короткое
if(valdes[2] == 0) { //если свет был выкл
digitalWrite(x,1);
digitalWrite(y,1);
digitalWrite(z,1);
valdes[2]=1;
}
else {
digitalWrite(x,0);
digitalWrite(y,0);
digitalWrite(z,0);
valdes[2]=0;
}
}
else{//если нажатие было длинным
if(valdes[2] == 6 ){
valdes[2]=7;
digitalWrite(x,1);
digitalWrite(y,0);
digitalWrite(z,1);
}
else{
if(valdes[2] == 5 ){
valdes[2]=6;
digitalWrite(x,0);
digitalWrite(y,1);
digitalWrite(z,1);
}
if(valdes[2] == 4 ){
valdes[2]=5;
digitalWrite(x,1);
digitalWrite(y,1);
digitalWrite(z,0);
}
if(valdes[2] == 3 ){
valdes[2]=4;
digitalWrite(x,0);
digitalWrite(y,0);
digitalWrite(z,1);
}
if(valdes[2] == 2 ){
valdes[2]=3;
digitalWrite(x,0);
digitalWrite(y,1);
digitalWrite(z,0);
}
if(valdes[2] == 0 || valdes[2] == 1 || valdes[2] == 7){
valdes[2]=2;
digitalWrite(x,1);
digitalWrite(y,0);
digitalWrite(z,0);
}
}
}
}
}
void ICACHE_FLASH_ATTR
startfunc(){//функция, запускаемая при старте модуля
valdes[0] =0; //сбрасываем счетчик времени нажатия кнопки
valdes[2] =0; //весь свет выключен, статус 0
digitalWrite(x,0);
digitalWrite(y,0);
digitalWrite(z,0);
valdes[3] = 0; // яркость ШИМ ноль
// analogWrite(0,valdes[3]);
// PWM_ALL_SET(0,valdes[3],0);
os_timer_disarm(&esp_timer1); //выключаем первый таймер, если включен(он тоже не включен, ну а вдруг?)
os_timer_setfn(&esp_timer1, (os_timer_func_t *) read_gpio, NULL); //говорим, что при каждом тике надо вызвать read_gpio()
os_timer_arm(&esp_timer1, 100, 1); //включаем таймер, говорим, что тик должен происходить каждые 100мс
os_timer_disarm(&esp_timer2); //выключаем второй таймер
os_timer_setfn(&esp_timer2, (os_timer_func_t *) read_buttom_pwm, NULL); //говорим, что при каждом тике надо вызвать read_buttom_pwm()
os_timer_arm(&esp_timer2, 20, 1); //включаем таймер, говорим, что тик должен происходить каждые 50млс
}
void ICACHE_FLASH_ATTR
timerfunc(uint32_t timersrc) {
// выполнение кода каждую 1 секунду
if(timersrc==5){
// os_timer_arm(&esp_timer2, 50, 1); //включаем таймер, говорим, что тик должен происходить каждые 50млс
}
if(timersrc%30==0){
// выполнение кода каждые 30 секунд
}
}
void webfunc(char *pbuf) {
os_sprintf(HTTPBUFF,"<p>GPIO%d работает код конструктора ", valdes[3]); //выводим на страницу сообщение, что скрипт активен, и заодно показываем номер GPIO
}
|