Учусь подключать экран 16х02 и ЖПС на Ардуину. Кто со мной?

Приветствую.Вот решил поработать на Ардуинке.
Маргать светодиодом научился,захотелось подключить что то посерьёзней.
Первое ,что пришло на ум, запустить 1602 экранчик.Погуглив нашёл полезный проект,для понимания,правда к нему ещё жпска требовалась.Как раз ко мне пришла с делэкстрима Ем-411,которую надо затестить.😒
Во первых решил прописать ардуино.И сразу получил ошибку.:)Оказываеся для жпса нужно добавить библиотеки. TinyGPS и NewSoftSerial для этого нужно,в сылках найти архивы,(можно не искать TinyGPS10.zip и NewSoftSerial10c.zip ) и содержимое сбросить в библиотеку программы(…\arduino-0022\libraries).После этого ошыбок не было.И ардуинка прописалась.
1.Дальше Подключил экранчик.
RS — pin 13
E — pin 12
D4 — pin 11
D5 — pin 10
D6 — pin 9
D7 — pin 8
Vss, R/W, Vo — GND
Vdd — 5V
Всё это дело запитал,и на экране появилась надпись"waiting".😁


Так как жпска не была подключена,ждать координат пришлось-бы долго.
1.Запитал Жпску 5 вольтами,подключил pin digital 2 к-ТХ ,и digital 3-Rx.Включил возле окна,подождал,и вдруг появились циферки.😁
Покурив,решил доработать прогу.

#include <NewSoftSerial.h>
#include <TinyGPS.h>
#include <LiquidCrystal.h>
TinyGPS gps;
//Tx, Rx 
NewSoftSerial nss(2, 3);
//Конфигурация линий, куда подключен lcd: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
bool feedgps();
void setup() {
//4800 скорость обмена с GPS приемником
nss.begin(4800);
//16 символов, 2 строки
lcd.begin(16, 2);
lcd.print("waiting");

}
void loop() {
bool newdata = false;
unsigned long start = millis();
long lat, lon;
unsigned long age;
//задержка в секунду между обновлениями координат
while (millis() - start < 1000) {
if (readgps())
newdata = true;
}
if (newdata) {
gps.get_position(&lat, &lon, &age);

lcd.setCursor(0, 0);
lcd.print("lat: ");
lcd.setCursor(5, 0);
lcd.print(lat);
lcd.setCursor(0, 1);
lcd.print("lon: ");
lcd.setCursor(5, 1);
lcd.print(lon);
}
}
bool readgps() {
while (nss.available()) {
int b = nss.read();
//в TinyGPS есть баг, когда не обрабатываются данные с \r и \n
if('\r' != b) {
if (gps.encode(b))
return true;
}
}
return false;
}

Теперь понятней,где широта и долгота.


Пкурив ещё,решил сделать часы,просто ,для пробы.😃

#include <NewSoftSerial.h>
#include <TinyGPS.h>
#include <LiquidCrystal.h>
TinyGPS gps;
//Tx, Rx 
NewSoftSerial nss(2, 3);
//Конфигурация линий, куда подключен lcd: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
bool feedgps();
void setup() {
  //4800 скорость обмена с GPS приемником
  nss.begin(4800);
  //16 символов, 2 строки
  lcd.begin(16, 2);
  lcd.print("waiting");

}
void loop() {
  bool newdata = false;
  unsigned long fix_age, time, date, speed, course;
  long lat, lon;
  unsigned long age;
  //задержка в секунду между обновлениями координат
 {
    if (readgps())
       newdata = true;
  }
  if (newdata) {
    gps.get_datetime(&date, &time, &fix_age);
    lcd.setCursor(0, 0);
    lcd.print("Time ");
    lcd.setCursor(5, 0);
    lcd.print("  ");
    lcd.setCursor(5, 0);
    lcd.print(time /1000000 + 2);  //часы для израеля +2 часа.
    lcd.setCursor(5, 0);
    lcd.print(time /1000000 + 2);  //часы для израеля +2 часа.
    lcd.setCursor(7, 0);
    lcd.print(":");
    lcd.setCursor(8, 0);
    lcd.print((time / 10000) % 100);    //минуты
    lcd.setCursor(10, 0);
    lcd.print(":");
    lcd.setCursor(11, 0);
    lcd.print("  ");
    lcd.setCursor(11, 0);
    lcd.print((time / 100) % 100);    //секунды
    lcd.setCursor(0, 1);
    lcd.print("Date");
    lcd.setCursor(5, 1);
    lcd.print((date % 100)+2000);    //год
    lcd.setCursor(9, 1);
    lcd.print(":");
    lcd.setCursor(10, 1);
    lcd.print("  ");
    lcd.setCursor(10, 1);
    lcd.print((date / 100) % 100);     //месяц
    lcd.setCursor(12, 1);
    lcd.print(":");
    lcd.setCursor(13, 1);
    lcd.print("  ");
    lcd.setCursor(13, 1);
    lcd.print(date / 10000);     //день
  }
}
bool readgps() {
  while (nss.available()) {
    int b = nss.read();
    //в TinyGPS есть баг, когда не обрабатываются данные с \r и \n
    if('\r' != b) {
      if (gps.encode(b))
          return true;
    }
  }
  return false;
}


Правда предвижу косяк,вместо 1 и двух часов ночи будет писать 25-26 часов.:(Но всё равно,доволен своим успехом.Теперь можно тестить и экраны и жпсы.

Сейчас хочу вывести количество спутников,и качество сигнала.Курю мануал.😒И жду совета умных людей.

  • 4395
Comments
Riptor

время можно брать из ЖПСа
а чтоб не было 25 и тд сделать цыкл с проверкой например если больше 24 то ч =ч+24;д=д+1

HATUUL

Так я ведь,и берувремя с жпса.
Нашёл интересную книжку.

ВитГо

А почему не взяли например такой модуль dealextreme.com/…/eb-3531-gps-engine-board-module-…
стоит вроде как в 2 раза дешевле…

Covax

Саш, а ты че с коптеров слился? )

HATUUL
ВитГо;bt67175

А почему не взяли например такой модуль dealextreme.com/…/eb-3531-gps-engine-board-module-…
стоит вроде как в 2 раза дешевле…

Так это как-бы часть модуля,для него ещё и антену искать надо,да и х.з.как он на деле,а Ем-411 уже проверен временем,и по правде даже удивил меня,в лучшую сторону,на середине комнаты продолжал выводить координаты.Вчера вечером у нас был сильный туман,Игловски жпс,холукс-1000,и жпс-трекер,на улице за 30 минут так и не смогли стартовать,а ем-411 смогла стартануть дома.Чудеса.😃

HATUUL
Covax;bt67176

Саш, а ты че с коптеров слился? )

Не,я не слился.Просто взял отпуск.😁Жду интерсные дешёвые решения.

Теперь думаю как СД-карту засуноть.

HATUUL

Уф решил баг с 25 часами.

#include <NewSoftSerial.h>
#include <TinyGPS.h>
#include <LiquidCrystal.h>
TinyGPS gps;
//Tx, Rx 
NewSoftSerial nss(2, 3);
//Конфигурация линий, куда подключен lcd: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
bool feedgps();
void setup() {
  //4800 скорость обмена с GPS приемником
  nss.begin(4800);
  //16 символов, 2 строки
  lcd.begin(16, 2);
  lcd.print("waiting");
}
void loop() {
  bool newdata = false;
  unsigned long fix_age, time, date, speed, course;
  long lat, lon;
  unsigned long age;
  //задержка в секунду между обновлениями координат
 {
    if (readgps())
       newdata = true;
  }
  if (newdata) {
    gps.get_datetime(&date, &time, &fix_age);
    lcd.setCursor(0, 0);
    lcd.print("Time ");
    lcd.setCursor(5, 0);
    lcd.print("  ");
    int hour=time/1000000+2;  //часы для израеля +2 часа.
    int day=date / 10000;
    if(hour>23)day=day+1;
    if(hour>23)hour=hour-24;
    lcd.setCursor(5, 0);
    lcd.print(hour);
    lcd.setCursor(7, 0);
    lcd.print(":");
    lcd.setCursor(8, 0);
    lcd.print((time / 10000) % 100);    //минуты
    lcd.setCursor(10, 0);
    lcd.print(":");
    lcd.setCursor(11, 0);
    lcd.print("  ");
    lcd.setCursor(11, 0);
    lcd.print((time / 100) % 100);    //секунды
    lcd.setCursor(0, 1);
    lcd.print("Date");
    lcd.setCursor(5, 1);
    lcd.print((date % 100)+2000);    //год
    lcd.setCursor(9, 1);
    lcd.print(":");
    lcd.setCursor(10, 1);
    lcd.print("  ");
    lcd.setCursor(10, 1);
    lcd.print((date / 100) % 100);     //месяц
    lcd.setCursor(12, 1);
    lcd.print(":");
    lcd.setCursor(13, 1);
    lcd.print("  ");
    lcd.setCursor(13, 1);
    lcd.print(day);     //день
  }
}
bool readgps() {
  while (nss.available()) {
    int b = nss.read();
    //в TinyGPS есть баг, когда не обрабатываются данные с \r и \n
    if('\r' != b) {
      if (gps.encode(b))
          return true;
    }
  }
  return false;
}

😁

HATUUL

Решил я сделать с этого проектика,что-то уау прикольное.Т.е. замудрил ,что-то на вырост.
Увеличел экранчик до 20х10.Теперь связь между жпсом и ардуиной проходит через трансивер АРС220,т.е. жпс теперь мобильный.
Собрал всё воедино.И кое что добавил по курсу.В добавок научился рисовать символы😈.
Да ещё и кнопочку на Д5 запустил.😆
Ну вот собствено код.

#include <NewSoftSerial.h>
#include <TinyGPS.h>
#include <LiquidCrystal.h>
enum { SYMBOL_HEIGHT = 8 };
byte strverh1[SYMBOL_HEIGHT] =
{
  B00100,
  B01110,
  B11111,
  B00100,
  B00100,
  B10101,
  B00100,
  B00100,
};
byte strvniz[SYMBOL_HEIGHT] =
{
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B11111,
  B01110,
  B00100,
};
byte strverh[SYMBOL_HEIGHT] =
{
  B00100,
  B01110,
  B11111,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
};
byte del[SYMBOL_HEIGHT] =
{
  B00000,
  B00100,
  B00000,
  B00100,
  B00000,
  B10101,
  B00000,
  B00100,
};
byte del1[SYMBOL_HEIGHT] =
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B10101,
  B00000,
  B00100,
};
byte minus[SYMBOL_HEIGHT] =
{
  B00000,
  B01010,
  B10101,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};
byte minuso[SYMBOL_HEIGHT] =
{
  B00001,
  B00010,
  B00001,
  B00010,
  B00001,
  B00010,
  B00001,
  B00010,
};
TinyGPS gps;
//Tx, Rx 
NewSoftSerial nss(2, 3);
//Конфигурация линий, куда подключен lcd: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
bool feedgps();
int inpin=5;
int nol=0;
int naprvysoty=0;
void setup()
{
   lcd.createChar(0,strverh1);
   lcd.createChar(1,del);
   lcd.createChar(2,del1);
   lcd.createChar(3,minus);
   lcd.createChar(4,minuso);
   lcd.createChar(5,strverh);
   lcd.createChar(6,strvniz);
  //9600 скорость обмена с GPS приемником
  nss.begin(9600);
  pinMode(inpin,INPUT);
  //16 символов, 2 строки
  lcd.begin(20, 4);
  lcd.print("waiting");

}
void loop() {
  bool newdata = false;
  unsigned long start = millis();
  long lat, lon;
  unsigned long age;
  while (millis() - start < 1000) {
    if (readgps())
       newdata = true;
  }
  if (newdata) {
    gps.get_position(&lat, &lon, &age);
    int vysota = gps.altitude();
    lcd.setCursor(11, 0);
    lcd.write(4);
    lcd.setCursor(11, 1);
    lcd.write(4);
    lcd.setCursor(0, 2);
    lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);
    lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);lcd.write(3);
    lcd.setCursor(13, 1);
    lcd.print("      ");
    lcd.setCursor(12, 1);
    lcd.print(gps.f_speed_kmph());
    lcd.setCursor(16, 1);
    lcd.print("km/h");
    lcd.setCursor(0, 0);
    lcd.print("lat       ");
    lcd.setCursor(4, 0);
    lcd.print(lat);
    lcd.setCursor(0, 1);
    lcd.print("lon       ");
    lcd.setCursor(4, 1);
    lcd.print(lon);
    lcd.setCursor(14, 0);
    lcd.print("     ");
    if (naprvysoty<vysota)
    {
    lcd.setCursor(18, 0);
    lcd.write(5);
    }
        if (naprvysoty>vysota)
    {
    lcd.setCursor(18, 0);
    lcd.write(6);
    }
    lcd.setCursor(19, 0);
    lcd.print("m");
    lcd.setCursor(14, 0);
    lcd.print((vysota/100)-nol);
if (digitalRead(inpin)==HIGH)
{ nol=vysota/100;
}
else
{nol=nol;}
int compas=gps.f_course()/18;
    lcd.setCursor(0, 3);
    lcd.write(1);lcd.write(2);lcd.write(1);lcd.write(2);lcd.write(1);lcd.write(2);lcd.write(1);lcd.write(2);lcd.write(1);lcd.print("N");
    lcd.write(1);lcd.write(2);lcd.write(1);lcd.write(2);lcd.write(1);lcd.write(2);lcd.write(1);lcd.write(2);lcd.write(1);lcd.write(2);
    lcd.setCursor(compas, 3);
    lcd.write(0);
    naprvysoty=vysota;
  }
}
bool readgps() {
  while (nss.available()) {
    int b = nss.read();
    //в TinyGPS есть баг, когда не обрабатываются данные с \r и \n
    if('\r' != b) {
      if (gps.encode(b))
          return true;
    }
  }
  return false;
}

В самом низу линейка компаса(курс по северу)Работает но пока не проверял.😒
С лева сверху,лат лот координаты.
С права с верху ,высота над уровнем моря.Но можно обнулить (т.е.до уровня поверхности на местности) с помощью кнопки что сидит на д5.Вертикальная стрелка перед “м” показывает,модель идёт на подъём или опускается.Должно хоть как,то помоч,для тех кто теряется в облаках.
С права чуть ниже высоты, находиться скорость км/ч.
Так-как проект промежуточный решил,не сосредотачиватся в коментах.Но стоит сделать.
Ну вот собствено и видео обзор.

Можно сказать,это самый бюджетный ФПВ набор.

При потере сигнала,экран продолжает отображать последние координаты,чем поможет во время поиска.
Так-что его можно назвать “наземный чёрный яшик”
По координатам,курсу,высоте,и скорости,думаю будет легче расчитать точку посадки.
Потребление энергии:
1.ЖПС+АРС220 3-5В. 54мА.
2.Ардуино+АРС220+20х4 4-5В 50 мА.

Предположительное время работы для (1.) с 1S. аккомулятором ёмкостью 1000мА/ч. и частотой обнавления ЖПС 1 сек.15-18ч.
Предположительное время работы для (2.) с 2S. аккомулятором ёмкостью 500-1000мА/ч .15-18ч.

Примерное максималное растояние между (1.) и (2.) 2.5 км.