Передача через Ethernet функцией DigitalRead

Kleon
Offline
Зарегистрирован: 15.03.2021

Всем привет! Господа и дамы, вдруг таковые в наличии, есть проблема с передачей по протоколу Ethernet. Шесть аналоговых сигалов от датчиков температуры передаются функцией analogRead без проблем. Мне нужно передать также данные от расходомера, а он имеет цифровой выход. Предполагаю, что смогу с помощью UART передать слово в Arduino Ethernet, а вот как дальше не знаю. Функция digitalRead передаёт сигнал с какого то конкретного pin. По идее надо выполнять сдвиговые операции, но выглядит это как то туповато. Может кто в курсе? Спасибо.

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

Все слова знакомые, а смыла уловить не могу. 

UART - это там к чему? А сдвиговые операции?

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

через Ethernet функцией DigitalRead

так не бывает

Kleon
Offline
Зарегистрирован: 15.03.2021

Расходомер построен на  ATmega8, модуль Arduino Ethernet - на Atmega328. Обычно между процами я использую передачу по протоколу UART. Я могу с помощью ЦАП преобразовать цифровой сигнал расходомера в аналоговый и устроить передачу по Ethernet знакомым способом, но это плохой вариант, поскольку теряется точность. Я не знаю, каким образом в скетче указать регистр ATmega328 для передачи. Функция analogRead сама обеспечивает последовательную передачу в контроллер Ethernet, ну а тот знает, что делать дальше.

Kleon
Offline
Зарегистрирован: 15.03.2021

а как бывает?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Kleon пишет:

а как бывает?


Спросите у разработчика, который вам это написал.

Kleon
Offline
Зарегистрирован: 15.03.2021

Я, собственно, у него и спрашивал.

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

Kleon пишет:

Функция analogRead сама обеспечивает последовательную передачу в контроллер Ethernet


что за бред? Кто вам сказал эту чушь?

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

Kleon пишет:

Я, собственно, у него и спрашивал.


а кто разработчик? Он тут, на форуме?

Kleon
Offline
Зарегистрирован: 15.03.2021

Вот фрагмент этого "бреда", который работает в моей железке:

EthernetServer server(80);
String strData;
void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
  pinMode(pinChOne,OUTPUT);
  pinMode(pinChTwo,OUTPUT);
//assign six analog pin to input
//  for (int i=14; i<19; i++) pinMode(i,INPUT);
//  Serial.begin(9600);
//  Serial.print("Local IP: ");
//  Serial.println(Ethernet.localIP());
    digitalWrite(pinChOne,HIGH);
    digitalWrite(pinChTwo,LOW);
    
}
void loop()
{ //begin_void
  EthernetClient client = server.available();
  if (client)
    { //begin_If проверка наличия соединения
//    boolean sendHeader = false;  
    boolean current_line_is_blank = true;
     while (client.connected())
    { //while_begin
      if (client.available())
      { 
       char c = client.read();
//       Serial.print(String(c)); 
       if (cnt==5 && c=='1') //передача первого блока данных
         {
//            Serial.println("Channel 1 connected");
            digitalWrite(pinChOne,HIGH);
            digitalWrite(pinChTwo,LOW);
         } 
       if (cnt==5 && c=='2') //передача второго блока данных
         {
//            Serial.println("Channel 2 connected");
            digitalWrite(pinChTwo,HIGH);
            digitalWrite(pinChOne,LOW);
         } 
       cnt++;
       if (c == '\n' && current_line_is_blank)
       { 
//            Serial.println("HTML header is passed");
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println();
            delay(250);
            strData="!";
            for (int i=0; i<4; i++)
              {
                strData +=String(analogRead(i));
                strData +=";";
              }
              client.print(strData);
              client.println("<br>");
              Serial.println(strData);
              Serial.println();
              strData="";
              cnt=0; //сброс счётчика символов клиентского запроса по концу передачи
            break;
          }
        if (c == '\n')
          { 
          current_line_is_blank = true;
          }
        else if (c != '\r')
        { 
         current_line_is_blank = false; 
        }
      }//end if(client.available)
      
    }//end while
    delay(1);
    client.stop();
//    Serial.println("Client is stopped!");
  }//end if(client)
}//end loop

 

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

Может укажете номер строки, где аналогрид() " сама обеспечивает передачу значения через эзернет"?

Kleon
Offline
Зарегистрирован: 15.03.2021

Мда, конфуз вышел. Код писал 4 месяца назад. Ардуино у меня это маленькая, но важная часть проекта, поэтому я не самый большой спец в написании скетчей. Может подскажете хороший способ передачи данных с ATmega8  в Ардуино.

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

Kleon пишет:

Может подскажете хороший способ передачи данных с ATmega8  в Ардуино.

через UARt можно, только не пишите заумных слов про "регистры". И еще - сами процедуры analogWrite() и digitalWrite() ничего никуда передать не могут. это должна делать ваша программа.

все довольно банально - считали значение с пина digitalWrite(), сохранили в переменную. переменные собрали в пакет и передали по UART. На другом МК этот пакет надо принять и распарсить.

Если, судя по предыдущим высказываниям, в этом тексте вам не все понятно - поищите библиотеку VirtualWire и почитайте примеры к ней

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

b707 пишет:
так не бывает
И не так бывает!
sadman41 пишет:
смыла уловить не могу.
А Вы уверены, что ТС хотел, чтобы его поняли? Как говаривал Чеширский Кот: "Понимать меня необязательно. Обязательно любить и кормить вовремя".

Kleon
Offline
Зарегистрирован: 15.03.2021

Спасибо. Только процесс в другую сторону. От ATmega8 в Ардуино, а указанную библиотеку и примеры обязательно посмотрю.

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

Kleon пишет:

Спасибо. Только процесс в другую сторону. От ATmega8 в Ардуино

а есть какая-то разница? :)))

Kleon
Offline
Зарегистрирован: 15.03.2021

Я жуткий зануда