Снова вопросы

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

Судя по тому, что ему тут насоветовали ...

неправильно помогаем? :) Научи как надо

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:
что будет после "прототипа"

И в чём вопрос? Открываем систему ГОСТ'ов СРПП и смотрим ... после прототипа будет экспериментальный образец, потом опытный образец ... в общем, там всё написано.

sadman41 пишет:
вопрос на мильен.
Думаю, что на больше.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

Судя по тому, что ему тут насоветовали ...

неправильно помогаем? :) Научи как надо

Летят гуси, готовь мешки, хозяин...
а классика жанра  = клиент - расберрипи

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

sadman41 пишет:
что будет после "прототипа"

И в чём вопрос?


Вопрос больше философский - успеет ли дело дойти до экспериментального образца или прототип пойдет в продакшн, а потом за разработчиком будет главный энергетик с рессорой гоняться.

MaksVV
Offline
Зарегистрирован: 06.08.2015

чето вы тут жути нагоняете. 0 и 1 по езернету погонять немного. Че уж тут такого космического. Думаю подъемная задача для новичка. 

imp
Offline
Зарегистрирован: 20.06.2020

UW5EGA пишет:
...но мне нужно показать рабочий прототип и тогда у меня будет время на изучение stm32 и разводку собственной платы.
Возьми raspberry pi или orange pi поставь на нее Апачь, и напиши простейший сайт. Останется написать элементарный "ногодрыг". Получиться дешевле чем будет стоить то время которое ты потратишь разбираясь в тонкостях ардуино. Единственное но, если захочешь использовать такое в продакшене, позаботься о том что-бы операционная система "жила" на виртуальном диске. (При включении в ОЗУ выделить местечко и скопировать туда. Иначе затрахаешся со сбоями флеш-карты.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Если ТС интересно мое мнение, то (не зря же я вопрос задал!) нужны скрипты для web. Или на PHP или других языках программирования с выхлопом в web интерфейс. По сути сервер с главной формой по тому же http обращается к устройствам, они генерируют код либо выполняют действия в зависимости от запросов (генерируя ответ). 
Судя по тому, что html/css код ТС знакомая подготовила, он не знает что такое GET/POST запросы и другие элементы web’а. Без этих знаний можно долго и упорно на разных форумах клянчить код, но без понимания общего даже куски кода склеить не получится. Тут два варианта - быстро и просто это купить код в платном разделе (не дёшево думаю), второй - учиться, взять в рабство знакомую и через 3-5 лет все получится. :) Может и раньше, если её хорошо кормить и одевать. )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

imp пишет:

UW5EGA пишет:
...но мне нужно показать рабочий прототип и тогда у меня будет время на изучение stm32 и разводку собственной платы.
Возьми raspberry pi или orange pi поставь на нее Апачь, и напиши простейший сайт. Останется написать элементарный "ногодрыг". Получиться дешевле чем будет стоить то время которое ты потратишь разбираясь в тонкостях ардуино. Единственное но, если захочешь использовать такое в продакшене, позаботься о том что-бы операционная система "жила" на виртуальном диске. (При включении в ОЗУ выделить местечко и скопировать туда. Иначе затрахаешся со сбоями флеш-карты.

ну не знаю насчёт флэшки, на TP-LINK живет более 5 лет, проблем не было, там правда OpenWRT

Да! и никаких апачей - lighthttpd

imp
Offline
Зарегистрирован: 20.06.2020

ua6em пишет:
...ну не знаю насчёт флэшки, на TP-LINK живет более 5 лет, проблем не было, там правда OpenWRT

Да! и никаких апачей - lighthttpd

Там дело не в исчерпании ресурса флешки, проблема в сбоях по сети, если сбой происходит в момент чтения/записи, то на флешке с большой вероятностью портятся данные.

Апачь не стоит выбрасывать по тому, что он существенно упростит создание сервера. Можно конечно пройти квест с настройкой nginx или вообще накорячить свои сокеты но какой в этом смысл (кроме увеличения трудоемкости)?

Хотя, конечно, если выбрать язык go то в нем сервер пишется в несколько строк, и работает все очень шустро, но там довольно специфичная логика создания приложений. В С++ будет сложено быстро разобраться в библиотеках, джава тормозная и дырявая, остается разве что экзотика в вилде питона...

А к апачу в принципе можно прикрутить почти любую консольную программу написанную на чем угодно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

совсем правильней видимо своего демона написать, а там где мало ресурсов лайтхттп + пхп, по крайней мере во всех мелких железках вэбморда на нём

Morroc
Offline
Зарегистрирован: 24.10.2016

Автор то по сути в пяти минутах от решения задачи и его способ тоже рабочий. С mqtt ковыряться первый раз можно и подольше, чем с http.

UW5EGA
Offline
Зарегистрирован: 16.09.2020

https://youtu.be/RtRZJ2DByxE

теперь можно спать

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

UW5EGA пишет:

https://youtu.be/RtRZJ2DByxE

теперь можно спать

кнопку на вэбке надо подсветить, когда реле срабатывает ...
 

UW5EGA
Offline
Зарегистрирован: 16.09.2020

Надо но на цветной странице.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

UW5EGA пишет:
Надо но на цветной странице.

ты сейчас повторил урок Димы Осиповы, так можно делать, но не нужно...

Хотя у такого решения много достоинств.
1. Простота
2. Можно выводить ряд параметров, вскрытие дизельной, температура, температура масла, давление, уровень топлива, напряжение генератора и т.д
3. Простая масштабируемость

Вопрос? У тебя дизеля оборудованы щитами автоматики и ты хочешь задублировать кнопки пуск и стоп на этих щитах дистанционно?

imp
Offline
Зарегистрирован: 20.06.2020

UW5EGA пишет:
Надо но на цветной странице.
Имелось в виду не внешний вид, а наличие обратной связи. В простейшем случае страница делает регулярные запросы к устройству (серверу) в которых тот отчитывается о своем состоянии. (У тебя может быть сбой в сети, и команда просто не дойдет или у тебя может быть не штатный перезапуск устройства. Оператор должен всегда знать реальное состояние устройства.) Кстати, ошибки запросов к устройству тоже должны отображаться.

Отображение проще всего организовать меняя класс для элемента интерфейса, тогда в соответствующем css файле ты легко сможешь задать внешний вид элемента во включенном/выключенном/ошибочном состоянии.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

У него сейчас сервер прямо на ардуине реализован

sadman41
Offline
Зарегистрирован: 19.10.2016

То, что он подал HIGH на пин и отрисовал лампочку - не говорит о том, что релюшка щёлкнула.

imp
Offline
Зарегистрирован: 20.06.2020

Тем более, что питание могло моргнуть, и даже щелкнувшая релюшка могла отключиться.

UW5EGA
Offline
Зарегистрирован: 16.09.2020
<html>
<head>
<title>jquery get post</title>
<script src="js/jquery-1.6.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){

$('#post_btn').click(function() {
    $.post('http://192.168.4.70/$2', {"url": '$2',},
        function(data){
            if (data.success) {
                $('#result').html(data.success.msg);
            } else {
                $('#result').html(data.error.msg);
            }
        }, "json");
    return false;
});

});
</script>
</head>
<body>
<a href="#" id="post_btn">post с параметрами</a><br />
<div id="result"></div>
</body>
</html>

Работает. Взято отсюда. https://ru.stackoverflow.com/questions/35915/%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0-get-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0-%D0%BF%D0%BE-%D0%BA%D0%BB%D0%B8%D0%BA%D1%83-%D0%BD%D0%B0-%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D1%83

Сейчас отдам знакомой, пусть думает как прикрутить к моим кнопкам. 

 

UW5EGA
Offline
Зарегистрирован: 16.09.2020

imp пишет:

UW5EGA пишет:
Надо но на цветной странице.
Имелось в виду не внешний вид, а наличие обратной связи. В простейшем случае страница делает регулярные запросы к устройству (серверу) в которых тот отчитывается о своем состоянии. (У тебя может быть сбой в сети, и команда просто не дойдет или у тебя может быть не штатный перезапуск устройства. Оператор должен всегда знать реальное состояние устройства.) Кстати, ошибки запросов к устройству тоже должны отображаться.

Отображение проще всего организовать меняя класс для элемента интерфейса, тогда в соответствующем css файле ты легко сможешь задать внешний вид элемента во включенном/выключенном/ошибочном состоянии.

Я с вами полностью согласен. 

UW5EGA
Offline
Зарегистрирован: 16.09.2020
<script>
$(function(){


$('#pusk').click(function() {
    $.post('http://192.168.4.70/$2', {"url": '$2',},
        function(data){
            if (data.success) {
                $('#result').html(data.success.msg);
            } else {
                $('#result').html(data.error.msg);
            }
        }, "json");
    return false;
});

});

$(function(){


$('#stop').click(function() {
    $.post('http://192.168.4.70/$1', {"url": '$1',},
        function(data){
            if (data.success) {
                $('#result').html(data.success.msg);
            } else {
                $('#result').html(data.error.msg);
            }
        }, "json");
    return false;
});

});
</script>

Работает!

 

UW5EGA
Offline
Зарегистрирован: 16.09.2020

https://www.youtube.com/watch?v=akJVaASGtQo&feature=youtu.be

https://www.youtube.com/watch?v=wp4CuHGlh0c&feature=youtu.be

Каким-то образом 220 вешает всю систему. Понять бы что вешается, ардуина и сетевой контроллер. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Все ошибки, которые можно было сделать - сделаны. Тут тебе и дюпонт и контактор рядом с МК и питание реле от USB. Плюсом код... осутствие фидбека от исполнительного устройства...

UW5EGA
Offline
Зарегистрирован: 16.09.2020

Так я всё исправлю. Короткими проводами распаяю. На сколько удалять МК от пускателя, может его обличить в алюминиевый экран? Питание от usb только мк. А что с кодом? Питание будет индивидуальное. Реле на данный момент питаются от одного лабораторника, промежуточное реле от другого.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот как всё исправите, так и вопросов может не останется.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:
Вот как всё исправите, так и вопросов может не останется.

"...но бросить пить?...не может быть!..."

UW5EGA
Offline
Зарегистрирован: 16.09.2020

Я его домучаю, рано или поздно но домучаю. 

При подаче 12в на VIN плата не работает, работает только от USB. Питание всех модулей сделаю отдельное скоро. Подвисание решилось установкой конденсатора 0.1мкф и резистора 1к параллельно выводам реле и катушки пускателя, подсказал дедушка один. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

открываешь любой шкаф управления, где реле управляют в цепях переменного тока, а там этих снабберов (RC цепочек) на каждом задействованном контакте и, советы дедушки не нужны )))

nik182
Offline
Зарегистрирован: 04.05.2015

Эта цепь называется снаббер. Приветствуется для установки во многие места, где возможны высоковольтные выбросы при разрывании тока. Тиристоры без них могут вообще открываться, если параллельно щелкнуть выключателем.   

UW5EGA
Offline
Зарегистрирован: 16.09.2020

Так уже лучше ? 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Текстолит хороший, дипольчик с симметрирующим трансформатором можно  организовать

UW5EGA
Offline
Зарегистрирован: 16.09.2020

Все кренки убрал, так по лучше будет. 

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

void setup()
{
  pinMode(8, OUTPUT);
  digitalWrite(8,HIGH);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
}

void blinker()
{
  digitalWrite(8, LOW);
  delay(8000);
  digitalWrite(8, HIGH);
  delay(5000);
  digitalWrite(8, LOW);
  delay(8000);
  digitalWrite(8, HIGH);
  delay(10000);
  digitalWrite(8, LOW);
  delay(180000);
  digitalWrite(8, HIGH);
}

void loop()
{
  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'){                              
          Serial.println("ON");
          digitalWrite(8, LOW);
          blinker();
          }
          
          if(c == '2'){                              
          Serial.println("OFF");
          digitalWrite(8, HIGH);                     
          }    
      } 
      
      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.println("<br />");       
        client.println("</html>");
        break;
      }
    
    }
    
  }
  delay(1);
  client.stop();
}
}

Все работает как надо, ничего не глючит и не виснет. Но есть один знакомый который может только обгадить, но совета сам дать не хочет. Он сказал, что использовать delay нельзя. 2 дня читаю про прерывание и скажу, что это слишком сложная для меня материя. 

Долго мучился с первичным состоянием реле, как оказалось нужно было добавить в void setup() строку digitalWrite(8,HIGH);

Немного разобрался с синтаксисом и функциями, интересная штука в общем. 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Зачем Вам прерывания для отказа от делей? http://arduino.ru/tutorials/BlinkWithoutDelay

sadman41
Offline
Зарегистрирован: 19.10.2016

Прерывания тут не к месту. Необходимо изучить статью "blink без delay" и добавить к уворованному там приему одну переменную-флаг "мигать можно", которую и перекидывать в true/false по событию.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

если устраивает ситуация, когда устройство на 3-5 минут будет зависать, то можно и с делеями, но не нужно

UW5EGA
Offline
Зарегистрирован: 16.09.2020
#include <SPI.h>
#include <Ethernet.h> 
boolean newInfo = 0;
unsigned long previusMillis = 0;
long interval =1000;

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

void setup()
{
  pinMode(8, OUTPUT);
  digitalWrite(8,HIGH);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
}


void loop()
{
  EthernetClient client = server.available();
  if(client){
  boolean currentLineIsBlank = true;
  unsigned long currentMillis = millis();
  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'){
          Serial.println("ON");
          digitalWrite(8, LOW);          
          }
          
          
          if(c == '2'){
          Serial.println("OFF");
          digitalWrite(8, HIGH);
          while(currentMillis - previusMillis > (interval * 8))
          {
            previusMillis = currentMillis;
          };
          digitalWrite(8, LOW);
          while(currentMillis - previusMillis > (interval * 5))
          {
            previusMillis = currentMillis;
          };
          digitalWrite(8, HIGH);
          while(currentMillis - previusMillis > (interval * 8))
          {
            previusMillis = currentMillis;
          };
          digitalWrite(8, LOW);
          while(currentMillis - previusMillis > (interval * 10))
          {
            previusMillis = currentMillis;
          };
          digitalWrite(8, HIGH);
          while(currentMillis - previusMillis > (interval * 210))
          {
            previusMillis = currentMillis;
          };
          digitalWrite(8, LOW);
          }    
      } 
      
      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>Web Server</title>");
        client.print("<H1>Web Server</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();
}
}
UW5EGA
Offline
Зарегистрирован: 16.09.2020

Не получается. Вместо задержек включается кнопкой "off" и выключить вообще нельзя. Вебстраница всегда активна. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Откуда этот странный прием?

UW5EGA
Offline
Зарегистрирован: 16.09.2020

Ниоткуда. Это в предыдущий добавил задержки из статьи посоветованой вами. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Зачем придумываете? В статье такого приема нет. Там и while() отсутствует в принципе.

UW5EGA
Offline
Зарегистрирован: 16.09.2020

Я сам уже ничего не знаю. Руководствовался разными учебными материалами, где что брал уже не помню. В чистом виде код из статьи подставить не получается. Все больше не буду вас тревожить. Все равно ничего не получается. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

для начала привести типы переменных (5 строка тоже uint32_t interval) к примеру

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

UW5EGA пишет:

Я сам уже ничего не знаю. Руководствовался разными учебными материалами, где что брал уже не помню. В чистом виде код из статьи подставить не получается. Все больше не буду вас тревожить. Все равно ничего не получается. 

вот зашёл ты к примеру в первый вайл и висишь там пока он не выполнится и, чем это отличается от delay();

UW5EGA
Offline
Зарегистрирован: 16.09.2020

А может кто-то дописать это вместо меня за деньги к примеру? У меня уйдет немало времени, чтобы немного изучить язык кода. У меня нету года на изучение. Я сам инициировал эту модернизацию, не оценив свои возможности. Кроме таймера еще нужен вывод информации на вебстраницу о состоянии контакта D2 к примеру LOW или HIGH. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Просто уберите свои вайлы, которые вместо дилеев и содержимое лупа из примера "blink без delay" поместите перед строкой 25. Мигает лампочка?

UW5EGA
Offline
Зарегистрирован: 16.09.2020

Надеюсь я правильно изменил в 4 строке с 13 на 8, в 44 строке ledPin на 8? Исходя из того, что у меня в void setup - pinMode(8, OUTPUT);. Но не хочет теперь собираться. 

ledPin

#include <SPI.h>
#include <Ethernet.h> 
boolean newInfo = 0;
const int ledPin =  8;      // номер выхода, подключенного к светодиоду
// Variables will change:
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода
long previousMillis = 0;        // храним время последнего переключения светодиода
 
long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)

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

void setup()
{
  pinMode(8, OUTPUT);
  digitalWrite(8,HIGH);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
}

void loop()
{
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();
  
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis; 
 
    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
 
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(8, ledState);
  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'){                              
          Serial.println("ON");
          digitalWrite(8, LOW);
          }
          
          if(c == '2'){                              
          Serial.println("OFF");
          digitalWrite(8, HIGH);                     
          }    
      } 
      
      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.println("<br />");       
        client.println("</html>");
        break;
      }
    
    }
    
  }
  delay(1);
  client.stop();
}
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Потеряна фигурная скобка if()а в районе строк 44-45

UW5EGA
Offline
Зарегистрирован: 16.09.2020

Так понял, нужно было добавить еще одну скобку в конце, так как добавились новые строки. Залилось и постоянно клацает реле с небольшим интервалом. Теперь мне нужно привязать это действие к кнопке "ON" и свои тайминги. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот это, украденное, надо засунуть в ещё один if(blinkAllowed) {...}

Когда нужно помигать - blinkAllowed = true, когда не надо мигать - blinkAllowed = false.

Где активировать мигание - определяйтесь сами.