Есть Сервер(WR703N) с подключенным к нему Arduino(Mega2560) c NRF24l01.
Клиенты(atmega328p) c DS18B20 и реле (Связь NRF24l01) - отсылают по запросу
Код:
Client Send => 2 | 26.25 | 26.25 | 1 | 0 | 0 | 0 | = 14
2 = id
26.25 = temp
40.00 = влажность
1 | 0 | 0 | 0 = Реле
14 = длина строки
Клиент Ардуино:
PHP код:
#include <SPI.h>
#include "RF24.h"
byte cleint_id = 3;
unsigned long time1=0; //Таймер на 1 сек
RF24 radio(9, 10);
const uint64_t pipes[2] = {
0xF0F0F0F000LL, 0xF0F0F0F0FFLL}; // адреса каналов приема и передачи
typedef struct{
byte id;
float t;
float h;
char data[5];
}
nf1;
nf1 client;
typedef struct{
byte id;
byte data[5];
}
nf0;
nf0 server;
void setup(){
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
radio.begin();
Serial.begin(9600);
radio.setDataRate(RF24_250KBPS); // Скорость передачи
radio.setChannel(100); // Номер канала от 0 до 127
radio.setRetries(15,15); // Кол-во попыток и время между попытками
radio.openWritingPipe(pipes[1]); // Открываем канал передачи
radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема
radio.startListening(); // Начинаем слушать эфир
}
void loop(){
if(radio.available()){
radio.read(&server, sizeof(server));
log();
if(server.id == cleint_id){
Rele_Write();
write_temp();
}
}
//---------------------------------для чтения сенсоров--------------------------
if ((millis()-time1) >= 1000) { // обновляем сенсоры раз в секунду
client.id = cleint_id; // Номер id
client.t = 0;
client.h = 0;
Rele_Read();
time1 = millis();
}
//------------------------------------------------------------------------------
}
void write_temp()
{
Rele_Read();
radio.stopListening();
delay(20);
radio.write(&client, sizeof(client));
radio.startListening();
delay(20);
}
void Rele_Read(){
if (digitalRead(3) == HIGH) { client.data[1] = '1';}
if (digitalRead(4) == HIGH) {client.data[2] = '1';}
if (digitalRead(5) == HIGH) {client.data[3] = '1';}
if (digitalRead(6) == HIGH) {client.data[4] = '1';}
if (digitalRead(7) == HIGH) {client.data[5] = '1';}
if (digitalRead(3) == LOW) { client.data[1] = '0';}
if (digitalRead(4) == LOW) { client.data[2] = '0';}
if (digitalRead(5) == LOW) { client.data[3] = '0';}
if (digitalRead(6) == LOW) { client.data[4] = '0';}
if (digitalRead(7) == LOW) { client.data[5] = '0';}
}
void Rele_Write(){
if (server.data[1] == 1) { digitalWrite(3, HIGH);}
if (server.data[2] == 1) { digitalWrite(4, HIGH);}
if (server.data[3] == 1) { digitalWrite(5, HIGH);}
if (server.data[4] == 1) { digitalWrite(6, HIGH);}
if (server.data[5] == 1) { digitalWrite(7, HIGH);}
if (server.data[1] == 0) { digitalWrite(3, LOW);}
if (server.data[2] == 0) { digitalWrite(4, LOW);}
if (server.data[3] == 0) { digitalWrite(5, LOW);}
if (server.data[4] == 0) { digitalWrite(6, LOW);}
if (server.data[5] == 0) { digitalWrite(7, LOW);}
}
void log(){
/* логирование */
Serial.print("Server Send => ");
Serial.print(server.id);
Serial.print(" | ");
Serial.print(server.data[1]);
Serial.print(" | ");
Serial.print(server.data[2]);
Serial.print(" | ");
Serial.print(server.data[3]);
Serial.print(" | ");
Serial.print(server.data[4]);
Serial.print(" | ");
Serial.print(server.data[5]);
Serial.print(" = ");
Serial.println(sizeof(server));
/*==============================*/
}
Сервер Ардуино:
PHP код:
#include <SPI.h>
#include "RF24.h"
#include <string.h>
RF24 radio(9, 10);
const uint64_t pipes[2] = {
0xF0F0F0F000LL, 0xF0F0F0F0FFLL};
typedef struct{
byte id;
float t;
float h;
char data[5];
}
nf1;
nf1 client;
typedef struct{
byte id;
byte data[5];
}
nf0;
nf0 server;
String inputString = "";
boolean stringComplete = false;
char buffer[32];
void setup(){
Serial.begin(115200);
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.setChannel(100);
radio.setRetries(15,15);
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1, pipes[1]);
radio.startListening();
}
void loop(){
radio.startListening();
delay(20);
if(radio.available()){
radio.read(&client, sizeof(client));
Serial.print("Client Send => ");
Serial.print(client.id);
Serial.print(" | ");
Serial.print(client.t);
Serial.print(" | ");
Serial.print(client.h);
Serial.print(" | ");
Serial.print(client.data[1]);
Serial.print(" | ");
Serial.print(client.data[2]);
Serial.print(" | ");
Serial.print(client.data[3]);
Serial.print(" | ");
Serial.print(client.data[4]);
Serial.print(" | ");
Serial.print(client.data[5]);
Serial.print(" | ");
Serial.println(sizeof(client));
}
if (stringComplete) {
inputString.toCharArray(buffer,32);
server.id = atoi(strtok(buffer,":"));
server.data[1] = atoi(strtok(NULL,":"));
server.data[2] = atoi(strtok(NULL,":"));
server.data[3] = atoi(strtok(NULL,":"));
server.data[4] = atoi(strtok(NULL,":"));
server.data[5] = atoi(strtok(NULL,":"));
/* логирование */
Serial.print("Server Send => ");
Serial.print(server.id);
Serial.print(" | ");
Serial.print(server.data[1]);
Serial.print(" | ");
Serial.print(server.data[2]);
Serial.print(" | ");
Serial.print(server.data[3]);
Serial.print(" | ");
Serial.print(server.data[4]);
Serial.print(" | ");
Serial.print(server.data[5]);
Serial.print(" = ");
Serial.println(sizeof(server));
/*==============================*/
radio.stopListening();
delay(20);
radio.write(&server, sizeof(server));
inputString = "";
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '.') {
stringComplete = true;
}
}
}
Служба
/etc/init.d/com_port
PHP код:
#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2011 OpenWrt.org
SERVICE_USE_PID=1245
START=50
start() {
i=0
while [ true ]
do
while read LINE
do
IFS="|"
i=$(($i+1))
set -- $LINE
id=$1
if [ ${id:0:1} = "C" ]
then
t=$2
h=$3
rele1=$4
rele2=$5
rele3=$6
rele4=$7
rele5=$8
printf "{
\"temperature\":\"%s\",
\"humidity\":\"%s\",
\"rele1\":\"%s\",
\"rele2\":\"%s\",
\"rele3\":\"%s\",
\"rele4\":\"%s\"
}" "$t" "$h" "$rele1" "$rele2" "$rele3" "$rele4" > /www/iphome/json
else
rele1=$2
rele2=$3
rele3=$4
rele4=$5
rele5=$6
printf "2:%s:%s:%s:%s:0:." "$rele1" "$rele2" "$rele3" "$rele4" > /www/iphome/db/rele
fi
done < /dev/ttyACM0
/bin/sleep 3
done
}
stop() {
killall com_port
}
Создает 2 файла для дальнейшей работы.
При добавлении службу в автозагрузку
Код:
/etc/init.d/com_port enable
отказывается работать весь сервер.
Пришлось найти другой способ.
Добавил в
/etc/rc.local
Код:
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
stty -F /dev/ttyATH0 cs8 115200 -ixoff -evenp -xcase -echo
sleep 1
/etc/init.d/com_port start
exit 0
Это все работает пока отсылаются данные, но на следующее утро. При отправке не чего не происходит. Led на TX на Mega2560 мигает, но не чего не приходит. по ходу сама служба висит.
Помогите разобраться с этим.
Мониторинг данные каждую сек - обязательно., так как в дальнейшем будет добавлена сигнализация
Веб морда
Сервер
Клиент
Адрес
http://188.138.190.150:81