Обмен данными через USB

denbon
Offline
Зарегистрирован: 02.02.2017

Всех приветствую!

Соорудил код как смог, понятно что он не идеальный, но дальше лучше. То есть задумка такая есть датчик света на BH1750 и в зависимости от освещения подается шим сигнал на драйвер светодиода и чтобы можно было добавлять уровень шим сигнала через Смартфон. Но все бы ничего, только этот шим сигнал при добавлении через терминал работает всего лишь на время которое задано в delay(). Почему так, не могу понять.

#include <Wire.h>

#include <BH1750.h>
 
BH1750 lightMeter;

int ledTftBrig;

int ledTftDriverPwm = 9; 

int pwm1 = 50;
int pwm2 = 130; 
int pwm3 = 220; 

int pwm1Sum;
int pwm2Sum;
int pwm3Sum;

void setup() {

pinMode(ledTftDriverPwm, OUTPUT); // объявляет 9 пин в качестве выхода:

Serial.begin(9600); /
lightMeter.begin();
lightMeter.setMTreg(254);
}

void loop() {
//считываем показания с BH1750:
uint32_t lux = lightMeter.readLightLevel(); //считываем показания с датчика

if (Serial.available() > 0){
  ledTftBrig = Serial.read(); //считываем значение с андроид приложения
  pwm1Sum = pwm1 + ledTftBrig;
  pwm2Sum = pwm2 + ledTftBrig;
  pwm3Sum = pwm3 + ledTftBrig;
}else{
  pwm1Sum = pwm1;
  pwm2Sum = pwm2;
  pwm3Sum = pwm3;
}

if (lux<=100) {        //если показания меньше или равно 100
  analogWrite(ledTftDriverPwm, pwm1Sum); 
 } 
if (lux>100 && lux<=1000) {        //если показания больше 100 и меньше или равно 1000
   analogWrite(ledTftDriverPwm, pwm2Sum);
 }
if (lux>1000) {        //если показания больше 1000
  analogWrite(ledTftDriverPwm, pwm3Sum);
 } 

delay(1000); 
}

 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

denbon пишет:

 только этот шим сигнал при добавлении через терминал работает всего лишь на время которое задано в delay(). Почему так, не могу понять.

Наверное потому, что в стр.37 всё сбрасывается, т.к. приложение шлёт данные один раз

denbon
Offline
Зарегистрирован: 02.02.2017

Дим-мычъ пишет:

denbon пишет:

 только этот шим сигнал при добавлении через терминал работает всего лишь на время которое задано в delay(). Почему так, не могу понять.

Наверное потому, что в стр.37 всё сбрасывается, т.к. приложение шлёт данные один раз

Да все верно, если убрать то шим работает, но если вводить разные значения в терминал, то сам уровень шим сигнала не меняется

}else{
  pwm1Sum = pwm1;
  pwm2Sum = pwm2;
  pwm3Sum = pwm3;
}

Мне не понятно почему не работает PWM через Serial, ввожу разные значения в терминал но ШИм не меняется, подскажите почему так

 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Выведите в терминал значение, полученное из приложения после 33 строки

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

denbon пишет:

 ввожу разные значения в терминал но ШИм не меняется, подскажите почему так

он меняется, только очень мало - ведь ты читаешь из Сериал только один символ. Ввел ты на смартфоне поправку "51", а в ардуине прочиталось только "1" - вот на этот"1" ШИМ и поменялся

denbon
Offline
Зарегистрирован: 02.02.2017

Дим-мычъ пишет:

Выведите в терминал значение, полученное из приложения после 33 строки

Ввожу например значение 100

В терминале получаю

01:08:56.596 -> 49
01:08:56.644 -> 48
01:08:56.690 -> 48

 

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

denbon пишет:

Ввожу например значение 100

В терминале получаю

01:08:56.596 -> 49
01:08:56.644 -> 48
01:08:56.690 -> 48

 

все верно, это и есть '1' + '0' + '0'

У тебя со смарта передается не число, а символы

denbon
Offline
Зарегистрирован: 02.02.2017

b707 пишет:

denbon пишет:

Ввожу например значение 100

В терминале получаю

01:08:56.596 -> 49
01:08:56.644 -> 48
01:08:56.690 -> 48

 

все верно, это и есть '1' + '0' + '0'

У тебя со смарта передается не число, а символы

А как же тогда сделать чтобы это работало

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

denbon пишет:

А можно как то сделать в коде чтобы по serial приходило все то что отправляю

так оно ВСЕ приходит. Только не в том виде, что ты ждешь.

Тебе надо сначала принять всю строку - почитай про readString()

А потом преобразовать ее в число String.toIint(), если не путаю