Ви не увійшли.
Можно ли обойтись без роутера? Можно, если железяка сама притворится роутером точкой доступа: http://www.esp8266.com/viewtopic.php?f=6&t=299&start=0
Хм, но тогда если убрать источник опорного напряжения, то АЦП в МК и датчик будут отдавать и получать значения относительно референса, равного напряжению питания. И ничего пересчитывать не придётся.
Выходит, что Референс - потолок, выше него АЦП не померяет.
Задача: используя внешний AREF = 4.086V узнать текущее напряжение питания датчика, чтобы потом, используя это знание, нормализовать оцифрованное значение аналогового выхода датчика, т.к. оно зависит от напряжения питания.
И что будет оцифровано, если опорное напряжение 4 В, а на входе АЦП -- аж 5 Вольт.
Упс, забыл сохранить состояние в глобальной переменной, т.е. надо в конце тела функции setRelayState(..) дописать " relayStatus = relayOn;"
На радиорынке (от остановки известного 27 троллейбуса пешком 5 минут), но смотрите, чтоб вышло не дороже, чем там же в магазине типа этого http://www.radiomag.com.ua/product/2%20 … 2C25W.html
Та это не форум, это я упростил:
#include <EtherCard.h>
// разъем CS из модуля сети подключаем к 10-му пину на ардуино
#define CS 10
#define REQUEST_RATE 5000
// входы и выходы
#define BUTTON_PIN 2
#define RELAY_PIN 4
#define LED_PIN 6
// настройки сетевого интерфейса
#define MY_IP "192.168.0.55"
static byte myip[] = { 192,168,0,55 };
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte gwip[] = { 192,168,0,1 };
static byte dnsip[] = { 8,8,8,8 };
static byte hisport[] = { 80 };
byte Ethernet::buffer[700];
boolean relayStatus;
char* relayLabel;
// для кнопки
boolean lastButton = LOW; // Переменная для сохранения предыдущего состояния кнопки
boolean currentButton = LOW; // Переменная для сохранения текущего состояния кнопки
void setup () {
// инициируем подключение к локальной сети
delay(300);
if (ether.begin(sizeof Ethernet::buffer, mymac, CS) == 0)
Serial.println(F("Failed to access Ethernet controller"));
ether.staticSetup(myip);
// настройка входов/выходов
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
// включение реле
setRelayState(true);
}
/*
* функция сглаживания дребезга
* принимает в качестве аргумента предыдущее состояние кнопки
* и выдаёт фактическое.
*/
boolean debounce(boolean last) {
boolean current = digitalRead(BUTTON_PIN); // Считать состояние кнопки
if (last != current) { // Если изменилось ...
delay(5); // ждём 5 мс
current = digitalRead(BUTTON_PIN); // Считываем состояние кнопки
return current; // Возвращаем состояние кнопки
}
}
void setRelayState(boolean relayOn) {
digitalWrite(RELAY_PIN, relayOn);
digitalWrite(LED_PIN, relayOn);
if (relayOn) {
relayLabel = "ON";
} else {
relayLabel = "OFF";
}
relayStatus = relayOn;
}
void loop () {
// управление по локальной сети
word len = ether.packetReceive();
word pos = ether.packetLoop(len);
if (pos) {
if (strstr((char *)Ethernet::buffer + pos, "GET /?ON") != 0) {
setRelayState(true);
} else if(strstr((char *)Ethernet::buffer + pos, "GET /?OFF") != 0) {
setRelayState(false);
}
// выдать веб-интерфейс
BufferFiller bfill = ether.tcpOffset();
bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
"<html>\n<head><meta http-equiv=\"refresh\" content=\"5;URL=http://"
MY_IP
"/\"></head>\n<body>\n<center>Relay is $S</center>\n"
"<a href=\"http://"
MY_IP
"/?OFF\" rel=\"nofollow\">Turn Off</a><br></br>\n"
"<a href=\"http://"
MY_IP
"/?ON\" rel=\"nofollow\">Turn On</a><br></br>\n"
"<a href=\"http://"
MY_IP
"/\" rel=\"nofollow\">Check Status</a><br>\n"
"</body>\n</html>\n"
), relayLabel);
ether.httpServerReply(bfill.position());
}
// реакция на нажатие кнопки для реле
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH) { // если нажатие
setRelayState(!relayStatus);
}
lastButton = currentButton;
}А ещё лучше -- для упрощения [понимания] логики программы советую сделать специальную подпрограмму (функцию) с именем setRelayState(boolean relayOn), в которую поместить включение/выключение реле (и светодиода), а также изменение той самой relayLabel. Далее эту setRelayState(..) нужно вызывать и из "веб сервера", и из обработчика кнопки, и из начальной настройки. Отовсюду. Для кнопки будет "setRelayState(!relayStatus);", для веб - "setRelayState(true);" и "setRelayState(false);".
Только relayLabel формировать не в привязке к каким-то дополнительным условиям, а по значению relayStatus.
Да вроде бы в коде и так всё есть. Остаётся только добавить ссылку для проверки статуса, как-то так:
bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
"<html><head></head><body>"
"<div style='font:bold 14px verdana;text-align:center'>Relay is $S</div>"
"<a href=\"http://адрес/?OFF\" rel=\"nofollow\">Turn Off</a>"
"<br></br>"
"<a href=\"http://адрес/?ON\" rel=\"nofollow\">Turn On</a>"
"<br></br>"
"<a href=\"http://адрес/\" rel=\"nofollow\">Check Status</a>"
"</div></div></body></html>"
), relayLabel);Надо чтобы информация о состоянии реле я знал через веб интерфейс модуля enc28j60 на arduino. Может кто знает как решить задачу?
В коде есть состояние реле (boolean relayStatus), вот его-то и надо выводить на веб-страничку как состояние реле. Разве не?
Плюс там ещё и задержка в 2 секунды в send_GPRS().
А если забрать кусок кода вот отсюда? https://github.com/DFRobot/GPS-GPRS-GSM … RS_GPS.ino
Оба контроллера Ардуины (ATMega16U2 и ATMega328P) - живые. ... считать прошивки и фьюзы обеих микросхем? Поделитесь, пожалуйста! Судя по всему, не работает должным образом ATMega16U2
Не оно случайно? -->
"%programfiles(x86)%\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2\arduino-usbserial\Arduino-usbserial-atmega16u2-Uno-Rev3.hex"
Нашёл, читая статью http://www.instructables.com/id/How-to- … 6U2-Firmw/
Можно сделать всё. Или почти всё. Но без возможности отладки написание кода становится мукой. Я так понимаю, что Ардуино принято дебажить через Serial monitor. Для начала можно узнать, что выдаёт time.gettime("d_m_Y").
Создаёт ли файл этот код? --
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.println("Hello, world!");
dataFile.close();
}
Что покажет монитор порта? --
Serial.println(time.gettime("d_m_Y"));
Обнаружил, что у меня в домофоне подъезда стоит точно такая же система RFID, как и у продающегося тут модуля RFID RDM6300 125кГц. Взял поиграться, нагуглил примеры, а они или устаревшие, или странные и с ошибками, или сложные.
Надо ж добавить свои 5 копеек!
// Arduino test sketch for http://arduino-ua.com/prod259-125Khz_RFID_modyl_RDM6300
#include <SoftwareSerial.h>
#define STX 2
#define ETX 3
SoftwareSerial softSerial(10, 11); // recommended pins for RX on Mega: 10, 11, 12...
int rx_counter;
byte rx_data[14]; // 1+10+2+1
void setup() {
rx_counter = 0; // init counter
Serial.begin(9600);
softSerial.begin(9600);
}
void loop() {
if (softSerial.available() > 0) {
rx_data[rx_counter] = softSerial.read();
if (rx_counter == 0 && rx_data[0] != STX) {
Serial.println("Out of sync!"); // do not increment rx_counter
} else {
rx_counter++;
}
if (rx_counter >= 14) {
rx_counter = 0; // reset counter
if (rx_data[0] == STX && rx_data[13] == ETX) { // packet starts with STX and ends with ETX
byte calc_checksum = 0;
for (int i = 0; i < 6; i++) { // data with checksum
calc_checksum ^= ascii_char_to_num(rx_data[i*2+1]) * 16 + ascii_char_to_num(rx_data[i*2+2]);
}
if (calc_checksum == 0) {
Serial.print("ID: ");
for (int i = 1; i <= 10; i++) {
Serial.write(rx_data[i]);
}
Serial.println();
} else {
Serial.println("Checksum ERROR!");
}
} else {
Serial.println("Incorrect packet!");
}
}
}
}
// convert a single hex character to its byte value using ASCII table (see https://ru.wikipedia.org/wiki/ASCII)
byte ascii_char_to_num(byte a) {
a -= '0'; // 0..9
if (a > 9) a -= 7; // A..F
return a;
} 
Есть более железное во всех смыслах решение - применить RS-485 module for Arduino (MAX485), с ними можно хоть вокруг дома провод обмотать.