Ви не увійшли.
Я сделал. Оставлю на всякий. Может кто то доработает или кому нить пригодиться
#include <Servo.h>
Servo myServo;
int servoAngle = 0;
int posLevel = 10;
int maxAngle = 180;
int ledPin = 6;
int brightness = 0;
int change = 10;
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12;
const int pin_B = 11;
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;
int trig = 0;
void LightLeft(){
if((!encoder_B)&&(encoder_A_prev)){
if(encoder_A) {
if (brightness + change <= 255){
brightness += change;
if (brightness >=255){
brightness == 255;
}
}
}
else {
if (brightness - change >= 0){
brightness -= change;
if (brightness <0){
brightness ==0;
}
}
}
}
encoder_A_prev = encoder_B;
}
void LightRight(){
if((!encoder_A)&&(encoder_A_prev)){
if(encoder_B) {
if (brightness + change <= 255){
brightness += change;
if (brightness >=255){
brightness == 255;
}
}
}
else {
if (brightness - change >= 0){
brightness -= change;
if (brightness <0){
brightness ==0;
}
}
}
}
encoder_A_prev = encoder_A;
}
void setup() {
Serial.begin(9600);
myServo.attach(9);
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
pinMode(ledPin, OUTPUT);
analogWrite(ledPin, LOW);
currentTime = millis();
loopTime = currentTime;
}
void loop() {
currentTime = millis();
if (currentTime >= (loopTime + 5)) {
//Serial.println(trig);
encoder_A = digitalRead(pin_A);
encoder_B = digitalRead(pin_B);
analogWrite(ledPin, brightness);
if(trig==0){
encoder_A = digitalRead(pin_A);
encoder_B = digitalRead(pin_B);
if((!encoder_A)&&(encoder_A_prev)){
if(encoder_B) {
if(servoAngle + posLevel <= maxAngle){
servoAngle += posLevel;
}
else{
trig = 1;
}
}
else {
if(servoAngle - posLevel >= 0){
servoAngle -= posLevel;
}
else{
trig = 2;
}
}
}
encoder_A_prev = encoder_A;}
if(trig==2){
if((!encoder_B)&&(encoder_A_prev)){
LightLeft();
Serial.println(brightness);
if (brightness < 1){
trig = 0;
brightness = 0;
}
}
encoder_A_prev = encoder_B;
}
if(trig==1){
if((!encoder_A)&&(encoder_A_prev)){
LightRight();
if (brightness < 1){
trig = 0;
brightness = 0;
}
}
encoder_A_prev = encoder_A;
}
myServo.write(servoAngle);
loopTime = currentTime;
}
}
Вот последнее что получилось. Все равно не работает.
#include <Servo.h>
Servo myServo;
int servoAngle = 0; //початкова позиція
int posLevel = 10; //значення зміни кута сервоприводу
int maxAngle = 180; //діапазон повертання (від 1 до 180)
int ledPin = 6;
int brightness = 0;
int change = 10;
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12;
const int pin_B = 11;
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;
void LightLeft(){
if((!encoder_B)&&(encoder_A_prev)){
if(encoder_A) {
if (brightness + change <= 255){
brightness += change;
if (brightness >=255){
brightness == 255;
}
}
}
else {
if (brightness - change >= 0){
brightness -= change;
if (brightness <0){
brightness ==0;
}
}
}
}
encoder_A_prev = encoder_B;
}
void LightRight(){
if((!encoder_A)&&(encoder_A_prev)){
if(encoder_B) {
if (brightness + change <= 255){
brightness += change;
if (brightness >=255){
brightness == 255;
}
}
}
else {
if (brightness - change >= 0){
brightness -= change;
if (brightness <0){
brightness ==0;
}
}
}
}
encoder_A_prev = encoder_A;
}
void setup() {
Serial.begin(9600);
myServo.attach(9);
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
pinMode(ledPin, OUTPUT);
analogWrite(ledPin, LOW);
currentTime = millis();
loopTime = currentTime;
}
void loop() {
currentTime = millis();
if (currentTime >= (loopTime + 5)) {
encoder_A = digitalRead(pin_A);
encoder_B = digitalRead(pin_B);
analogWrite(ledPin, brightness);
/*
if((!encoder_A)&&(encoder_A_prev)){
if(encoder_B) {
if(servoAngle + posLevel <= maxAngle) servoAngle += posLevel;
}
else {
if(servoAngle - posLevel >= 0) servoAngle -= posLevel;
}
}*/
bool trig = false;
if(!trig){
if((!encoder_B)&&(encoder_A_prev)){
LightLeft();
if (brightness <= 0){
trig = true;
brightness = 0;
}
}
encoder_A_prev = encoder_B;
}
else{
if((!encoder_A)&&(encoder_A_prev)){
LightRight();
if (brightness <= 0){
trig = false;
brightness = 0;
}
}
encoder_A_prev = encoder_A;
}
myServo.write(servoAngle);
loopTime = currentTime;
}
}
вот почти то что надо, но все равно - в обе стороны не понимаю как сделать. Вроде все должно быть элементарно, но никак не доходит
int brightness = 120; // яркость LED, начинаем с половины
int fadeAmount = 10; // шаг изменения яркости LED
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12; // pin 12
const int pin_B = 11; // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
void setup() {
// declare pin 9 to be an output:
pinMode(6, OUTPUT); // устанавливаем pin 9 как выход
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
currentTime = millis();
loopTime = currentTime;
}
void loop() {
currentTime = millis();
if(currentTime >= (loopTime + 5)){ // проверяем каждые 5мс (200 Гц)
encoder_A = digitalRead(pin_A); // считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); // считываем состояние выхода B энкодера
if((!encoder_A) && (encoder_A_prev)){ // если состояние изменилось с положительного к нулю
if(encoder_B) {
// выход В в полож. сост., значит вращение по часовой стрелке
// увеличиваем яркость, не более чем до 255
if(brightness + fadeAmount <= 255) brightness += fadeAmount;
}
else {
// выход В в 0 сост., значит вращение против часовой стрелки
// уменьшаем яркость, но не ниже 0
if(brightness - fadeAmount >= 0) brightness -= fadeAmount;
}
}
encoder_A_prev = encoder_A; // сохраняем значение А для следующего цикла
analogWrite(6, brightness); // устанавливаем яркость на 9 ножку
loopTime = currentTime;
}
}
разбейте свою задачу на три части
поворот сервы при вращении энкодера
изменение яркости при вращении энкодера
потом всё в кучу соедините
Никак не получается сделать светодиод в обе стороны. Просто туплю и все(
разбейте свою задачу на три части
поворот сервы при вращении энкодера
изменение яркости при вращении энкодера
потом всё в кучу соедините
Есть небольшое задание: сделать программу которая вращает сервопривод в ту сторону, в которую вращается ручка енкодера. И если достигнут предел вращения сервопривода - зажигать светодиод и продолжать усиливать его яркость до того момента, пока ручка енкодера не начнет вращаться в противоположную сторону. Тогда начать уменьшать яркость светодиода, и когда она дойдет до 0 - начать опять вращать сервопривод. И у меня это работает только в одну сторону. Как исправить?
#include <Servo.h>
Servo myServo;
int servoAngle = 0;
int posLevel = 10;
int maxAngle = 180;
int ledPin = 6;
int brightness = 0;
int change = 10;
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12;
const int pin_B = 11;
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev = 0;
void setup() {
Serial.begin(9600);
myServo.attach(9);
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
pinMode(ledPin, OUTPUT);
analogWrite(ledPin, LOW);
currentTime = millis();
loopTime = currentTime;
}
void loop() {
currentTime = millis();
if (currentTime >= (loopTime + 5)) {
encoder_A = digitalRead(pin_A);
encoder_B = digitalRead(pin_B);
analogWrite(ledPin, brightness);
if ((!encoder_A) && (encoder_A_prev)) {
if (encoder_B) {
if ((servoAngle + posLevel <= maxAngle) && (brightness <= 0)) {
servoAngle += posLevel;
} else {
if (encoder_B) {
if (brightness + change <= 255) brightness += change;
} else {
if (brightness - change >= 0) brightness -= change;
}
}
} else {
if ((servoAngle - posLevel >= 0)) {
if (brightness <= 0) {
servoAngle -= posLevel;
} else {
if (encoder_A) {
if (brightness + change <= 255) brightness += change;
} else {
if (brightness - change >= 0) brightness -= change;
}
}
}
}
}
encoder_A_prev = encoder_A;
myServo.write(servoAngle);
loopTime = currentTime;
}
}