43 подписчика
немного ардуино не повредит ..
управляем шлагбаумом.
со светодиодами непонятка, в мою эпоху автоматизации ещё не было, поэтому один моргает на столбе, второй на плате
светодиод будет один, потому как исторически достовернее :)
убрал delay, позорный он..... :)
#include <Servo.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <ServoSmooth.h>
// #define AMOUNT 4 // кол-во серво
// ServoSmooth servos[AMOUNT];
#define LEDPIN1 13
#define LEDPIN2 7
int shl_speed_delay = 40;
int down_pos = 70;
int up_pos = 110;
int pos = 88;
int secs = 0;
Servo myservo1;
// servos[0].attach(9);
// servos[0].setSpeed(180);
volatile bool train_on_flag = true; // занятие
bool shl_closed = false;
void setup()
{
myservo1.attach(9);
// pinMode(2, );
pinMode(LEDPIN1, OUTPUT);
pinMode(LEDPIN2, OUTPUT);
// инициализация Timer1
cli(); // отключить глобальные прерывания
TCCR3A = 0; // установить регистры в 0
TCCR3B = 0;
//OCR1A = 15624; // установка регистра совпадения
OCR3A = 7800;
TCCR3B |= (1 << WGM12); // включить CTC режим
TCCR3B |= (1 << CS10); // Установить биты на коэффициент деления 1024
TCCR3B |= (1 << CS12);
TIMSK3 |= (1 << OCIE1A); // выключить прерывание по совпадению таймера
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), train_on, CHANGE);
sei(); // включить глобальные прерывания
// Serial.begin(9600);
// init
train_on_flag = digitalRead(2);
if (train_on_flag==1) {
shl_dn();
// myservo1.write(down_pos);
}
else
{
shl_up();
//myservo1.write(up_pos);
}
}
void loop()
{
if (train_on_flag==1) {
if (shl_closed==0) {
if (secs==6) {
shl_dn();
secs=0;
}
}
}
else
{
if (shl_closed==1) {
shl_up();
}
}
} //loop
ISR(TIMER3_COMPA_vect)
{
secs++;
if (train_on_flag==1) {
digitalWrite(LEDPIN1, !digitalRead(LEDPIN1));
digitalWrite(LEDPIN2, !digitalRead(LEDPIN1));
}
else {
digitalWrite(LEDPIN2, 0);
digitalWrite(LEDPIN1, 0);
}
}
void train_on()
{
//train_on_flag = true;
train_on_flag = digitalRead(2);
secs=0;
}
void shl_up() {
//myservo1.write(100);
//servos[0].setTargetDeg(10);
// myservo1.writeMicroseconds(1500);
for (pos = down_pos; pos <= up_pos; pos++) {
//myservo1.writeMicroseconds(150);
myservo1.write(pos); //744
// Serial.println(pos);
delay(shl_speed_delay);
}
shl_closed=0;
}
void shl_dn() {
for (pos = up_pos; pos > down_pos; pos--) {
myservo1.write(pos); //619
// Serial.println(pos);
delay(shl_speed_delay);
}
//servos[0].setTargetDeg(190);
// myservo1.write(75);
shl_closed=1;
}
2 минуты
17 ноября 2022