硬件连接以及与传感器(GPS NEO-6M模块、ESP8266等)的编程问题通过Atlas科学串口扩展器连接Arduino Uno 8:1
硬件:
Arduino Uno到GPS模块我们可以得到纬度和经度值,下面是相同的代码:
#include <SoftwareSerial.h>
#include <TinyGPS.h>
long lat, lon;
SoftwareSerial gpsSerial(6, 5);
TinyGPS gps;
void setup() {
Serial.begin(9600);
gpsSerial.begin(9600);
}
void loop() {
while (gpsSerial.available()) {
if (gps.encode(gpsSerial.read())) {
gps.get_position(&lat, &lon);
Serial.print("Position:");
Serial.print("lat:"); Serial.print(lat); Serial.print(" ");
Serial.print("long:"); Serial.println(lon);
}
}
}
我们的要求是我们有四个传感器需要连接到一个Arduino Uno。为此,我们使用了阿特拉斯科学硬件串口扩展8:1。
下面是我们正在获取GPS坐标的代码:
#include <SoftwareSerial.h> // we have to include the SoftwareSerial library, or else we can't use it
#define rx 8 // define what pin rx is going to be
#define tx 9 // define what pin tx is going to be
SoftwareSerial mySerial(rx, tx); //define how the soft serial port is going to work
int s1 = 6; // Arduino pin 6 to control pin S1
int s2 = 5; // Arduino pin 5 to control pin S2
int s3 = 4; // Arduino pin 4 to control pin S3
const uint8_t module_count = 8; // number of modules connected to the serial port expander 1=Port1, 2= Port2 and so on
void setup() {
Serial.begin(115200); // Set the hardware serial port to 115200
mySerial.begin(9600); // Set baud rate for the software serial port to 9600
pinMode(s1, OUTPUT); // Set the digital pin as output
pinMode(s2, OUTPUT); // Set the digital pin as output
pinMode(s3, OUTPUT); // Set the digital pin as output
}
void loop() {
if (Serial.available()) { // if we get data from the computer
char c = Serial.read();
for (uint8_t i = 1; i <= module_count; i++) { // loop through the modules
Serial.print("Connecting to Port: ");
Serial.println(i);
open_port(i); // open the port
mySerial.print(c); // print character to port
delay(100); // insert a delay to wait for the reply
if (mySerial.available()) { // print reply to serial monitor
while (mySerial.available()) {
Serial.println(mySerial.read());
if (gps.encode(mySerial.read())) {
gps.get_position(&lat, &lon);
Serial.print("Position:");
Serial.print("lat:"); Serial.print(lat);
Serial.print(" ");
Serial.print("long:"); Serial.println(lon);
}
}
}
else {
Serial.print("No response received");
}
Serial.println();
}
}
}
void open_port(uint8_t _port) { //this function controls what port is opened on the serial port expander
if (_port < 1 || module_count > 8)_port = 1; //if the value of the port is within range (1-8) then open that port. If it's not in range set it to port 1
uint8_t port_bits = _port - 1;
digitalWrite(s1, bitRead(port_bits, 0)); //Here we have two commands combined into one.
digitalWrite(s2, bitRead(port_bits, 1)); //The digitalWrite command sets a pin to 1/0 (high or low)
digitalWrite(s3, bitRead(port_bits, 2)); //The bitRead command tells us what the bit value is for a specific bit location of a number
delay(2); //this is needed to make sure the channel switching event has completed
}
请指导我们整理这个问题;我们对gps.encode(mySerial.read())
有一个问题。
提前谢谢你。
发布于 2021-01-25 10:33:44
问题是我们自己解决的,下面是相同的工作代码,
#include <SoftwareSerial.h> //we have to include the SoftwareSerial library, or else we can't use it
#define rx 3 //define what pin rx is going to be
#define tx 2 //define what pin tx is going to be
SoftwareSerial mySerial(rx, tx); //define how the soft serial port is going to work
#include <TinyGPS.h>
#include <NMEAGPS.h>
int s1 = 6; //Arduino pin 6 to control pin S1
int s2 = 5; //Arduino pin 5 to control pin S2
int s3 = 4; //Arduino pin 4 to control pin S3
int i;
const uint8_t module_count = 8; //number of modules connected to the serial port expander 1=Port1, 2= Port2 and so on
TinyGPS gps;
gps_fix fix;
long lat, lon;
void setup() {
Serial.begin(9600); //Set the hardware serial port to 115200
mySerial.begin(9600); //set baud rate for the software serial port to 9600
pinMode(s1, OUTPUT); //Set the digital pin as output
pinMode(s2, OUTPUT); //Set the digital pin as output
pinMode(s3, OUTPUT); //Set the digital pin as output
}
void loop() {
if (Serial.available()) { //if we get data from the computer
char c = Serial.read();
for (uint8_t i = 1; i <= module_count; i++) { // loop through the modules
Serial.print("Connecting to Port: ");
Serial.println(i);
open_port(i); // open the port
Serial.print(c); //print character to port
delay(1000); //insert a delay to wait for the reply
//Serial.println(Serial.available());
if (Serial.available()) {
//Serial.println(gps.available(Serial));//print reply to serial monitor
while (Serial.available()) {
//Serial.write(mySerial.read());
//Serial.write(gps.encode(mySerial.read()));
//Serial.println(mySerial.available());
//Serial.println(gps.encode(mySerial.read()));
if (mySerial.available()>0) {
//Serial.println(gps.encode(mySerial.read()));
char d = byte(mySerial.read());
//Serial.println(d);
if (gps.encode(d)) {
gps.get_position(&lat, &lon);
Serial.print("Position:");
Serial.print("lat:"); Serial.print(lat); Serial.print(" ");
Serial.print("long:"); Serial.println(lon);
}
}
}
Serial.println();
}
}
}
}
void open_port(uint8_t _port) { //this function controls what port is opened on the serial port expander
if (_port < 1 || module_count > 8)_port = 1; //if the value of the port is within range (1-8) then open that port. If it's not in range set it to port 1
uint8_t port_bits = _port - 1;
digitalWrite(s1, bitRead(port_bits, 0)); //Here we have two commands combined into one.
digitalWrite(s2, bitRead(port_bits, 1)); //The digitalWrite command sets a pin to 1/0 (high or low)
digitalWrite(s3, bitRead(port_bits, 2)); //The bitRead command tells us what the bit value is for a specific bit location of a number
delay(2); //this is needed to make sure the channel switching event has completed
}
https://stackoverflow.com/questions/65804300
复制相似问题