Как настроить светодиоды RGB на arduino ethernet с помощью инструкции udp?

Я работаю над своего рода светофором с RGB-светодиодами. Я пытаюсь принять значение udp, отправленное с сервера на arduino mega и ethernet Shield, тогда arduino должен изменить цвет светодиода.

К сожалению, до сих пор это не работает. В мониторе последовательного порта я узнаю, что пакет udp был получен, но тогда светодиод не работает. Я надеялся, что вы, ребята, поможете мне понять, почему мой код не работает. Заранее спасибо! Вот мой код:

/*
  Web Server
 */

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>



    void Color(int R, int G, int B) //set up for the RGB led
    {
          analogWrite(3, R) ;   // Rojo
          analogWrite(5, G) ;   // Green - Verde
          analogWrite(6, B) ;   // Blue - Azul
    }

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(10, 90, 111, 150);

unsigned int localPort = 8888;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  // buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged";        // a string to send back

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {  //seting up the outputs for the rgb 
       pinMode(3, OUTPUT);
       pinMode(5, OUTPUT);
       pinMode(6, OUTPUT);



  // You can use Ethernet.init(pin) to configure the CS pin
  //Ethernet.init(10);  // Most Arduino shields
  //Ethernet.init(5);   // MKR ETH shield
  //Ethernet.init(0);   // Teensy 2.0
  //Ethernet.init(20);  // Teensy++ 2.0
  //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet
  //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet


    // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);

  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Ethernet WebServer Example");

  // Check for Ethernet hardware present
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  // start the server
  Udp.begin(localPort);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {


// if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i=0; i < 4; i++) {
      Serial.print(remote[i], DEC);
      if (i < 3) {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer);

    // send a reply to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();

  }
       char numero = packetBuffer;
         if (numero = "1") Color(250, 0, 0) ;
         if (numero = "2") Color(100, 110, 0);
         if (numero = "3") Color(0, 255, 0);
  delay(10);

}

С этого момента он просто получает udp, и при компиляции я получаю:

warning: invalid conversion from 'const char*' to 'char' [-fpermissive]

но в конце концов он компилируется.

отредактировано:

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

  void loop() {


// if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i=0; i < 4; i++) {
      Serial.print(remote[i], DEC);
      if (i < 3) {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer);
    char numero =  packetBuffer;
         if (numero = 'R') Color(250, 0, 0) ;
         if (numero = 'A') Color(100, 100, 0);
         if (numero = 'V') Color(0, 255, 0);         
    // send a reply to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();

  }

Это предупреждение говорит вам: «вы только что использовали указатель на память как символ», что является законным, указатель в основном является числом, поэтому его можно закоротить и использовать как другой числовой тип (char - 8-битное целое число со знаком (или беззнаковое число). , зависит от компилятора и его настроек))

KIIV 30.05.2019 19:53

может быть, вы читаете цвет, и светодиод мигает, а в следующем цикле он перезаписывается? Также никогда не используйте задержку, она используется только для обучения новичков. arduino.cc/ru/Tutorial/BlinkWithoutDelay

Haroun Hajem 30.05.2019 20:05

КИЕВ: так что это не похоже на проблему jeje, мне интересно, связана ли проблема с не включением светодиода с позицией последних 3 if , спасибо за время и ответ HAROUN: я удаляю задержку хе-хе, танковый пользовательский интерфейс скажет вам, если это сработает, кстати, я действительно большой новичок в ардуино, у меня есть около 1 недели опыта, jeje tank u для awnser

mimus 30.05.2019 20:06

Также есть небольшая разница между = (присваивание) и == (компаратор равенства)

KIIV 30.05.2019 20:09

@mimus Я полагаю, что последние несколько строк на самом деле ваш код, здесь нет ничего правильного. Вы берете адрес и сжимаете его в символьную переменную (не символ на этом адресе), у вас вместо сравнения в условиях есть присваивания, вы присваиваете строки "1", "2"... вместо "1", " 2 'символа

KIIV 30.05.2019 20:17

@KIIV я немного меняю код, он есть в посте, я думаю, это то, что ты имеешь в виду?, спасибо за помощь

mimus 30.05.2019 20:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
166
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы порекомендовал найти учебник по C++ для начинающих.

В любом случае:

char numero =  packetBuffer; // wrong, you are assigning part of address to char, not character at that address... 
if (numero = 'R') Color(250, 0, 0) ; // better but still wrong - numero is set to 'R' and it's also always true
if (numero = 'A') Color(100, 100, 0); // similar to previous
if (numero = 'V') Color(0, 255, 0);   // and again

Правильная версия:

char numero =  packetBuffer[0]; // get the first character in buffer
if (numero == 'R') Color(250, 0, 0) ; // compare numero with 'R' 
if (numero == 'A') Color(100, 100, 0); // compare numero with 'A' 
if (numero == 'V') Color(0, 255, 0);   // ...

Если нет ничего плохого, это должно исправить это

парень! ты супер! Большое вам спасибо, я бы прочитал учебник по C++, как вы предлагаете, я больше занимаюсь python и R, но теперь я вижу много связанных проблем между C и Arduino, еще раз спасибо за вашу помощь, объятия из Мексики

mimus 30.05.2019 21:07

Другие вопросы по теме