#1 Re: Апаратні питання » Проблемы с W5100 » 2017-11-13 02:02:56

Lic Control пише:

Мой опыт работы с W5100 говорит о том, что зависания для нее обычное дело. Используйте Watchdog и сбрасывайте его если есть  соединение.

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

#2 Апаратні питання » Проблемы с W5100 » 2017-11-10 12:01:26

VaDoSiQ
відповідей: 11

Здравствуйте, уважаемые форумчане!
Столкнулся с такой проблемой:
Имеется Arduino Uno, Ethernet Shield W5100 и датчик освещенности(измерения люксов), и 8 релейный модуль.
В общем задача такова: Arduino шлёт  моему серверу сигнал на получение ответа, включать ли ей то или иное реле. Далее ардуина принимает ответ, если 1, зажигает реле, если 0 ничего не делает, параллельно она отправляет на мой сайт значения с датчика освещенности. Всё вроде бы работает, НО. Шилд со временем подвисает и не пингуется. Помогает ему лишь перезагрузка всей системы. В общем мне нужно узнать, в чем может быть проблема, в самом шилде или же в программе, сразу скажу ардуина и шилд не оригинальные, код программы ниже. Буду благодарен за ответы по делу. Спасибо.

#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <BH1750.h>
#define PIN5 5
BH1750 lightMeter;
byte MAC[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress IP(10, 10, 1, 55);
EthernetServer arduino(81);
EthernetClient client;
boolean InboundRequest = 0;
char resource[] = "example.com";

void setup() {
  pinMode(PIN5, OUTPUT);
  Serial.begin(9600);
  lightMeter.begin();
  Ethernet.begin(MAC, IP);
  arduino.begin();
}

void loop() {
  EthernetClient client = arduino.available();
  if(client) {
    boolean EmptyLine = true;
    while(client.connected()) {
      if(client.available()) {
        char data = client.read();
        if(data == '\n' && EmptyLine) {
          client.println("HTTP/1.1 200 OK");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<head>");
          client.println("<link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"http://arduino.cc/en/favicon.png</a>\">");
          client.println("</head>");
          client.println("<body>");
          client.println("</body>");
          client.println("</html>");
          break;
        }
        if(InboundRequest && data == ' ') {
          InboundRequest = 0;
        }
        if(data == '?') {
          InboundRequest = 1;
        }
        if(InboundRequest == 1) {
          int value = data - '0';
          digitalWrite(PIN5, value);
          Response();
        }
        if(data == '\n') {
          EmptyLine = true;
        } else if(data != '\r') {
          EmptyLine = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}



void Response() { 
  if(client.connect(resource, 80)) {
    String answer = "GET /update.php?status=";
    answer+=digitalRead(PIN5);
    answer+="&lux=";
    answer+=lightMeter.readLightLevel();
    client.println(answer);
    client.println("Host: example.com");
    client.println("Connection: close");
    Serial.println(answer);
  } else {
    Serial.println("Connection failed.");
  }
  client.stop();
}

#3 Re: Програмування Arduino » Считывание данных по ModBus RTU » 2017-04-07 18:25:37

Я дико извеняюсь, но не могли бы вы мне подробнее обьяснить? Желательно программно. Отправить и обработать я и без Arduino могу.

#4 Програмування Arduino » Считывание данных по ModBus RTU » 2017-04-07 16:57:07

VaDoSiQ
відповідей: 10

Здравствуйте. У меня имеется частотный преобразователь серии VLT 2800 компании Danfoss. Работает он по протоколу ModBus RTU через интерфейс RS485.
Мне нужно считать данные с нужного мне регистра, записать их в переменную и вывести в порт Arduino.
Вот моя схема подключения:
Cxema.png
Вот скетч:

#include <ModbusRtu.h>

// data array for modbus network sharing
uint16_t au16data[16];
uint8_t u8state;

/**
 *  Modbus object declaration
 *  u8id : node id = 0 for master, = 1..247 for slave
 *  u8serno : serial port (use 0 for Serial)
 *  u8txenpin : 0 for RS-232 and USB-FTDI 
 *               or any pin number > 1 for RS-485
 */
Modbus master(0,0,10); // this is master and RS-232 or USB-FTDI

/**
 * This is an structe which contains a query to an slave device
 */
modbus_t telegram;

unsigned long u32wait;

void setup() {
  master.begin( 9600 ); // baud-rate at 19200
  master.setTimeOut( 2000 ); // if there is no answer in 2000 ms, roll over
  u32wait = millis() + 1000;
  u8state = 0; 
}

void loop() {
  switch( u8state ) {
  case 0: 
    if (millis() > u32wait) u8state++; // wait state
    break;
  case 1: 
    telegram.u8id = 1; // slave address
    telegram.u8fct = 3; // function code (this one is registers read)
    telegram.u16RegAdd = 29; // start address in slave
    telegram.u16CoilsNo = 2; // number of elements (coils or registers) to read
    telegram.au16reg = au16data; // pointer to a memory array in the Arduino
    master.query( telegram ); // send query (only once)
    Serial.println();
    Serial.print(au16data[16]);
    Serial.println();
    u8state++;
    break;
  case 2:
    master.poll(); // check incoming messages
    if (master.getState() == COM_IDLE) {
      u8state = 0;
      u32wait = millis() + 1000; 
    }
    break;
  }
}

Когда я считываю 29 регистр, в порту мне пишет вот это:
Cxema2.png
Хотя в регистре, значение равно: 1500.
Вот что пишет в Termite:
Cxema3.png
Так же у меня имеется USB to RS485 Converter, вот пример его работы, через программу QModBUS:
rrara.png
Запрос ModBus: 01  03  00 1d  00 02
Ответ ModBus: 01 03 04 00 00 05 dc f8 fa
Подскажите пожалуйста, что я делаю не так? Уже вторую неделю голову ломаю.

#5 Re: Програмування Arduino » ENC28J60 Ethernet модуль » 2017-02-06 12:21:51

Аtaii_бро пише:

prog_cha не мог найти эту страку чтобы изменит

Скачайте редактор Notepad++ и нажмите комбинацию клавиш CTR+H, введите название "prog_char" и нажмите "Искать далее".

#6 Програмування Arduino » Помогите с запросом. » 2017-02-06 12:15:12

VaDoSiQ
відповідей: 1

Здравствуйте. Есть скетч отправки данных на сервер с платы ENC28J60.
Собственно скетч работает и отправляет данные, которые я ему задаю.
Вот сам скетч:
#include <EtherCard.h>
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
static uint32_t timer;

const char website[] PROGMEM = "example.com";

static void my_callback (byte status, word off, word len) {
  Serial.println("----------------------");
  Ethernet::buffer[off+300] = 0;
  Serial.print((const char*) Ethernet::buffer + off);
  Serial.println();
  Serial.println("----------------------");
}

void setup () {
  Serial.begin(9600);
  Serial.println("[Arduino Client]");

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println( "Failed to access Ethernet controller.");
  if (!ether.dhcpSetup())
    Serial.println("Failed DHCP.");

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GATEWAY:  ", ether.gwip); 
  ether.printIp("DNS: ", ether.dnsip); 

  if (!ether.dnsLookup(website))
    Serial.println("Failed DNS.");
   
  ether.printIp("SERVER: ", ether.hisip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  if (millis() > timer) {
    timer = millis() + 60000;
    ether.browseUrl(PSTR("/arduino.php?value=54321"), "bar", website, my_callback);
  }
}
Как видите, в функции
ether.browseUrl(PSTR("/arduino.php?value=54321"), "bar", website, my_callback);
После /arduino.php?value= идут мои значения.
Но у меня есть самодельный термистор, сделанный из обычной термопары и есть к нему функция, с помощью которой Arduino получает данные о температуре.
Вопрос: Как мне в отправке данных, записать значения переменной, после вот этого кода: /arduino.php?value=$var
Скетч термистора:
#include <math.h> //Библиотека для выполнения математических операций.
float Thermometer(float RawADC) {
  float Temperature;  // Переменная для экономии места.
  Temperature = 1.25*(480 - RawADC); //Формула вычисления реальной температуры.
  return Temperature;
}
void setup() {
  Serial.begin(9600); //Открываем порт на скорости 9600 бит/c.
}
void loop() {
  float Temperature;
  Temperature = Thermometer(analogRead(5));
  Serial.print("Temperature: ");
  Serial.println(Temperature,0);
  Serial.println(analogRead(5));
 
  delay(1000);
}
Использую библиотеку EtherCard.
Буду благодарен за наглядный пример в моём коде. Так как я в ардуинке, пока полный ноль (:

Підвал форуму