Nano+Enc28j60
- Войдите на сайт для отправки комментариев
Пнд, 02/03/2015 - 20:32
Товарищи доброго времени суток.
Помогите, я в работе с Arduino еще новичок.
Использовал скетч, приведенный ниже для связки Uno+W5100, все работает идеально.
Однако решил сократить габариты устройства, в итоге попробовал реализовать тоже, но на связке Nano+ Enc28j60.
В итоге совсем погряз в попытках адаптировать данный скетч под enc28j60.
Не могу понять как работать с данным шилдом. С W5100 все как то прозрачнее.
Сам шилд рабочий, а вот как изменить скетч не могу понять.
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <Wire.h>
#include <BMP085.h>
#include <DHT.h>
bool Debug = false; //режим отладки
//********************************************************************************************
byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x80, 0x0 }; //
#define BMP085_EXIST 1 // наличие датчика атмосферного давления
#define BMP085_TEMP 1 // использовать температурный датчик в BMP085
#define DHT_EXIST 1 // наличие датчика влажности
#define DHT_TEMP 1 // использовать температурный датчик в DHT22
#define DS18B20_PIN 7 // пин подключения термодатчика DS18B20
#define DHTPIN 5 // пин подключения датчика влажности DHT22
#define DHTTYPE DHT22 // тип датчика влажности DHT22/DHT11
#define postingInterval 600000 // интервал между отправками данных в миллисекундах (10 минут)
//********************************************************************************************
IPAddress server(94,19,113,221); // IP сервера народного мониторинга
char macbuf[13];
EthernetClient client;
OneWire ds(DS18B20_PIN);
#if BMP085_EXIST == 1
BMP085 dps = BMP085();
#endif
#if DHT_EXIST == 1
DHT dht(DHTPIN, DHTTYPE);
#endif
unsigned long lastConnectionTime = 0; // время последней передачи данных
boolean lastConnected = false; // состояние подключения
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
char replyBuffer[160]; // буфер для отправки
int CountSensors; // количество найденных датчиков температуры
long Temperature = 0;
long Pressure = 0; // давление
float Humidity = 0; // влажность
void setup() {
if (Debug)
{
Serial.begin(9600);
}
// Пробуем подключиться по Ethernet до тех пор пока это не удастся
do
{
delay(1000);
} while (Ethernet.begin(mac) == 0);
//Узнаём количество термодатчиков DS18B20
CountSensors = DsCount();
if (Debug)
{
Serial.print("Found ");
Serial.print(CountSensors);
Serial.println(" sensors.");
}
#if BMP085_EXIST == 1
Wire.begin();
dps.init();
#endif
#if DHT_EXIST == 1
dht.begin();
#endif
lastConnectionTime = millis()-postingInterval+15000; //первое соединение через 15 секунд после запуска
}
void loop()
{
//Если вдруг нам случайно приходят откуда-то какие-то данные,
//то просто читаем их и игнорируем, чтобы очистить буфер
if (client.available())
{
client.read();
}
if (!client.connected() && lastConnected)
{
if (Debug)
{
Serial.println();
Serial.println("disconnecting.");
}
client.stop();
}
//если не подключены и прошло определённое время, то делаем замер,
//переподключаемся и отправляем данные
if (!client.connected() && (millis() - lastConnectionTime > postingInterval))
{
//формирование HTTP-запроса
memset(replyBuffer, 0, sizeof(replyBuffer));
strcpy(replyBuffer,"ID=");
memset(macbuf, 0, sizeof(macbuf));
//Конвертируем MAC-адрес
for (int k=0; k<6; k++)
{
int b1=mac[k]/16;
int b2=mac[k]%16;
char c1[2],c2[2];
if (b1>9) c1[0]=(char)(b1-10)+'A';
else c1[0] = (char)(b1) + '0';
if (b2>9) c2[0]=(char)(b2-10)+'A';
else c2[0] = (char)(b2) + '0';
c1[1]='\0';
c2[1]='\0';
strcat(macbuf,c1);
strcat(macbuf,c2);
}
strcat(replyBuffer, macbuf);
//Сбрасываем поиск датчиков (кол-во нам уже известно)
ds.reset_search();
//Теперь в цикле опрашиваем все датчики DS18B20 сразу
for (int j=0; j<CountSensors; j++)
{
byte i;
byte present = 0;
byte data[12];
byte addr[8];
if ( !ds.search(addr))
{
ds.reset_search();
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1);
delay(1000);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) // нам необходимы 9 байт данных от датчика
{
data[i] = ds.read();
}
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
SignBit = TReading & 0x8000; // бит знака
if (SignBit) // отрицательная температура
{
TReading = (TReading ^ 0xffff) + 1;
}
Tc_100 = (6 * TReading) + TReading / 4;
Whole = Tc_100 / 100; // разделяем целую и дробную части
Fract = Tc_100 % 100;
char temp[3];
itoa(Whole,temp);
strcat(replyBuffer,"&");
//конвертируем адрес термодатчика
for (int k=7; k>=0; k--)
{
int b1=addr[k]/16;
int b2=addr[k]%16;
char c1[2],c2[2];
if (b1>9) c1[0]=(char)(b1-10)+'A';
else c1[0] = (char)(b1) + '0';
if (b2>9) c2[0]=(char)(b2-10)+'A';
else c2[0] = (char)(b2) + '0';
c1[1]='\0';
c2[1]='\0';
strcat(replyBuffer, c1);
strcat(replyBuffer, c2);
}
strcat(replyBuffer,"=");
if (SignBit) //если температура отрицательная, добавляем знак минуса
{
strcat(replyBuffer,"-");
}
strcat(replyBuffer,temp);
strcat(replyBuffer,".");
if (Fract<10)
{
strcat(replyBuffer,"0");
}
itoa(Fract,temp);
strcat(replyBuffer,temp);
}
char temp[8];
long p_100, h_100;
#if BMP085_EXIST == 1
//получаем значение атмосферного давления
strcat(replyBuffer, "&");
strcat(replyBuffer, macbuf);
strcat(replyBuffer, "01=");
dps.getPressure(&Pressure);
p_100 = (Pressure/1.333)+5;//==================================================================================================================================================================================== Коор.койэфициент
Whole = p_100 / 100;
Fract = p_100 % 100;
itoa(Whole, temp);
strcat(replyBuffer, temp);
strcat(replyBuffer, ".");
if (Fract<10)
{
strcat(replyBuffer,"0");
}
itoa(Fract, temp);
strcat(replyBuffer, temp);
#if BMP085_TEMP == 1
//получаем значение температуры с датчика давления
strcat(replyBuffer, "&bmpt=");
dps.getTemperature(&Temperature);
if (Temperature < 0)
{
SignBit = 1;
Temperature = -Temperature;
}
else
{
SignBit = 0;
}
Whole = Temperature / 10;
Fract = Temperature % 10;
itoa(Whole, temp);
if (SignBit)
{
strcat(replyBuffer, "-");
}
strcat(replyBuffer, temp);
strcat(replyBuffer, ".");
itoa(Fract, temp);
strcat(replyBuffer, temp);
#endif
#endif
#if DHT_EXIST == 1
//получаем значение влажности
Humidity = dht.readHumidity();
strcat(replyBuffer, "&");
strcat(replyBuffer, macbuf);
strcat(replyBuffer, "02=");
h_100 = Humidity*100;
Whole = h_100 / 100;
Fract = h_100 % 100;
itoa(Whole, temp);
strcat(replyBuffer, temp);
strcat(replyBuffer, ".");
if (Fract<10)
{
strcat(replyBuffer,"0");
}
itoa(Fract, temp);
strcat(replyBuffer, temp);
#if DHT_TEMP == 1
//получаем значение температуры с датчика влажности
strcat(replyBuffer, "&dhtt=");
Temperature = (dht.readTemperature()+1)*100;//======================================================================================================================================================================== Коор.койэфициент
if (Temperature < 0)
{
SignBit = 1;
Temperature = -Temperature;
}
else
{
SignBit = 0;
}
Whole = Temperature / 100;
Fract = Temperature % 100;
itoa(Whole, temp);
if (SignBit)
{
strcat(replyBuffer, "-");
}
strcat(replyBuffer, temp);
strcat(replyBuffer, ".");
if (Fract<10)
{
strcat(replyBuffer,"0");
}
itoa(Fract, temp);
strcat(replyBuffer, temp);
#endif
#endif
strcat(replyBuffer,'\0');
if (Debug)
{
Serial.println(replyBuffer);
Serial.print("Content-Length: ");
Serial.println(len(replyBuffer));
}
//отправляем запрос
httpRequest();
}
//храним последнее состояние подключения
lastConnected = client.connected();
}
//Функция отправки данных
void httpRequest()
{
if (client.connect(server, 80))
{
if (Debug)
{
Serial.println("connecting...");
}
// отправляем HTTP POST запрос:
client.println("POST http://narodmon.ru/post.php HTTP/1.0");
client.println("Host: narodmon.ru");
client.println("Content-Type: application/x-www-form-urlencoded");
client.print("Content-Length: ");
client.println(len(replyBuffer));
client.println();
client.println(replyBuffer);
client.println();
lastConnectionTime = millis();
}
else
{
if (Debug)
{
Serial.println("connection failed");
Serial.println("disconnecting.");
}
client.stop();
}
}
//Количество термодатчиков DS18B20 на шине
int DsCount()
{
int count=0;
bool thatsall = false;
byte addr[8];
do
{
if ( !ds.search(addr))
{
ds.reset_search();
thatsall = true;
}
count++;
} while(!thatsall);
return (count-1);
}
//Функция определения длины строки
int len(char *buf)
{
int i=0;
do
{
i++;
} while (buf[i]!='\0');
return i;
}
//Функция переворота строки
void reverse(char s[])
{
int i, j;
char c;
for (i = 0, j = strlen(s)-1; i<j; i++, j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
//Функция конвертирования числа в символьный массив
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* записываем знак */
n = -n; /* делаем n положительным числом */
i = 0;
do { /* генерируем цифры в обратном порядке */
s[i++] = n % 10 + '0'; /* берем следующую цифру */
} while ((n /= 10) > 0); /* удаляем */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
код сворачивайте при загрузке.
Помнится мне , для Enc28j60 есть другая библиотека <UIPEthernet.h>
Вроде рабочий пример:
#include <SPI.h> //#include <Ethernet.h> #include <UIPEthernet.h> #include <OneWire.h> bool Debug = false; //режим отладки //bool Debug = true; //режим отладки //**************************************************************************************** byte mac[] = { 0xDE, 0xAD, 0xBE, 0x63, 0x4B, 0x0B }; //MAC-адрес Arduino OneWire ds(9); //пин подключения термодатчика const unsigned long postingInterval = 600000; // интервал между отправками данных в миллисекундах (10 минут) //**************************************************************************************** IPAddress server(94,19,113,221); // IP сервера EthernetClient client; unsigned long lastConnectionTime = 0; // время последней передачи данных boolean lastConnected = false; // состояние подключения int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract; char replyBuffer[160]; char CurTemp[6]; int CountSensors; void setup() { if (Debug) { Serial.begin(9600); } delay(1000); // Ethernet connection: if (Ethernet.begin(mac) == 0) { if (Debug) { Serial.println("Failed to configure Ethernet using DHCP"); } // ничего не делаем for(;;); } // секунда для инициализации Ethernet delay(1000); //Узнаём количество термодатчиков CountSensors = DsCount(); if (Debug) { Serial.print("Found "); Serial.print(CountSensors); Serial.println(" sensors."); } lastConnectionTime = millis()-postingInterval+15000; //первое соединение через 15 секунд после запуска } void loop() { //Если вдруг нам случайно приходят откуда-то какие-то данные, //то просто читаем их и игнорируем, чтобы очистить буфер if (client.available()) { client.read(); } if (!client.connected() && lastConnected) { if (Debug) { Serial.println(); Serial.println("disconnecting."); } client.stop(); } //если не подключены и прошло определённое время, то делаем замер, //переподключаемся и отправляем данные if (!client.connected() && (millis() - lastConnectionTime > postingInterval)) { //формирование HTTP-запроса memset(replyBuffer, 0, sizeof(replyBuffer)); strcpy(replyBuffer,"ID="); //Конвертируем MAC-адрес for (int k=0; k<6; k++) { int b1=mac[k]/16; int b2=mac[k]%16; char c1[2],c2[2]; if (b1>9) c1[0]=(char)(b1-10)+'A'; else c1[0] = (char)(b1) + '0'; if (b2>9) c2[0]=(char)(b2-10)+'A'; else c2[0] = (char)(b2) + '0'; c1[1]='\0'; c2[1]='\0'; strcat(replyBuffer,c1); strcat(replyBuffer,c2); } //Сбрасываем поиск датчиков (кол-во нам уже известно) ds.reset_search(); //Теперь в цикле опрашиваем все датчики сразу for (int j=0; j<CountSensors; j++) { byte i; byte present = 0; byte data[12]; byte addr[8]; if ( !ds.search(addr)) { ds.reset_search(); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); delay(1000); present = ds.reset(); ds.select(addr); ds.write(0xBE); for ( i = 0; i < 9; i++) // we need 9 bytes { data[i] = ds.read(); } LowByte = data[0]; HighByte = data[1]; TReading = (HighByte << 8) + LowByte; SignBit = TReading & 0x8000; // test most sig bit if (SignBit) // negative { TReading = (TReading ^ 0xffff) + 1; // 2's comp } Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25 Whole = Tc_100 / 100; // separate off the whole and fractional portions Fract = Tc_100 % 100; char temp[3]; itos(Whole,temp); memset(CurTemp, 0, sizeof(CurTemp)); strcpy(CurTemp,temp); strcat(CurTemp,"."); strcat(replyBuffer,"&"); //конвертируем адрес термодатчика for (int k=7; k>=0; k--) { int b1=addr[k]/16; int b2=addr[k]%16; char c1[2],c2[2]; if (b1>9) c1[0]=(char)(b1-10)+'A'; else c1[0] = (char)(b1) + '0'; if (b2>9) c2[0]=(char)(b2-10)+'A'; else c2[0] = (char)(b2) + '0'; c1[1]='\0'; c2[1]='\0'; strcat(replyBuffer,c1); strcat(replyBuffer,c2); } strcat(replyBuffer,"="); if (SignBit) //если температура отрицательная, добавляем знак минуса { strcat(replyBuffer,"-"); } strcat(replyBuffer,temp); strcat(replyBuffer,"."); itos(Fract,temp); strcat(replyBuffer,temp); strcat(CurTemp,temp); } strcat(replyBuffer,'\0'); if (Debug) { Serial.println(replyBuffer); Serial.print("Content-Length: "); Serial.println(len(replyBuffer)); } //отправляем запрос httpRequest(); } //храним последнее состояние подключения lastConnected = client.connected(); } void httpRequest() { if (client.connect(server, 80)) { if (Debug) { Serial.println("connecting..."); } // send the HTTP POST request: client.println("POST http://narodmon.ru/post.php HTTP/1.0"); client.println("Host: narodmon.ru"); //client.println("User-Agent: arduino-ethernet"); //client.println("Connection: close"); client.println("Content-Type: application/x-www-form-urlencoded"); client.print("Content-Length: "); client.println(len(replyBuffer)); client.println(); client.println(replyBuffer); client.println(); lastConnectionTime = millis(); } else { if (Debug) { Serial.println("connection failed"); Serial.println("disconnecting."); } client.stop(); } } //Количество термодатчиков на шине int DsCount() { int count=0; bool thatsall = false; byte addr[8]; do { if ( !ds.search(addr)) { ds.reset_search(); thatsall = true; } count++; } while(!thatsall); return (count-1); } int len(char *buf) { int i=0; do { i++; } while (buf[i]!='\0'); return i; } void itos(int n, char bufp[3]) //int to string { char buf[3]={'0','0','\0'}; int i = 1; while (n > 0) { buf[i] = (n % 10)+48; i--; n /= 10; } for (i=0; i<3; i++) bufp[i]=buf[i]; }Спасибо. А можно вашу библиотеку? Походу у меня в ней проблема.
http://www.tweaking4all.com/downloads/arduino/arduino_uip.zip
читать тут http://www.tweaking4all.com/hardware/arduino/arduino-enc28j60-ethernet/
Рекомендую. Только в бетах IDE свежих не работает. Там синтаксис чего-то у компилятора изменен. Не помню чего. В стабильной 1.0.6 работает.