Ви не увійшли.
Давайте я вам бесплатно отправлю ethernet shield для опытов?
Очень странно стало вести себя, после включения первая задержка где-то 3 минуты, потом 10 секунд пауза и снова включилось на долго но я уже не стал засекать время.
Возможно, нашел косяк, попробуйте убрать в самом начале loop строку state = digitalRead(8);
Проверил. Да действительно работает.
ard125 пише:пробуйте так
Но к сожалению задержки не работают, реле включается и выключается без задержек.
У меня нет пока eternet-модуля, поэтому проверить полностью код не могу, возможно где-то есть ошибка. Но от обычной кнопки в простеньком коде у меня все работает.
unsigned long previousMillis = 0;
unsigned long currentMillis;
boolean flag1, flag2, flag3, flag4, flag5;
bool flag_btn1, flag_btn2 = false;
bool state = false;
bool ledstate;
unsigned long t1 = 8000;
unsigned long t2 = 5000;
unsigned long t3 = 10000;
unsigned long t4 = 18000;
void setup() {
pinMode(5, INPUT_PULLUP);
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
Serial.begin(9600);
}
void blinker() {
ledstate = digitalRead(8);
if (!flag1 && (millis() - previousMillis >= t1)) {
digitalWrite(8, !ledstate);
flag1 = 1;
flag2 = 0;
previousMillis = millis();
}
if (!flag2 && (millis() - previousMillis >= t2)) {
digitalWrite(8, !ledstate);
flag2 = 1;
flag3 = 0;
previousMillis = millis();
}
if (!flag3 && (millis() - previousMillis >= t1)) {
digitalWrite(8, !ledstate);
flag3 = 1;
flag4 = 0;
previousMillis = millis();
}
if (!flag4 && (millis() - previousMillis >= t3)) {
digitalWrite(8, !ledstate);
flag4 = 1;
flag5 = 0;
previousMillis = millis();
}
if (!flag5 && (millis() - previousMillis >= t4)) {
digitalWrite(8, !ledstate);
flag5 = 1; state = false;
previousMillis = millis(); Serial.println("Stop ");
}
}
void loop() {
if (digitalRead(5) == LOW && !flag_btn1) {
Serial.println("Start ");
state = true;
flag_btn1 = 1;
flag1 = 0; previousMillis = millis();digitalWrite(8, LOW);
}
if (state == true) {
blinker();
}
if (digitalRead(5) && flag_btn1) flag_btn1 = 0;
if (!state) {
flag1 = 1;
flag2 = 1;
flag3 = 1;
flag4 = 1;
flag5 = 1;
}
}
кнопка подключена к 5 пину. Замыкается на землю.
Судя по всему, когда выполняется delay(), весь остальной код просто останавливается и ждет возврата из функции, которая вызвала delay(). Чтобы blinker() работал, как ожидается, вся программа должна быть переписана в виде обработчиков асинхронных прерываний, тогда delay() может быть прерван в любой момент.
Вместо этого предлагается управлять светодиодом, синхронизировав его с часами, которые идут независимо от delay(). Таким образом каждый раз loop() будет иметь возможность оценить значение таймера и принять решение, как переключить светодиод. Например, если таймер меньше значения X, то светодиод зажечь. Если больше - погасить. Подробнее:
https://www.arduino.cc/en/Tutorial/Buil … thoutDelay
Для воспроизведения более сложной последовательности можно запомнить время начала этой последовательности, а затем зажигать или гасить светодиод по прошествии определенного времени относительно начала. При этом сам код переключения светодиода должен выполняться при каждом цикле loop():
Извините, никогда не писал для Ардуино, но идею, надеюсь, передать удалось.
Я много чего понимаю, но написать сом не в состоянии.
пробуйте так
С ума сойти, вы проделали такую титаническую работу. Но к сожалению задержки не работают, реле включается и выключается без задержек.
пробуйте так
#include <SPI.h>
#include <Ethernet.h>
boolean newInfo = 0;
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };
IPAddress ip(192, 168, 4, 70);
byte gateway[] = { 192, 168, 4, 1 };
byte subnet[] = { 255, 255, 255, 0 };
EthernetServer server(80);
unsigned long previousMillis = 0;
unsigned long currentMillis;
boolean flag1, flag2, flag3, flag4, flag5;
bool state = false;
bool ledstate;
unsigned long t1 = 8000;
unsigned long t2 = 5000;
unsigned long t3 = 10000;
unsigned long t4 = 18000;
void setup()
{
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
}
void blinker() {
ledstate=digitalRead(8);
if (!flag1 && (millis() - previousMillis >= t1)) {
digitalWrite(8, !ledstate);
flag1 = 1;
flag2 = 0;
previousMillis = millis();
}
if (!flag2 && (millis() - previousMillis >= t2)) {
digitalWrite(8, !ledstate);
flag2 = 1;
flag3 = 0;
previousMillis = millis();
}
if (!flag3 && (millis() - previousMillis >= t1)) {
digitalWrite(8, !ledstate);
flag3 = 1;
flag4 = 0;
previousMillis = millis();
}
if (!flag4 && (millis() - previousMillis >= t3)) {
digitalWrite(8, !ledstate);
flag4 = 1;
flag5 = 0;
previousMillis = millis();
}
if (!flag5 && (millis() - previousMillis >= t4)) {
digitalWrite(8, !ledstate);
flag5 = 1;
previousMillis = millis();
}
}
void loop()
{
state = digitalRead(8);
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (newInfo && c == ' ') {
newInfo = 0;
}
if (c == '$') {
newInfo = 1;
}
if (newInfo == 1) {
Serial.println(c);
if (c == '1') {
state = true;
flag1 = 0;
digitalWrite(8, LOW);
previousMillis = millis();
Serial.println("ON");
}
if (c == '2') {
Serial.println("OFF");
digitalWrite(8, HIGH);
state = false;
}
}
if (state == true) {
blinker();
}
if (!state) {
flag1 = 1;
flag2 = 1;
flag3 = 1;
flag4 = 1;
flag5 = 1;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 30");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("<title>Alarm</title>");
client.print("<H1>Block 1</H1>");
client.print("<a href=\"/$1\"><button>On</button></a>");
client.print("<a href=\"/$2\"><button>Off</button></a>");
client.println("<br />");
client.println("</html>");
break;
}
}
}
delay(1);
client.stop();
}
}
Судя по всему, когда выполняется delay(), весь остальной код просто останавливается и ждет возврата из функции, которая вызвала delay(). Чтобы blinker() работал, как ожидается, вся программа должна быть переписана в виде обработчиков асинхронных прерываний, тогда delay() может быть прерван в любой момент.
Вместо этого предлагается управлять светодиодом, синхронизировав его с часами, которые идут независимо от delay(). Таким образом каждый раз loop() будет иметь возможность оценить значение таймера и принять решение, как переключить светодиод. Например, если таймер меньше значения X, то светодиод зажечь. Если больше - погасить. Подробнее:
https://www.arduino.cc/en/Tutorial/Buil … thoutDelay
Для воспроизведения более сложной последовательности можно запомнить время начала этой последовательности, а затем зажигать или гасить светодиод по прошествии определенного времени относительно начала. При этом сам код переключения светодиода должен выполняться при каждом цикле loop():
#define BLINKER_NOTIME -1
void()
{
unsigned long currentms = millis();
long long blinkerstartms;
// ... some blinker related event happened ...
switch (event) {
case BLINKER_ON_EVT:
// engage the blinker()
blinkerstartms = currentms;
break;
case BLINKER_OFF_EVT:
blinkerstartms = BLINKER_NOTIME;
break;
default:
// nothing to do
}
if (blinkerstartms != BLINKER_NOTIME)
blinkerstartms = blinker(blinkerstartms, currentms);
}
long long
blinker(unsigned long startms, currentms)
{
// defined as offsets cumulative 0 + 8000 + 5000 + 8000 + 10000 + 18000
unsigned int blinkms[] = {0, 8000, 13000, 21000, 31000, 49000};
if (startms < 0)
return BLINKER_NOTIME;
// invert the blinker every time it reaches the next blinkms value
for (i = 0; i < sizeof(blinkms)/sizeof(blinkms[0]); i++) {
// TODO: handle the timer overflows
if (blinkms[i] >= startms - currentms) {
digitalWrite(LED_ADDR, i % 2 ? LOW : HIGH);
return startms;
}
// we're done with the blinkms[] array - shut the blinker down
return BLINKER_NOTIME;
}
Извините, никогда не писал для Ардуино, но идею, надеюсь, передать удалось.
UW5EGA пише:Все равно не понимаю как это все написать. Нужен букварь.
Странно, сервер подняли, кнопочки к нему прикрутили, а элементарные if-ы написать не можете?
Так это украдено на просторах интернета из разных статей.
delay(180000) большая пауза, смотрите, пример BlinkWithoutDelay
Смотрел. В самом начале на него ссылка есть.
delay(180000) большая пауза, смотрите, пример BlinkWithoutDelay
Все равно не понимаю как это все написать. Нужен букварь.
if((flag==1)&&(millis-prevmillis>=period) {дальше по тексту}
Все равно не понимаю как это все написать. Нужен букварь.
Странно, сервер подняли, кнопочки к нему прикрутили, а элементарные if-ы написать не можете?
Все равно не понимаю как это все написать. Нужен букварь.
Если в общих чертах ,то вводите дополнительную переменную (флаг), устанавливаете ее в какое-то значение и дальше:
если (флаг разрешен) то if currentmillis-prevmillis>=interval выполняете то что вам нужно