我需要能够从cocoa发送一个整数到arduino。
发送字符很容易,即单个数字整数,但我似乎找不到发送两位和三位整数的方法。
这样做的目的是连续控制LED的亮度从0到255.
到目前为止,我可以使用以下代码打开和关闭它:
int ledPin = 9; // LED connected to digital pin 9
int incomingByte = 0; // for incoming serial data
void setup() {
// initialize the digital pin as an output:
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
if(incomingByte == 105){ //105 corresponds to i and is programmed in cocoa to turn the LED on
digitalWrite(ledPin, HIGH);
}
else if(incomingByte == 111){ //111 corresponds to o and is programmed in cocoa to turn the LED on
digitalWrite(ledPin, LOW);
}
}
}
但是,我无法解决如何设置0到255之间的值。我会使用' AnalogWrite'而不是' AnalogWrite'但是,我不会&# 39;知道如何将incomingByte发送为0到255之间的值。
这是可可代码:
#import "MainController.h"
@implementation MainController
-(IBAction)ledOn:(id)sender{
popen("echo i > /dev/cu.usbmodem1411", "r");
}
-(IBAction)ledOff:(id)sender{
popen("echo o > /dev/cu.usbmodem1411", "r");
}
@end
感谢。
答案 0 :(得分:0)
您可以将arduino代码中带有多个数字的整数视为cstring,然后通过atoi()
将它们转换为整数。
以下代码将从串行缓冲区中捕获字节为cstring:
char buffer[MAX_BUFFER_SIZE]; // global c character array variable
boolean inputReady()
{
byte index = 0;
byte avail = Serial.available();
if(avail > 0)
{
while(index < avail)
{
byte val;
do
{
val = Serial.read();
}
while (val == -1); // if value is no longer -1, bytes are captured
buffer[index] = val;
index++;
}
buffer[index] = 0; //terminate the character array
return true;
}
return false;
}
注意: 我更喜欢cstrings而不是arduino IDE中构建的String类,因为它使用了更多内存,但是要小心使用cstrings,因为如果管理不好,它们容易出现内存泄漏。
这就是loop()
块的外观:
void loop()
{
if(inputReady())
{
int pwmValue = atoi(buffer); // convert ascii buffer to integer.
if(pwmValue >= 0 && pwmValue <= 255) // filter values from 0-255
analogWrite(ledPin, pwmValue);
else
digitalWrite(ledPin, LOW); // turn off if pwmValue is more than 255
}
delay(100);
}
然后,您可以通过popen()
从您的可可代码中将pwm值作为字符串发送。
#import "MainController.h"
@implementation MainController
-(IBAction)ledPWMValue:(id)sender{
popen("echo 254 > /dev/cu.usbmodem1411", "r");
}
@end
我已经在我的Arduino Uno上对此进行了测试,可能会对其他变体进行测试。我希望这对你的项目有所帮助,祝你好运!