Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
В этой серии Smart Buoy представлена наша (амбициозная) попытка создать научный буй, который мог бы проводить значимые измерения в море с использованием стандартных продуктов. Это руководство два из четырех - убедитесь, что вы в курсе, и если вам нужно быстрое введение в проект, ознакомьтесь с нашим резюме.
Часть 1: Измерение волн и температуры
В этом руководстве мы покажем вам, как получить данные GPS, сохранить их на SD-карте и отправить куда-нибудь по радио.
Мы сделали это, чтобы отслеживать местонахождение нашего морского буя. Радио означает, что мы можем смотреть его удаленно, а SD-карта означает, что на случай, если что-то сломается, и он уйдет, мы можем загрузить данные, собранные во время незапланированной экскурсии - если мы когда-нибудь сможем их получить!
Запасы
Модуль GPS - Amazon
Модуль SD-карты - Amazon
SD-карта - Amazon
2 X радиомодуля (NRF24L01 +) - Amazon
2 х Arduino - Amazon
Шаг 1. Получение данных GPS
Умный буй выполняет измерения датчиков, когда он находится в море, включая местоположение и дату и время по GPS. Взгляните на схему, которая показывает, как мы настраиваем схему. Модуль GPS обменивается данными через последовательное соединение, поэтому мы используем последовательную библиотеку программного обеспечения Arduino, а также крошечную библиотеку GPS для связи с ним. Эти библиотеки делают все очень простым. Давайте рассмотрим код…
#включают
#include // Объект TinyGPS ++ TinyGPSPlus gps; // Последовательное соединение с устройством GPS SoftwareSerial ss (4, 3); struct dataStruct {двойная широта; двойная долгота; беззнаковая длинная дата; без подписи долгое время; } gpsData; void setup () {Serial.begin (115200); ss.begin (9600); } void loop () {в то время как (ss.available ()> 0) {если (gps.encode (ss.read ())) {getInfo (); printResults (); }}} void getInfo () {если (gps.location.isValid ()) {gpsData.latitude = gps.location.lat (); gpsData.longitude = gps.location.lng (); } else {Serial.println ("Недопустимое местоположение"); } если (gps.date.isValid ()) {gpsData.date = gps.date.value (); } else {Serial.println ("Неверная дата"); } если (gps.time.isValid ()) {gpsData.time = gps.time.value (); } else {Serial.println ("Неверное время"); }} void printResults () {Serial.print ("Местоположение:"); Serial.print (gpsData.latitude, 6); Serial.print (","); Serial.print (gpsData.longitude, 6); Serial.print ("Дата:"); Serial.print (gpsData.date); Serial.print ("Время:"); Serial.print (gpsData.time); Serial.println (); }
(Посмотрите видео для этого кода на
Шаг 2. Отправка данных GPS по радио
Предположим, что буй в море проводит измерения, но мы хотим видеть данные, не намочив ног и не вынося буй на берег. Чтобы получать измерения удаленно, мы используем радиомодуль, подключенный к Arduino по обе стороны линии связи. В будущем мы заменим Arduino на стороне приемника на Raspberry Pi. Радио работает одинаково с обоими интерфейсами, поэтому поменять их местами довольно просто.
Радиомодуль обменивается данными с помощью SPI, для которого требуется несколько больше соединений, чем для I2C, но при этом его очень легко использовать из-за библиотеки NRF24. Используя модуль GPS для измерений датчика, мы передаем его данные от одного Arduino к другому. Мы собираемся подключить GPS и радиомодуль к Arduino, а с другой стороны - к Arduino с радиомодулем - взгляните на схему.
Передатчик
#включают
#include #include #include #include TinyGPSPlus gps; SoftwareSerial ss (4, 3); Радиостанция РФ24 (8, 7); // CE, CSN struct dataStruct {double latitude; двойная долгота; беззнаковая длинная дата; без подписи долгое время; } gpsData; void setup () {Serial.begin (115200); ss.begin (9600); Serial.println («Настройка радио»); // Настраиваем передатчик радио radio.begin (); radio.openWritingPipe (0xF0F0F0F0E1LL); radio.setChannel (0x76); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_250KBPS); radio.stopListening (); radio.enableDynamicPayloads (); radio.powerUp (); Serial.println («Начинаем отправку»); } void loop () {в то время как (ss.available ()> 0) {если (gps.encode (ss.read ())) {getInfo (); radio.write (& gpsData, sizeof (gpsData)); }}} void getInfo () {если (gps.location.isValid ()) {gpsData.longitude = gps.location.lng (); gpsData.latitude = gps.location.lat (); } else {gpsData.longitude = 0.0; gpsData.latitude = 0,0; } если (gps.date.isValid ()) {gpsData.date = gps.date.value (); } еще {gpsData.date = 0; } если (gps.time.isValid ()) {gpsData.time = gps.time.value (); } еще {gpsData.time = 0; }}
ПОЛУЧАТЕЛЬ
#включают
#include #include RF24 radio (8, 7); // CE, CSN struct dataStruct {double latitude; двойная долгота; беззнаковая длинная дата; без подписи долгое время; } gpsData; void setup () {Serial.begin (115200); // Настраиваем приемник радио radio.begin (); radio.openReadingPipe (1, 0xF0F0F0F0E1LL); radio.setChannel (0x76); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_250KBPS); radio.startListening (); radio.enableDynamicPayloads (); radio.powerUp (); } void loop () {if (radio.available ()) {radio.read (& gpsData, sizeof (gpsData)); Serial.print ("Местоположение:"); Serial.print (gpsData.latitude, 6); Serial.print (","); Serial.print (gpsData.longitude, 6); Serial.print ("Дата:"); Serial.print (gpsData.date); Serial.print ("Время:"); Serial.print (gpsData.time); Serial.println ();}}
(Посмотрите видео для этого кода на
Шаг 3: Хранение данных с помощью модуля SD-карты
Радиомодуль довольно надежен, но иногда вам нужен план действий в чрезвычайных ситуациях на случай отключения электроэнергии на стороне приемника или если радиостанция выходит за пределы досягаемости. Наш план действий в чрезвычайных ситуациях - это модуль SD-карты, который позволяет нам хранить данные, которые мы собираем. Количество собираемых данных невелико, поэтому даже на небольшой SD-карте можно легко хранить данные за день.
#включают
#include #include #include TinyGPSPlus gps; SoftwareSerial ss (4, 3); struct dataStruct {двойная широта; двойная долгота; беззнаковая длинная дата; без подписи долгое время; } gpsData; void setup () {Serial.begin (115200); ss.begin (9600); if (! SD.begin (5)) {Serial.println («Карта вышла из строя или отсутствует»); возвращение; } Serial.println ("карта инициализирована."); Файл dataFile = SD.open ("gps_data.csv", FILE_WRITE); if (dataFile) {dataFile.println ("Широта, Долгота, Дата, Время"); dataFile.close (); } else {Serial.println ("нет, не удается открыть файл"); }} void loop () {в то время как (ss.available ()> 0) {если (gps.encode (ss.read ())) {getInfo (); printResults (); saveInfo (); }}} void getInfo () {если (gps.location.isValid ()) {gpsData.latitude = gps.location.lat (); gpsData.longitude = gps.location.lng (); } else {Serial.println ("Недопустимое местоположение"); } если (gps.date.isValid ()) {gpsData.date = gps.date.value (); } else {Serial.println ("Неверная дата"); } если (gps.time.isValid ()) {gpsData.time = gps.time.value (); } else {Serial.println ("Неверное время"); }} void printResults () {Serial.print ("Местоположение:"); Serial.print (gpsData.latitude, 6); Serial.print (","); Serial.print (gpsData.longitude, 6); Serial.print ("Дата:"); Serial.print (gpsData.date); Serial.print ("Время:"); Serial.print (gpsData.time); Serial.println (); } void saveInfo () {Файл dataFile = SD.open ("gps_data.csv", FILE_WRITE); если (файл данных) {файл данных.print (gpsData.latitude); dataFile.print (","); dataFile.print (gpsData.longitude); dataFile.print (","); dataFile.print (gpsData.date); dataFile.print (","); dataFile.println (gpsData.time); dataFile.close (); } else {Serial.println ("нет файла данных"); }}
(Мы говорим через этот код в видео
Шаг 4: Отправка и сохранение данных GPS
Шаг 5: Спасибо
Подпишитесь на нашу рассылку!
Часть 1: Измерение волн и температуры
Часть 2: Радио GPS NRF24 и SD-карта
Часть 3: Распределение мощности для буя
Часть 4: Размещение буя