gpt4 book ai didi

c++ - 如何通过串行 w/Arduino 将动态文本写入 LED 显示屏

转载 作者:行者123 更新时间:2023-11-28 07:49:46 30 4
gpt4 key购买 nike

所以我认为我很接近,但我碰壁了。这是我想要完成的:我有一个计算点击次数的程序,并且会在值更新时将串行数据发送到 Arduino (UNO)。

到目前为止,我有以下工作:- LED 显示屏上的滚动字幕(来自 Freetronics - http://www.freetronics.com/products/dot-matrix-display-32x16-red#.UOBeKInjmdM)- 通过串口将新数据写入 Arduino 的 Python 脚本(使用 PySerial)- Arduino 正在串行监视器中正确接收数据...

所以我的问题是我无法让它写入 LED 显示屏,请帮忙!

这是我的代码:

import serial
import argparse

myserial = serial.Serial('/dev/tty.usbmodemfd121', 9600)

parser = argparse.ArgumentParser(description='Example with non-optional arguments')

parser.add_argument('count', action="store", type=str)

results = parser.parse_args()

count = results.count
message = "total clicks: " + count

print message

myserial.write(message)

示例:$ python app.py 200这将向 Arduino 发送“总点击次数:200”

这是我的 Arduino 草图:

/*
Scrolling text demonstration sketch for Freetronics DMD.
See http://www.freetronics.com/dmd for resources and a getting started guide.
Note that the DMD library uses the SPI port for the fastest, low overhead writing to the
display. Keep an eye on conflicts if there are any other devices running from the same
SPI port, and that the chip select on those devices is correctly set to be inactive
when the DMD is being written to.
*/

// you always need the code from here...........
#include <DMD.h> // for DMD
#include <SPI.h> // SPI.h must be included as DMD is written by SPI (the IDE complains otherwise)
#include <TimerOne.h>
#include "SystemFont5x7.h"
#include "Arial_black_16.h"
#include "Arial_14.h"
#define DISPLAYS_ACROSS 1 // change to 2 for two screens, etc.
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN); // creates instance of DMD to refer to in sketch

char message[] = "test string to be updated";

char serIn; //var that will hold the bytes in read from the serialBuffer

void ScanDMD() // necessary interrupt handler for refresh scanning of DMD
{
dmd.scanDisplayBySPI();
}

void setup()
{
//initialize TimerOne's interrupt/CPU usage used to scan and refresh the display
Timer1.initialize( 5000 ); //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker.
Timer1.attachInterrupt( ScanDMD ); //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI()
dmd.clearScreen( true ); //true is normal (all pixels off), false is negative (all pixels on)

Serial.begin(9600);

}

void loop()
{

// only if there are bytes in the serial buffer execute the following code
if(Serial.available()) {
//keep reading and printing from serial untill there are bytes in the serial buffer
while (Serial.available()>0){
serIn = Serial.read(); //read Serial
Serial.write( byte(serIn));
}
//the serial buffer is over just go to the line (or pass your favorite stop char)
Serial.println();
}

// Now I want to write the Serial message ti the DMD Disply
dmd.selectFont(Arial_Black_16);

// the text in the quotes in the next line will be scrolled across the display(s).
// message writes the TEST message above, but I want it to write serIn variable (serial data)
dmd.drawMarquee(message,strlen(message),(32*DISPLAYS_ACROSS)-1,0);

// THIS IS WHAT I WANT, but I get this error "invalid conversion from 'char' to 'const char*'"
//dmd.drawMarquee(serIn,strlen(serIn),(32*DISPLAYS_ACROSS)-1,0);

long start=millis();
long timer=start;
boolean ret=false;
while(!ret){
if ((timer+30) < millis()) {
ret=dmd.stepMarquee(-1,0);
timer=millis();
}
}
delay(100);
}

我一直遇到的错误是 dmd.drawMarquee() 将第一个参数作为字符串,而我对 C++ 一无所知,所以我认为我弄乱了数据类型。

如有任何帮助,我们将不胜感激。

最佳答案

因此,虽然我担心串行读取如何与显示驱动混合在一起,但您可以通过以下方式将串行读取更改为以字符串形式读取:

串口阅读部分:

if(Serial.available()) {    
...
}

只是读取单个字符。您需要将它们存储在缓冲区中。

改变:

char serIn; //var that will hold the bytes in read from the serialBuffer

收件人:

char serIn[40]; //buffer that will hold the bytes in read from the serialBuffer

然后是串行循环:

if(Serial.available()) {  
int chars_in = 0;
//keep reading and printing from serial untill there are bytes in the serial buffer
while (Serial.available()>0 && chars_in<39){
serIn[chars_in] = Serial.read(); //read Serial
Serial.write( byte(serIn[chars_in]));
chars_in++;
}
serIn[chars_in] = 0;
//the serial buffer is over just go to the line (or pass your favorite stop char)
Serial.println();
}

关于c++ - 如何通过串行 w/Arduino 将动态文本写入 LED 显示屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14091998/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com