Arduino на автомийці ч. 2

Продовжуємо розгляд застосування Arduino для автомийки самообслуговування. Розглянемо роботу по мережі і спілкування з купюропріємником Cashcode.
Початок див. тут

Інтернет клієнт

Активуємо відразу клієнт і сервер

#include <Ethernet.h>

EthernetServer server(80);
byte mac[] = { 0xDE, 0x23, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 100);
Ethernet.begin(mac, ip);
server.begin();


Посилаємо на сервер інформацію, наприклад про прийнятої купюрі

int sendInfo(string pay)
{
EthernetClient client;

if (client.connect(domenip, 80) )
{ 
client.println("GET /get_money.php?pay="+pay+" HTTP/1.1"); 
client.println("Host: www.domen.ru");
client.println("Connection: keep-alive");
client.println();
} else { Serial.println("connection failed"); return 0; }

delay(100);

char c; 
while (client.available())
{
c=client.read();
}
client.stop();

return (1);
}




Активували в попередньому розділі. Перевіряємо наявність запитів.
for (int sock = 0; sock < MAX_SOCK_NUM; sock++) {
EthernetClient sclient = server.available_(sock);
myserver(sclient);
}


Виконуємо запит. У відповіді виводимо поточне значення вартості хвилини обладнання (таймери).
void myserver(EthernetClient client)
{
if (!client) return;
char clientline[100]; 
int index = 0;
while (client.available()) {
char c = client.read();
if(index<99) clientline[index] = c;
index++;
}

if(strstr(clientline, "water")!=NULL) digitalWrite(2, LOW); //вода
if(strstr(clientline, "pena")!=NULL) digitalWrite(3, LOW); //піна
if(strstr(clientline, "vosk")!=NULL) digitalWrite(4, LOW); //віск

client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println();
client.println("<!DOCTYPE HTML>"); client.println("<html>");
for (int j = 1; j < 6; j++) {
client.print("timer "); client.print(j); client.print(" is "); client.print(EEPROM.read(j)); client.println("<br />");
} 
client.println("</html>");
delay(100);
client.stop(); 
}


Купюропріємник Cashcode
Працює через послідовний порт на рівнях TTL за допомогою бібліотеки SoftwareSerial.
SoftwareSerial mySerial(14, 15); // RX, TX
uint8_t poll[] = {0x02, 0x03, 0x06, 0x33, 0xDA, 0x81};
uint8_t ack[] = {0x02, 0x03, 0x06, 0x00, 0x0C2, 0x82};


Як уже сказано у мене Cashcode працює по протоколу CCNET. Можливі варіанти, треба уточнювати у продавця. Суть протоколу в тому, що система періодично (кілька разів в секунду достатньо) запитує у купюроприймача його стан (команда POOL). Той відповідає. Якщо у відповіді є інформація, потрібно підтвердити її отримання відповідною командою (ACK).
Формат команди: SYNC ADR LNG CMD DATA CRC
SYNC: 1 byte код [02H]
ADR: 1 byte адреса купюроприймача
LNG: 1 byte* довжина даних
CMD: 1 byte команда
DATA 0 to 250 bytes Дані
CRC: 2 bytes контрольна сума
Посилаємо команду.
void sendCCNET(uint8_t *com)
{
for(char i=0; i<com[2]; i++) mySerial.write(com[i]);
}

Якщо купюроприймач прислав нам у відповідь команду 0x81, значить він взяв купюру. В даних міститься номінал. У мене це: 2=10 рублів, 3=50 рублів, 4=100 рублів, 5=500 рублів, 6=1000 рублів, 7=5000 рублів. Можливі варіанти, залежить від прошивки.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.