Табло курса валют управляемое по HTTP
- Войдите на сайт для отправки комментариев
Решил не засирать все темы понемногу, потому буду задалбывать централизованно.
Базовая идея:
3 валюты на 24 =3*(4+4) семисегментниках.
Управление по сети (Так надо, возможно ихдудет несколько).
Восстановление статуса после ребута.
Управление: UNO, W5100 (сеть), 3хMAX7219ENG.
Блок с езернетом в помещении(требования безопасности), максы и диоды выносные, на щите.
Пока предвижу грабли: W5100 и максы на SPI, но вот SS ноги у макса то и нету. Как их поделить?
- Мне видится вариант: в сетапе выставить табло и отключить его управление(как?), далее уже включать w5100 и писать курс при поступлении оного в ЕЕПРОМ, далее ребут. Есть потрезвее мысли?
грабли №2 Семисегментники с общим анодом(дада искал, нету как класса). Вроде буржуины пишут что если ОА сегменты включить поменяв DIG и SEG ноги местами, то работать будет, но библу символов надо писать свою т.к. картинку будет транспонировать (8. на 1ю цифру выдаст "-" на все цифры). Кто что думает по сабжу?
Пока код теоретически такой:
#include <SPI.h> #include <Ethernet.h> #include <EEPROM.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; char curr[] = {'0','0','0','0','2','0','0','0','0','2','0','0','0','0','2','0','0','0','0','2','0','0','0','0','2','0','0','0','0','2'}; IPAddress ip(192, 168, 100, 100); // IP address, may need to change depending on network EthernetServer server(80); // create a server at port 80 String HTTP_req; // stores the HTTP request boolean LED_status = 0; // state of LED, off by default void setup() { Ethernet.begin(mac, ip); // initialize Ethernet device server.begin(); // start to listen for clients Serial.begin(9600); // for diagnostics pinMode(2, OUTPUT); // LED on pin 2 } void loop() { EthernetClient client = server.available(); // try to get client if (client) { // got client? boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { // client data available to read char c = client.read(); // read 1 byte (character) from client HTTP_req += c; // save the HTTP request 1 char at a time // last line of client request is blank and ends with \n // respond to client only after last line received if (c == '\n' && currentLineIsBlank) { // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); // send web page client.println("<!DOCTYPE html>"); client.println("<html>"); client.println("<head>"); client.println("<title>LED screen Control</title>"); client.println("</head>"); client.println("<body>"); client.println("<h1>LED</h1>"); client.println("<p>Input currencies: buy - sell - dot position </p>"); client.println("<form method=\"get\">"); client.println("USD: <INPUT NAME=\"1\" SIZE=\"4\" MAXLENGTH=\"4\" > <INPUT NAME=\"2\" SIZE=\"5\" MAXLENGTH=\"5\" ><INPUT NAME=\"3\" SIZE=\"1\" MAXLENGTH=\"1\" ><BR> "); client.println("EUR: <INPUT NAME=\"4\" SIZE=\"4\" MAXLENGTH=\"4\" > <INPUT NAME=\"5\" SIZE=\"5\" MAXLENGTH=\"5\" ><INPUT NAME=\"6\" SIZE=\"1\" MAXLENGTH=\"1\" ><BR> "); client.println("RUR: <INPUT NAME=\"7\" SIZE=\"4\" MAXLENGTH=\"4\" > <INPUT NAME=\"8\" SIZE=\"5\" MAXLENGTH=\"5\" ><INPUT NAME=\"9\" SIZE=\"1\" MAXLENGTH=\"1\" ><BR> "); client.println("<INPUT TYPE=SUBMIT>"); client.println("</form>"); client.println("</body>"); client.println("</html>"); Serial.print(HTTP_req); if (HTTP_req.indexOf("i0=") > -1) { // see if usd_part_1 come for (int i=0; i <= 5; i++){ //забить значения курсов String ss="i";ss+=i;ss+="="; int charpos=HTTP_req.indexOf(ss)+3; for (int j=0; j <= 3; j++){ curr[i*5+j]=HTTP_req.charAt(int (charpos));} } for (int i=6; i <= 8; i++){ // забить позиции точек String ss="i";ss+=i;ss+="="; int charpos=HTTP_req.indexOf(ss)+3; curr[(i-6)*10+4]=HTTP_req.charAt(int (charpos)); curr[(i-6)*10+9]=HTTP_req.charAt(int (charpos)); } Serial.println(curr); HTTP_req = "";} // finished with request, empty string break; } // every line of text received from the client ends with \r\n if (c == '\n') { // last character on line of received text // starting new line with next character read currentLineIsBlank = true; } else if (c != '\r') { // a text character was received from client currentLineIsBlank = false; } } // end if (client.available()) } // end while (client.connected()) delay(1); // give the web browser time to receive the data client.stop(); // close the connection } // end if (client) }
Отрисовать страничку, получить данные, записать их в ЕЕПРОМ
За неимением w5100, получаю строку из сериала
#include <EEPROM.h> char curr[30]; String HTTP_req,s1; // stores the HTTP request boolean stringComplete = false; // whether the string is complete void setup() { Serial.begin(9600); for (int i = 0; i <=29; i++) {curr[i]=EEPROM.read(i);delay(10);}; delay(100); Serial.println(curr); s1.reserve(200); } void loop() { if (stringComplete) { Serial.println(s1); // clear the string: HTTP_req=s1; s1 = ""; stringComplete = false; } if (HTTP_req.indexOf("i0=") > -1) { // see if usd_part_1 come for (int i=0; i <= 5; i++){ //забить значения курсов String ss="i";ss+=i;ss+="="; int charpos=HTTP_req.indexOf(ss)+3; for (int j=0; j <= 3; j++){ curr[i*5+j]=HTTP_req.charAt(int (charpos));} } for (int i=6; i <= 8; i++){ // забить позиции точек String ss="i";ss+=i;ss+="="; int charpos=HTTP_req.indexOf(ss)+3; curr[(i-6)*10+4]=HTTP_req.charAt(int (charpos)); curr[(i-6)*10+9]=HTTP_req.charAt(int (charpos)); } Serial.println(curr); for (int i = 0; i <= 29; i++) {EEPROM.write(i, curr[i]); curr[i]='0';} for (int i = 0; i <=29; i++) curr[i]=EEPROM.read(i); Serial.println(curr); HTTP_req = "";} // finished with request, empty string } void serialEvent() { while (Serial.available()) { // get the new byte: char inChar = (char)Serial.read(); // add it to the inputString: s1 += inChar; // if the incoming character is a newline, set a flag // so the main loop can do something about it: if (inChar == '\n') { stringComplete = true; } } }
работу с ЕЕПРОМ пока не перенес в основу.
как это нету 7-сегментника с общим анодом? Первая попавшаяся ссылка . Достать нужного размера не проблема.
как это нету 7-сегментника с общим анодом? Первая попавшаяся ссылка . Достать нужного размера не проблема.
К сожалению править первый пост низя. Имелось в виду, что взял ОА т.к. 38мм ОК нету (хотя по даташиту и есть). Есличо Украина.
SPI на W5100 активен только в те моменты когда вы непосредственно к нему обращаетесь так C++ на микроконтроллерах линейный язык(выполняется одним потоком) то можно быть абсолютно увереным что SPI свободен для следующих команд на другие устройство. главное не забывать CS чипа(MAX7219) отключать по завершении команд, чтобы когда пойдет опрос сетевушки она не мешалась.
вобщем вот мой пример работы с максами
Вот видео как это работало http://www.youtube.com/watch?v=BAYQVUJWFqI И сама схема
Кто-то где-то писал, что банального ложения CS пина 5100 не хватает, чтобы ее отрубить. А если и можна, то она же слушать клиента в общем все равно должна. Далее... SS лапы у 7219 нету, она есть у 7221, а у 7219 это LOAD... который по умолчанию висит на 11 ноге. Но вот вопрос какой возник. При инициализации LedControl lc1=LedControl(9,10,11,1); видимо оно на софтовом спае и можна спакойно эти ноги переткнуть куда душе угодно (???). Тоесть они вообще не мешают друг-другу. А на тормоза любого из них мне кагбе плевать.
Только что решил не ждать пока придут сегменты, и купил 2 по 4 ОА для тестов. Сижу паяю их и тут доходит что я баран имею макетку. А с ног то уже пообгрызал лишнее. Завтра пойду еще пару куплю... Они по баксу, можна портить.
вобщем вот мой пример работы с максами
как по мне, то это высший пилотаж... А я пока только к штурвалу примеряюсь и ищу кнопку ВКЛ.
Кто-то где-то писал, что банального ложения CS пина 5100 не хватает, чтобы ее отрубить.
этот баг описан в application note на сайте wiznet
в последней версии arduino ethernet shield этот баг учтен и если на схему посомтрите то CS через инвертор подключен к еще одному входу wiznet5100, так что если используете правильный shield или устете при разработке собственной платы то wiznet5100 мешать другим на шине SPI не будет
что касается MAX7219 то к ней можно подключать и ОК и ОА. просто в одном случае будет работать встроенный декодер BCD а в другом не будет и нужно будет самому управлять отдельными сегментами
кстати семисегментник не единственный вариант, есть готовые панели, например sureelectronics знаменита недорогими панельками, к тому же они есть с несколькими цветами и позволяют нарашивать их в большую матрицу
вот я такую давно купил, только сейчас запустил:
управление похоже на max7219, есть индивидуальная адресация каждой точки, есть регулировка яркости, режим мигания и есть библиотека для ардуинки
этот баг описан в application note на сайте wiznet
в последней версии arduino ethernet shield этот баг учтен и если на схему посомтрите то CS через инвертор подключен к еще одному входу wiznet5100, так что если используете правильный shield или устете при разработке собственной платы то wiznet5100 мешать другим на шине SPI не будет
что касается MAX7219 то к ней можно подключать и ОК и ОА. просто в одном случае будет работать встроенный декодер BCD а в другом не будет и нужно будет самому управлять отдельными сегментами
кстати семисегментник не единственный вариант
Спасибо, w5100 еще не приехала, потому пока ревизию не знаю, и совсем не факт что кетайцы изменили :)
Про подключение ОА уже нашел, купил и напаял на мекетку 8 семисегментов ОА и обнаружил что в итоге имею 8 катодов, 8 анодов и это более чем логично.
По поводу декодера, разве он в чипе? Не библиотека ledcontrol за него отвечает?
По поводу выбора. Как кто-то уже писал, проэкт и бюджет утверждены, комплектующие оплачены... Потому лепим что есть. Да и ждать от китайцев приходу некогда...
Спасибо, w5100 еще не приехала, потому пока ревизию не знаю, и совсем не факт что кетайцы изменили :)
я писал про ревизию платы arduino ethernet shield. Баг есть в любом чипе wiznet5100, на свежей плате ардуино он обыгран как написано разработчиком чипа
По поводу декодера, разве он в чипе? Не библиотека ledcontrol за него отвечает?
советую читать первоисточник )) даташит на max7219
ledcontrol.cpp
ledcontrol.h
как-то намекает... как по мне... :) Хотя я еще далек от темы...
А если подправить ее слехка? Передавать по 8 байт из программы. Транспонировать и передать в цикле все 8 значений?
судя по размеру таблицы charTable она расчитана на показ символов на матрице 8х8
не представляю как она могла бы быть применима к семисегментному индикатору
ведь max7219 сделана чтобы управлять матрицей из 64 светодиодов в формате 8х8
управление несколькими семисегментными (или 8-ми с точкой) индикаторами это только частный случай
такая этажерка вписанная в ledcontrol имеет место быть, или я как обычно гоню?
судя по размеру таблицы charTable она расчитана на показ символов на матрице 8х8
не представляю как она могла бы быть применима к семисегментному индикатору
ведь max7219 сделана чтобы управлять матрицей из 64 светодиодов в формате 8х8
управление несколькими семисегментными (или 8-ми с точкой) индикаторами это только частный случай
да нет... глянь на содержимое чартейбла :) [0-15] = 0-F на сс.. 8й бит всегда пустой для точки (его dp меняет), 1-7 =G-А индикаторы.
первый же [1]="0" (B01111110)- погашены 1(G) и 8(DP), [11]="A" - (B01110111)-погашена D. и т.д.
советую читать первоисточник )) даташит на max7219
почитал... BCD в максе имеет меньше значений чем хотелось бы авторам либы... A,b,C.d там не предусмотрены, но есть в либе. как и прочие нереальные символы.
посмотрел что сотворил и сам не понял... В общем поправил на трезвую голову.
Как то у вас все сложно получается - у меня все проще было - больше боролся со спецификой схемы: писал таблицу сиволов и знакогенератор.
Как то у вас все сложно получается - у меня все проще было - больше боролся со спецификой схемы: писал таблицу сиволов и знакогенератор.
Пакость в том что если ОА воткнуть как есть, она не загорится (диоды же :) ). Выход - переверуть DIG/SEG, тогда все работает, но! "8." на 1 цифру залепит все "-", на 4ю "_" и т.д. Вообще можна чармапом описать все возможные варианты (127), но имел я этим игратся. Проще програмно перевернуть DIG/SEG перед выводом. Был еще вариант по точкам выводить поменяв Х/У местами.
Скурил пол пачки сигарет чтобы не побить монитор... Т.к. собирался поменять штатную либу, то сделал копию, а оригинал правил. В результате: нет такой процедуры... Как нету, я ее сам нарисовал и кейворд подсветило... НЕ ЗНАЮ что это было, но какого-то хрена либу не перекомпилило или точнее компилило из копии... Заработало после того как переименовал папку, файлы, ВСЕ процедуры в либах, обращения в проге и подключил ее с новым именем. Понял что происходит - когда вытер копию, переименование не помогло. Ну понятно лоханулся бы по делу, ну - сам дурак, но не так же жестко... Кто в курсе что это было?