Табло курса валют управляемое по HTTP

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Решил не засирать все темы понемногу, потому буду задалбывать централизованно.

Базовая идея:

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;
    } 
  }
}

работу с ЕЕПРОМ пока не перенес в основу.



 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

как это нету 7-сегментника с общим анодом? Первая попавшаяся ссылка . Достать нужного размера не проблема.

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Michal пишет:

как это нету 7-сегментника с общим анодом? Первая попавшаяся ссылка . Достать нужного размера не проблема.

К сожалению править первый пост низя. Имелось в виду, что взял ОА т.к. 38мм ОК нету (хотя по даташиту и есть). Есличо Украина.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

SPI на W5100 активен только в те моменты когда вы непосредственно к нему обращаетесь так C++ на микроконтроллерах линейный язык(выполняется одним потоком) то можно быть абсолютно увереным что SPI свободен для следующих команд на другие устройство. главное не забывать CS чипа(MAX7219) отключать по завершении команд, чтобы когда пойдет опрос сетевушки она не мешалась.

вобщем вот мой пример работы с максами

#include <SPI.h>
#define CS_PIN 53
     
int maxInUse = 6;    //change this variable to set how many MAX7219's you'll use
     
const byte code[66][16] = {
      255,255,233,233,225,225,225,225,225,225,225,225,233,233,255,255,
      96,112,96,96,96,96,96,96,96,96,96,96,96,96,96,96,
      255,255,233,104,96,96,104,255,255,137,129,129,137,137,255,255,
      255,255,104,104,96,96,104,255,255,104,96,96,104,104,255,255,
      225,225,225,225,225,225,233,255,255,104,96,96,96,96,96,96,
      255,255,233,137,129,129,137,255,255,104,96,96,104,104,255,255,
      255,255,137,137,129,129,137,255,255,233,225,225,233,233,255,255,
      255,255,233,104,96,96,96,96,96,96,96,96,96,96,96,96,
      255,255,233,233,225,225,233,255,255,233,225,225,233,233,255,255,
      255,255,233,233,225,225,233,255,255,104,96,96,104,104,255,255,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,12,12,255,255,255,255,255,255,//1
      0,0,0,0,0,0,0,4,8,12,255,255,255,255,255,255,//2
      0,0,0,0,0,0,0,12,0,12,255,255,255,255,255,255,//3
      0,0,0,0,0,0,4,12,0,8,255,255,255,255,255,255,//4
      0,0,0,0,0,0,12,12,0,0,255,255,255,255,255,255,//5
      0,0,0,0,0,4,12,12,0,0,200,255,255,255,255,255,//6
      0,0,0,0,0,12,12,12,0,0,192,255,255,255,255,255,//7
      0,0,0,0,2,12,12,12,0,0,192,220,255,255,255,255,//8
      0,0,0,0,18,12,12,12,0,0,192,204,255,255,255,255,//9
      0,0,0,0,22,12,12,12,0,0,192,200,255,255,255,255,//10
      0,0,0,0,30,12,12,12,0,0,192,192,255,255,255,255,//11
      0,0,0,1,30,12,12,12,0,0,192,192,254,255,255,255,//12
      0,0,0,33,30,12,12,12,0,0,192,192,222,255,255,255,//13
      0,0,0,35,30,12,12,12,0,0,192,192,220,255,255,255,//14
      0,0,0,51,30,12,12,12,0,0,192,192,204,255,255,255,//15
      0,0,0,55,30,12,12,12,0,0,192,192,200,255,255,255,//16
      0,0,0,63,30,12,12,12,0,0,192,192,192,255,255,255,//17
      0,0,128,63,30,12,12,12,0,0,192,192,192,127,255,255,//18
      0,0,192,63,30,12,12,12,0,0,192,192,192,63,255,255,//19
      0,0,193,63,30,12,12,12,0,0,192,192,192,62,255,255,//20
      0,0,225,63,30,12,12,12,0,0,192,192,192,30,255,255,//21
      0,0,227,63,30,12,12,12,0,0,192,192,192,28,255,255,//22
      0,0,243,63,30,12,12,12,0,0,192,192,192,12,255,255,//23
      0,0,247,63,30,12,12,12,0,0,192,192,192,8,255,255,//24
      0,0,255,63,30,12,12,12,0,0,192,192,192,0,255,255,//25
      0,0,255,191,30,12,12,12,0,0,192,192,64,0,255,255,//26
      0,0,255,255,30,12,12,12,0,0,192,192,0,0,255,255,//27
      0,128,255,255,30,12,12,12,0,0,192,192,0,0,127,255,//28
      0,192,255,255,30,12,12,12,0,0,192,192,0,0,63,255,//29
      0,193,255,255,30,12,12,12,0,0,192,192,0,0,62,255,//30
      0,225,255,255,30,12,12,12,0,0,192,192,0,0,30,255,//31
      0,227,255,255,30,12,12,12,0,0,192,192,0,0,28,255,//32
      0,243,255,255,30,12,12,12,0,0,192,192,0,0,12,255,//33
      0,247,255,255,30,12,12,12,0,0,192,192,0,0,8,255,//34
      0,255,255,255,30,12,12,12,0,0,192,192,0,0,0,255,//35
      0,255,255,255,30,140,12,12,0,0,64,192,0,0,0,255,//36
      0,255,255,255,30,204,12,12,0,0,0,192,0,0,0,255,//37
      0,255,255,255,158,204,12,12,0,0,0,64,0,0,0,255,//38
      0,255,255,255,255,204,12,12,0,0,0,0,0,0,0,255,//39
      128,255,255,255,255,255,12,12,0,0,0,0,0,0,0,127,//40
      192,255,255,255,255,255,12,12,0,0,0,0,0,0,0,63,//41
      193,255,255,255,255,255,12,12,0,0,0,0,0,0,0,62,//42
      225,255,255,255,255,255,12,12,0,0,0,0,0,0,0,30,//43
      227,255,255,255,255,255,12,12,0,0,0,0,0,0,0,28,//44
      243,255,255,255,255,255,12,12,0,0,0,0,0,0,0,12,//45
      247,255,255,255,255,255,12,12,0,0,0,0,0,0,0,8,//46
      255,255,255,255,255,255,12,12,0,0,0,0,0,0,0,0,//47
      255,255,137,137,129,129,137,255,255,137,129,129,137,137,255,255,//E
      255,255,137,137,129,129,137,255,255,137,129,129,129,129,129,129,//F
      255,255,137,137,129,129,129,249,249,225,225,225,233,233,255,255,//G
      225,225,225,225,225,225,233,255,255,233,225,225,225,225,225,225,//H
      0,0,129,129,0,0,129,129,129,129,129,129,129,129,131,131,//I
      112,112,96,96,96,96,96,96,96,96,96,96,233,233,255,255,//J
      225,225,225,225,225,225,233,159,159,233,225,225,225,225,225,225,//K
      129,129,129,129,129,129,129,129,129,129,129,129,233,233,255,255//L
}; 
   
// define max7219 registers
#define max7219_reg_noop        0x00
#define max7219_reg_digit0      0x01
#define max7219_reg_digit1      0x02
#define max7219_reg_digit2      0x03
#define max7219_reg_digit3      0x04
#define max7219_reg_digit4      0x05
#define max7219_reg_digit5      0x06
#define max7219_reg_digit6      0x07
#define max7219_reg_digit7      0x08
#define max7219_reg_decodeMode  0x09
#define max7219_reg_intensity   0x0a
#define max7219_reg_scanLimit   0x0b
#define max7219_reg_shutdown    0x0c
#define max7219_reg_displayTest 0x0f
     
void setup () {
     pinMode(CS_PIN,   OUTPUT);

     SPI.begin();
     init_max();
     attachInterrupt(0, creditAdd, FALLING);
}  
     
void loop () {
      byte ir=47;
      for(ir=47;ir>0;ir--){
      printNum(ir,ir);
      delay(600);}
      printTxt((char*)"E3",0);
      delay(3000);
      printTxt((char*)"GK",0);
      delay(3000);
      printTxt((char*)"JI",0);
      delay(3000);
      printTxt((char*)"LI",0);
      delay(3000);
      printTxt((char*)"HL",0);
      delay(3000);


    }
void creditAdd(){
  
}

void printTxt(char* txt, byte time){
 byte text[2]={10,10};
 if(txt[0] >= 'D' && txt[0] <= 'L')text[0] = 58+txt[0]-'E';
 if(txt[0] >= '0' && txt[0] <= '9')text[0] = txt[0]-'0';
 if(txt[1] >= 'E' && txt[1] <= 'L')text[1] = 58+txt[1]-'E';
 if(txt[1] >= '0' && txt[1] <= '9')text[1] = txt[1]-'0';
 time +=10;
 byte i=0;
 boolean e = false;
   for(i=0;i<16;i++){
     if(8-i == 0)e = true;
     if(e){
        maxOne(2,i-7,code[text[0]][i]);
        maxOne(4,i-7,code[text[1]][i]);
        maxOne(6,i-7,code[time][i]);
     }else{
        maxOne(1,8-i,code[text[0]][i]);
        maxOne(3,8-i,code[text[1]][i]);
        maxOne(5,8-i,code[time][i]);
     }
   }
  
}
void printNum(byte num, byte time){
 byte i=0;
 byte d2 = num%10;
 byte d1 = num/10;
 if(d1 == 0) d1 = 10;
 time +=10;
 boolean e = false;
   for(i=0;i<16;i++){
     if(8-i == 0)e = true;
     if(e){
        maxOne(2,i-7,code[d1][i]);
        maxOne(4,i-7,code[d2][i]);
        maxOne(6,i-7,code[time][i]);
     }else{
        maxOne(1,8-i,code[d1][i]);
        maxOne(3,8-i,code[d2][i]);
        maxOne(5,8-i,code[time][i]);
     }
   }
   //time print
}

void maxSingle( byte reg, byte col) {    
    //maxSingle is the "easy"  function to use for a     //single max7219
     
      digitalWrite(CS_PIN, LOW);       // begin    
      SPI.transfer(reg);             // specify register
      SPI.transfer(col);             //((data & 0x01) * 256) + data >> 1); // put data  
      digitalWrite(CS_PIN, LOW);       // and CS_PIN da shit
      digitalWrite(CS_PIN,HIGH);
    }
     
void maxAll (byte reg, byte col) {    // initialize  all  MAX7219's in the system
      int c = 0;
      digitalWrite(CS_PIN, LOW);  // begin    
      for ( c =1; c<= maxInUse; c++) {
      SPI.transfer(reg);  // specify register
      SPI.transfer(col);//((data & 0x01) * 256) + data >> 1); // put data
        }
      digitalWrite(CS_PIN, LOW);
      digitalWrite(CS_PIN,HIGH);
    }
     
void maxOne(byte maxNr, byte reg, byte col) {    
    //maxOne is for adressing different MAX7219's,
    //whilele having a couple of them cascaded
     
      int c = 0;
      digitalWrite(CS_PIN, LOW);  // begin    
     
      for ( c = maxInUse; c > maxNr; c--) {
        SPI.transfer(0);    // means no operation
        SPI.transfer(0);    // means no operation
      }
     
      SPI.transfer(reg);  // specify register
      SPI.transfer(col);//((data & 0x01) * 256) + data >> 1); // put data
     
      for ( c =maxNr-1; c >= 1; c--) {
        SPI.transfer(0);    // means no operation
        SPI.transfer(0);    // means no operation
      }
     
      digitalWrite(CS_PIN, LOW); // and CS_PIN da shit
      digitalWrite(CS_PIN,HIGH);
    }

void init_max(){
      byte i;
     //initiation of the max 7219
      maxAll(max7219_reg_scanLimit, 0x07);      
      maxAll(max7219_reg_decodeMode, 0x00);  // using an led matrix (not digits)
      maxAll(max7219_reg_shutdown, 0x01);    // not in shutdown mode
      maxAll(max7219_reg_displayTest, 0x00); // no display test
       for (i=1; i<=8; i++) {                // empty registers, turn all LEDs off
        maxAll(i,0);
      }
      maxAll(max7219_reg_intensity, 0x0f & 0x0f);    // the first 0x0f is the value you can set
                                                      // range: 0x00 to 0x0f 
}

Вот видео как это работало http://www.youtube.com/watch?v=BAYQVUJWFqI И сама схема

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Кто-то где-то писал, что банального ложения CS пина 5100 не хватает, чтобы ее отрубить. А если и можна, то она же слушать клиента в общем все равно должна. Далее... SS лапы у 7219 нету, она есть у 7221, а у 7219 это LOAD... который по умолчанию висит на 11 ноге. Но вот вопрос какой возник. При инициализации LedControl lc1=LedControl(9,10,11,1);   видимо оно на софтовом спае и можна спакойно эти ноги переткнуть куда душе угодно (???). Тоесть они вообще не мешают друг-другу. А на тормоза любого из них мне кагбе плевать.

 

Только что решил не ждать пока придут сегменты, и купил 2 по 4 ОА для тестов. Сижу паяю их и тут доходит что я баран имею макетку. А с ног то уже пообгрызал лишнее. Завтра пойду еще пару куплю... Они по баксу, можна портить.

teodor4ik
Offline
Зарегистрирован: 04.11.2013

NeiroN пишет:

вобщем вот мой пример работы с максами

как по мне, то это высший пилотаж... А я пока только к штурвалу примеряюсь и ищу кнопку ВКЛ.

axill
Offline
Зарегистрирован: 05.09.2011

teodor4ik пишет:

Кто-то где-то писал, что банального ложения CS пина 5100 не хватает, чтобы ее отрубить.

этот баг описан в application note на сайте wiznet

в последней версии arduino ethernet shield этот баг учтен и если на схему посомтрите то CS через инвертор подключен к еще одному входу wiznet5100, так что если используете правильный shield или устете при разработке собственной платы то wiznet5100 мешать другим на шине SPI не будет

что касается MAX7219 то к ней можно подключать и ОК и ОА. просто в одном случае будет работать встроенный декодер BCD а в другом не будет и нужно будет самому управлять отдельными сегментами

кстати семисегментник не единственный вариант, есть готовые панели, например sureelectronics знаменита недорогими панельками, к тому же они есть с несколькими цветами и позволяют нарашивать их в большую матрицу

вот я такую давно купил, только сейчас запустил:

управление похоже на max7219, есть индивидуальная адресация каждой точки, есть регулировка яркости, режим мигания и есть библиотека для ардуинки

teodor4ik
Offline
Зарегистрирован: 04.11.2013

axill пишет:

этот баг описан в application note на сайте wiznet

в последней версии arduino ethernet shield этот баг учтен и если на схему посомтрите то CS через инвертор подключен к еще одному входу wiznet5100, так что если используете правильный shield или устете при разработке собственной платы то wiznet5100 мешать другим на шине SPI не будет

что касается MAX7219 то к ней можно подключать и ОК и ОА. просто в одном случае будет работать встроенный декодер BCD а в другом не будет и нужно будет самому управлять отдельными сегментами

кстати семисегментник не единственный вариант

Спасибо, w5100 еще не приехала, потому пока ревизию не знаю, и совсем не факт что кетайцы изменили :)

Про подключение ОА уже нашел, купил и напаял на мекетку 8 семисегментов ОА и обнаружил что в итоге имею 8 катодов, 8 анодов и это более чем логично. 

По поводу декодера, разве он в чипе? Не библиотека ledcontrol за него отвечает?

По поводу выбора. Как кто-то уже писал, проэкт и бюджет утверждены, комплектующие оплачены... Потому лепим что есть. Да и ждать от китайцев приходу некогда... 

axill
Offline
Зарегистрирован: 05.09.2011

teodor4ik пишет:

Спасибо, w5100 еще не приехала, потому пока ревизию не знаю, и совсем не факт что кетайцы изменили :)

я писал про ревизию платы arduino ethernet shield. Баг есть в любом чипе wiznet5100, на свежей плате ардуино он обыгран как написано разработчиком чипа

teodor4ik пишет:

По поводу декодера, разве он в чипе? Не библиотека ledcontrol за него отвечает?

советую читать первоисточник )) даташит на max7219

teodor4ik
Offline
Зарегистрирован: 04.11.2013
void LedControl::setChar(int addr, int digit, char value, boolean dp) {
    int offset;
    byte index,v;

    if(addr<0 || addr>=maxDevices)
 return;
    if(digit<0 || digit>7)
  return;
    offset=addr*8;
    index=(byte)value;
    if(index >127) {
 //nothing define we use the space char
 value=32;
    }
    v=charTable[index];
    if(dp)
 v|=B10000000;
    status[offset+digit]=v;
    spiTransfer(addr, digit+1,v);
}

ledcontrol.cpp

 

ledcontrol.h

const static byte charTable[128] = {
    B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,
    B01111111,B01111011,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,
.... bla bla lbla..

 

как-то намекает... как по мне... :) Хотя я еще далек от темы...

 

А если подправить ее слехка? Передавать по 8 байт из программы. Транспонировать и передать в цикле все 8 значений?

axill
Offline
Зарегистрирован: 05.09.2011

судя по размеру таблицы charTable она расчитана на показ символов на матрице 8х8

не представляю как она могла бы быть применима к семисегментному индикатору

ведь max7219 сделана чтобы управлять матрицей из 64 светодиодов в формате 8х8

управление несколькими семисегментными (или 8-ми с точкой) индикаторами это только частный случай

teodor4ik
Offline
Зарегистрирован: 04.11.2013
void LedControl::setDigits(int addr, char[8] value) {
    int offset;
    char[8] v,exc;
  

    if(addr<0 || addr>=maxDevices)
 return;
    
    for(int x=0;x<=7;x++)
      for(int y=0;y<=7;y++)
       {
       bitWrite(exc[x],y,bitRead(value[y],x));
       }
    
    for(int i=0;i<=7;i++)
      v[i]=charTable[exc[i]];

     offset=addr*8; \\ чо это такое?
     status[offset]=v;
    
    for(int i=0;i<=7;i++)
      spiTransfer(addr,i+1,v[i]);

такая этажерка вписанная в ledcontrol имеет место быть, или я как обычно гоню?

 

axill пишет:

судя по размеру таблицы 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. и т.д.  

axill пишет:

советую читать первоисточник )) даташит на max7219

почитал... BCD в максе имеет меньше значений чем хотелось бы авторам либы... A,b,C.d там не предусмотрены, но есть в либе. как и прочие нереальные символы.

teodor4ik
Offline
Зарегистрирован: 04.11.2013

посмотрел что сотворил и сам не понял... В общем поправил на трезвую голову. 

void LedControl::setDigits(int addr, byte values[8], byte dps) {
    int offset;
    byte v[8],exc[8];
   
    if(addr<0 || addr>=maxDevices)
 return;

    for(int i=0;i<=7;i++)        \\проставляем сегменты из табл.символов в масив v
      v[i]=charTable[values[i]];

    for(int x=0;x<=7;x++)        \\транспонируем для ОА меняем DIG и SEG (колонки/столбцы) в матрице местами в масив exc
      for(int y=1;y<=7;y++)      \\с 1 т.к. точек пока нету
         bitWrite(exc[x],y,bitRead(v[y],x));
       
    for(int i=0;i<=7;i++)        \\проставляем точки из dps (дабы не плодить сущности в charTable)
      exc[i]=bitWrite(exc[i],0,bitRead(dps,x));
   
     offset=addr*8;               \\ чо это такое?
     status[offset]=v[7];         \\и где оно используется в либе так и не понял
    
    for(int i=0;i<=7;i++)         \\ вываливаем все гуртом в спай
      spiTransfer(addr,i+1,exc[i]);
    
}

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Как то у вас все сложно получается - у меня все проще было - больше боролся со спецификой схемы: писал таблицу сиволов и знакогенератор.

teodor4ik
Offline
Зарегистрирован: 04.11.2013

NeiroN пишет:

Как то у вас все сложно получается - у меня все проще было - больше боролся со спецификой схемы: писал таблицу сиволов и знакогенератор.

Пакость в том что если ОА воткнуть как есть, она не загорится (диоды же :) ). Выход - переверуть DIG/SEG, тогда все работает, но! "8." на 1 цифру залепит все "-", на 4ю "_" и т.д. Вообще можна чармапом описать все возможные варианты (127), но имел я этим игратся. Проще програмно перевернуть DIG/SEG перед выводом. Был еще вариант по точкам выводить поменяв Х/У местами.

 

Скурил пол пачки сигарет чтобы не побить монитор... Т.к. собирался поменять штатную либу, то сделал копию, а оригинал правил. В результате: нет такой процедуры... Как нету, я ее сам нарисовал и кейворд подсветило... НЕ ЗНАЮ что это было, но какого-то хрена либу не перекомпилило или точнее компилило из копии... Заработало после того как переименовал папку, файлы, ВСЕ процедуры в либах, обращения в проге и подключил ее с новым именем. Понял что происходит - когда вытер копию, переименование не помогло. Ну понятно лоханулся бы по делу, ну - сам дурак, но не так же жестко...  Кто в курсе что это было?