Вопрос о сервоприводе, включая дисплей последовательного монитора

Я попытался написать код, следуя вашим инструкциям о мельницах, и это выглядит так. К сожалению, это не работает. Проблема с моим кодом?

Вот мой код:

#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);
  }
}

, 👍0

Обсуждение

В чем конкретно проблема с вашим скетчем? Какой код вы написали до сих пор? Как выглядит ваша схема (схема)? Пожалуйста, предоставьте нам больше информации. Вы можете отредактировать свой вопрос для этого., @chrisl

Смысл использования millis состоит в том, чтобы избавиться от всех вызовов задержки. Вы не можете оставить ни одного из них. Пока эти вызовы задержки выполняются, ваш код millis не работает и все равно будет пропускать то, что вы хотите., @Delta_G


1 ответ


-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