Вопрос о сервоприводе, включая дисплей последовательного монитора
Я попытался написать код, следуя вашим инструкциям о мельницах
,
и это выглядит так. К сожалению, это не работает. Проблема с моим кодом?
Вот мой код:
#include <LiquidCrystal.h>
#include<Servo.h>
Servo myservo; // создаем сервообъект для управления сервоприводом
// Эти константы не изменятся. Они используются для присвоения имен используемым контактам:
const int analogInPin1 = A0; // Контакт аналогового входа, к которому подключен фотодатчик
const int analogInPin2 = A1; // Контакт аналогового входа, к которому подключен фотодатчик
const int analogInPin3 = A2; // Контакт аналогового входа, к которому подключен фотодатчик
const int analogInPin4 = A3; // Контакт аналогового входа, к которому подключен фотодатчик
int sensorValue1;
int sensorValue2;
int sensorValue3;
int sensorValue4;
unsigned long m;
//объявить счетчик как вход
int Chactr =0;
int Disctr =0;
byte state;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
myservo.attach(9); // присоединяем сервопривод к контакту 9 к объекту сервопривода
myservo.write(0); // вернуться к 0 градусов.
delay(1000); // ждем секунду.
pinMode(13, OUTPUT); // инициализируем цифровой контакт 13 как выход.
Serial.begin(9600); // инициализируем последовательную связь на скорости 9600 бит/с:
lcd.begin(16,2);
delay(5000);
}
void loop() {
// читаем аналог в значении:
sensorValue1 = analogRead(analogInPin1);
sensorValue2 = analogRead(analogInPin2);
sensorValue3 = analogRead(analogInPin3);
sensorValue4 = analogRead(analogInPin4);
delay(3000);
// вывод результатов в Serial Monitor:
Serial.print("sensor1 = ");
Serial.print(sensorValue1);
Serial.print("\n");
Serial.print("sensor2 = ");
Serial.print(sensorValue2);
Serial.print("\n");
Serial.print("sensor3 = ");
Serial.print(sensorValue3);
Serial.print("\n");
Serial.print("sensor4 = ");
Serial.print(sensorValue4);
Serial.print("\n");
Serial.print("Led State: ");
Serial.println(state);
Serial.print("\n");
if (sensorValue1 >=569 && sensorValue2 >=520 && sensorValue3 >=419 && sensorValue4 >=250)
{
m=(millis()+60000);
}
if(sensorValue1 <=568 && sensorValue2 <=519 &&sensorValue3 <=418 && sensorValue4 <=249)
{
m=0;
}
if (sensorValue1 >=569 && sensorValue2 >=520 && sensorValue3 >=419 && sensorValue4 >=250 && m==millis())
{
state=1;
delay(5000);
digitalWrite(13, LOW); // выключаем светодиод, понижая напряжение
delay(5000); // ждем секунду
myservo.attach (9);
myservo.write(30);
delay(3000);
myservo.write(0);
delay(3000);
myservo.detach ();
delay (1000);
Disctr = Disctr + 1;
delay(900);
Serial.print("Battery Full: Discharge ON");
Serial.print("\n");
}
else if (sensorValue1 ==0 && sensorValue2 ==0 && sensorValue3 ==0 && sensorValue4 ==0 )
{
m=(millis()+60000);
}
if(sensorValue1 >=1 && sensorValue2 >=1 && sensorValue3 >=1 && sensorValue4 >=1)
{
m=0;
}
if(sensorValue1 ==0 && sensorValue2 ==0 && sensorValue3 ==0 && sensorValue4 ==0 && m==millis())
{
state=0;
delay(5000);
digitalWrite(13, HIGH ); // включаем светодиод, повышая напряжение
delay(5000); // ждем секунду
Chactr = Chactr + 1;
delay(900);
Serial.print("Battery Empty: Charging ON");
Serial.print("\n");
}
{
lcd.setCursor(0,0);
lcd.print("Charge Cycle: ");
lcd.setCursor(13,0);
lcd.print(Chactr);
lcd.setCursor(0,1);
lcd.print("Discha Cycle: ");
lcd.setCursor(13,1);
lcd.print(Disctr);
delay(1000);
}
}
@lonelyboy, 👍0
Обсуждение1 ответ
Итак, что вы хотите сделать, так это иметь возможность активировать сервопривод, когда в течение одной минуты появляются 4 зеленые полосы, правильно?
Я думаю, вам нужно будет создать три оператора if и одну новую переменную. Первым оператором if будет, если он обнаружит четыре зеленые полосы, тогда m=(millis() + 60000)
. Затем вам нужно будет вложить сюда еще один оператор if, чтобы сказать, что если он обнаруживает ТОЛЬКО три полосы, то m = 0
.
Ваше третье утверждение, если оно обнаруживает четыре зеленые полосы И m == millis()
, сервопривод активируется.
Я бы так и сделал, но у меня нет большого опыта. Я почти уверен, что у других будет более чистый и простой код, но это должно работать.
Спасибо за помощь. Но еще один вопрос. Даже если есть только три полоски, светодиодный датчик ckt все еще распознает 4-ю полоску, потому что 4-я полоска мигает, и сервопривод активируется. Светодиодный датчик ckt должен игнорировать мигающие полоски батареи, чтобы сервопривод не двигался. Сервопривод должен активироваться, как только 4 полоски появятся устойчиво и перестанут мигать. Есть идеи? Спасибо., @lonelyboy
Я так понимаю, что даже если всего три полоски, 4-я будет мигать. С точки зрения логики того, как этот код будет работать, он будет таким: Как только четвертый бар появится менее чем на секунду, m = miillis() + 60000. Затем он исчезнет и появятся только три бара. Затем это установит m = 0, и процесс будет повторяться, ДО ТОГО, как четвертый бар останется включенным. Когда четвертая полоска останется включенной, m больше не будет равно 0, а m будет миллис() + 600000. По мере того, как milis() продолжает увеличиваться до минуты (при которой m == millis()), сервопривод активируется., @Chris Do
У вас есть ошибка в этом коде ответа, если он выполняется после ролловера. Всегда обрабатывайте милли, используя вычитание, чтобы увидеть, как долго это было. Никогда не используйте сложение, чтобы попытаться предсказать время в будущем. Сохраните старую метку времени и сравните с ней., @Delta_G
- Нет функции сопоставления для вызова 'DS3231 (const uint8_t &, const uint8_t &)
- Реализовать два процесса одновременно
- Печать string and integer LCD
- Как отобразить символ º на ЖК-дисплее?
- Отправка значения с одного Arduino на другой
- Tower Pro MG996R сервопривод с высоким крутящим моментом 180 °, управляющий с помощью Arduino
- Черные квадраты дисплея Arduino 16x2
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
В чем конкретно проблема с вашим скетчем? Какой код вы написали до сих пор? Как выглядит ваша схема (схема)? Пожалуйста, предоставьте нам больше информации. Вы можете отредактировать свой вопрос для этого., @chrisl
Смысл использования millis состоит в том, чтобы избавиться от всех вызовов задержки. Вы не можете оставить ни одного из них. Пока эти вызовы задержки выполняются, ваш код millis не работает и все равно будет пропускать то, что вы хотите., @Delta_G