element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • About Us
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Just Encase
  • Challenges & Projects
  • Design Challenges
  • Just Encase
  • More
  • Cancel
Just Encase
Blog Just Encase Design Challenge - Winter Driving Safety (Blog #5 part 1)
  • Blog
  • Forum
  • Documents
  • Events
  • Polls
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Just Encase to participate - click to join for free!
  • Share
  • More
  • Cancel
Group Actions
  • Group RSS
  • More
  • Cancel
Engagement
  • Author Author: dwinhold
  • Date Created: 28 Feb 2022 12:54 AM Date Created
  • Views 670 views
  • Likes 9 likes
  • Comments 0 comments
  • Hammond Manufacturing Enclosures
  • dwinhold
  • Winter_driving_safety
  • arduino
  • just encase
Related
Recommended

Just Encase Design Challenge - Winter Driving Safety (Blog #5 part 1)

dwinhold
dwinhold
28 Feb 2022

Here is part 1 of my final project.

Below is the code and working display of my project. A lot of the live demonstration of my project can't be done due to the risk. I won't drive unsafely or get into an accident in order to show how the project works. I will give written examples of how the project works but like I said, I won't put mine or anyone's safety at risk for any project. If this will effect the outcome of my project, I am good with that.

Here is the code I used for the GPS Speedometer and the CO sensor:

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>

// Red = Ground
// Black = 3v3
#define TFT_CS        10 // Yellow
#define TFT_RST        9 // Or set to -1 and connect to Arduino RESET pin Orange
#define TFT_DC         8 // White


#define TFT_MOSI 11  // Data out Blue
#define TFT_SCLK 13  // Clock out Green


Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

float lat, lon, lat2, lon2; // create variable for latitude and longitude object
SoftwareSerial gpsSerial(3, 4); //rx,tx
TinyGPS gps;


// Push button setup
const int buttonPin1 = 5;
const int buttonPin2 = 6;
const int buttonPin3 = 7;
int buttonState1 = LOW;
int buttonState2 = LOW;
int buttonState3 = LOW;
int x = 0;
int y = 0;
int z = 0;
int a = 0;
int b = 0;
int c = 0;

double kmh = 0;


void setup(void) {
  Serial.begin(9600);
  gpsSerial.begin(9600);

  pinMode(2, OUTPUT);

  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);

  // Use this initializer if using a 1.8" TFT screen:
  tft.initR(INITR_BLACKTAB);      // Init ST7735S chip, black tab

  // Screen size 128x160

  // SPI speed defaults to SPI_DEFAULT_FREQ defined in the library, you can override it here
  // Note that speed allowable depends on chip and quality of wiring, if you go too fast, you
  // may end up with a black screen some times, or all the time.
  //tft.setSPISpeed(40000000);


  tft.fillScreen(ST77XX_BLACK);


  tft.fillScreen(ST77XX_BLACK);
  tft.setCursor(30, 40);
  tft.setTextColor(ST77XX_RED);
  tft.setTextSize(1);
  tft.println("Just");
  tft.setCursor(30, 60);
  tft.println("Encase");
  tft.setCursor(30, 80);
  tft.println("Design");
  tft.setCursor(30, 100);
  tft.println("Challenge !!");
  delay(1500);
  tft.fillScreen(ST77XX_BLACK);
  tft.setCursor(30, 40);
  tft.println("Winter");
  tft.setCursor(30, 60);
  tft.println("Driving");
  tft.setCursor(30, 80);
  tft.println("Safety!! ");
  delay(1500);
  tft.fillScreen(ST77XX_BLACK);


}


void loop() {

  // Set current road conditions
    tft.setTextColor(ST77XX_RED);
    tft.setCursor(0, 20);
    tft.println("What are the current");
    tft.setCursor(0, 40);
    tft.println("road Conditions?");
    tft.setCursor(0, 80);
    tft.println("Press A for Clear");

    tft.setCursor(0, 100);
    tft.println("Press B for Snow");

    tft.setCursor(0, 120);
    tft.println("Press C for Icy");

   do {
    buttonState1 = digitalRead(5);
    buttonState2 = digitalRead(6);
    buttonState3 = digitalRead(7);

    if (buttonState1 == HIGH) {
      x = 1;
    }

    if (buttonState2 == HIGH) {
      y = 1;
    }

    if (buttonState3 == HIGH) {
      z = 1;
    }


  }while (x == 0 & y == 0 & z == 0);


  tft.fillScreen(ST77XX_BLACK);

  buttonState1 = 0;
  buttonState2 = 0;
  buttonState3 = 0;


// Set driving area

do {
    tft.setTextColor(ST77XX_RED);
    tft.setCursor(0, 20);
    tft.println("Driving area?");
    tft.setCursor(0, 40);
    tft.println("Press A for in Town");
    tft.setCursor(0, 80);
    tft.println("Press B for Highway");

    buttonState1 = digitalRead(buttonPin1);
    buttonState2 = digitalRead(buttonPin2);


    if (buttonState1 == HIGH) {
      a = 1;
    }

    if (buttonState2 == HIGH) {
      b = 1;
    }
  }while (a == 0 & b == 0); 


  tft.fillScreen(ST77XX_BLACK);


  while (x == 1) {

    includeAllClear();
    
  }

  while (y == 1) {

    includeAllSnow();
    
  }

  while (z == 1) {

    includeAllIcy();
    
  }

}


//Clear Road Condition

void includeAllClear() {

  //Start and display CO levels
  tft.setTextColor(ST77XX_GREEN);
  int sensorValue = analogRead(A3);
  tft.setCursor(0, 0);
  tft.println("CO Levels: ");
  tft.setCursor(60, 0);
  tft.println(sensorValue / 10);
  delay(1);


  //Get GPS information

  while (gpsSerial.available()) { // check for gps data
    if (gps.encode(gpsSerial.read())) // encode gps data
    {
      gps.f_get_position(&lat, &lon); // get latitude and longitude
    }

  }


  delay(5000);

  while (gpsSerial.available()) { // check for gps data
    if (gps.encode(gpsSerial.read())) // encode gps data
    {
      gps.f_get_position(&lat2, &lon2); // get latitude and longitude
    }
  }



  double kmh = acos(cos(radians(90 - (lat, 6))) * cos(radians(90 - (lat2, 6))) + sin(radians(90 - (lat, 6))) * sin(radians(90 - (lat2, 6))) * cos(radians((lon, 6) - (lon2, 6)))) * 6371 * 60 * 12;

  tft.setTextSize(1);
  tft.setCursor(0, 60);
  tft.println("Speed Km/h:");
  tft.setCursor(0, 100);
  tft.println(kmh, 1);

  if (a = 1 && kmh > 60) {
    tft.setTextColor(ST77XX_RED);
    tft.setCursor(0, 120);
    tft.println("Slow Down!!");
    delay(2000);
    tft.setTextColor(ST77XX_BLACK);
    tft.setCursor(0, 120);
    tft.println("Slow Down!!");

  }

  if (b = 1 && kmh > 100) {
    tft.setTextColor(ST77XX_RED);
    tft.setCursor(0, 120);
    tft.println("Slow Down!!");
    delay(2000);
    tft.setTextColor(ST77XX_BLACK);
    tft.setCursor(0, 120);
    tft.println("Slow Down!!");

  }


  delay(2000);

  //Clear displayed information

  tft.setTextColor(ST77XX_BLACK);
  tft.setTextSize(1);
  tft.setCursor(60, 0);
  tft.println(sensorValue / 10);

  tft.setCursor(0, 100);
  tft.println(kmh, 1);


}



//Snow Road Condition

void includeAllSnow() {

  //Start and display CO levels
  tft.setTextColor(ST77XX_GREEN);
  int sensorValue = analogRead(A3);
  tft.setCursor(0, 0);
  tft.println("CO Levels: ");
  tft.setCursor(60, 0);
  tft.println(sensorValue / 10);
  delay(1);


  //Get GPS information

  while (gpsSerial.available()) { // check for gps data
    if (gps.encode(gpsSerial.read())) // encode gps data
    {
      gps.f_get_position(&lat, &lon); // get latitude and longitude
    }

  }


  delay(5000);

  while (gpsSerial.available()) { // check for gps data
    if (gps.encode(gpsSerial.read())) // encode gps data
    {
      gps.f_get_position(&lat2, &lon2); // get latitude and longitude
    }
  }


  double kmh = acos(cos(radians(90 - (lat, 6))) * cos(radians(90 - (lat2, 6))) + sin(radians(90 - (lat, 6))) * sin(radians(90 - (lat2, 6))) * cos(radians((lon, 6) - (lon2, 6)))) * 6371 * 60 * 12;

  tft.setTextSize(1);
  tft.setCursor(0, 60);
  tft.println("Speed Km/h:");
  tft.setCursor(0, 100);
  tft.println(kmh, 1);

  if (a = 1 && kmh > 45) {
    tft.setTextColor(ST77XX_RED);
    tft.setCursor(0, 120);
    tft.println("Slow Down!!");
    delay(2000);
    tft.setTextColor(ST77XX_BLACK);
    tft.setCursor(0, 120);
    tft.println("Slow Down!!");

  }

  if (b = 1 && kmh > 80) {
    tft.setTextColor(ST77XX_RED);
    tft.setCursor(0, 120);
    tft.println("Slow Down!!");
    delay(2000);
    tft.setTextColor(ST77XX_BLACK);
    tft.setCursor(0, 120);
    tft.println("Slow Down!!");
  }

  delay(2000);

  
  //Clear displayed information

  tft.setTextColor(ST77XX_BLACK);
  tft.setTextSize(1);
  tft.setCursor(60, 0);
  tft.println(sensorValue / 10);

  tft.setCursor(0, 100);
  tft.println(kmh, 1);


}



// Icy Road Condition
void includeAllIcy() {

  //Start and display CO levels
  tft.setTextColor(ST77XX_RED);
  int sensorValue = analogRead(A3);
  tft.setCursor(0, 0);
  tft.println("CO Levels: ");
  tft.setCursor(60, 0);
  tft.println(sensorValue / 10);
  delay(1);


  //Get GPS information

  while (gpsSerial.available()) { // check for gps data
    if (gps.encode(gpsSerial.read())) // encode gps data
    {
      gps.f_get_position(&lat, &lon); // get latitude and longitude
    }

  }


  delay(5000);

  while (gpsSerial.available()) { // check for gps data
    if (gps.encode(gpsSerial.read())) // encode gps data
    {
      gps.f_get_position(&lat2, &lon2); // get latitude and longitude
    }
  }



  double kmh = acos(cos(radians(90 - (lat, 6))) * cos(radians(90 - (lat2, 6))) + sin(radians(90 - (lat, 6))) * sin(radians(90 - (lat2, 6))) * cos(radians((lon, 6) - (lon2, 6)))) * 6371 * 60 * 12;


  tft.setTextSize(1);
  tft.setCursor(0, 60);
  tft.println("Speed Km/h:");
  tft.setCursor(0, 100);
  tft.println(kmh, 1);

  if (a = 1 && kmh > 40) {
    tft.setTextColor(ST77XX_RED);
    tft.setCursor(0, 120);
    tft.println("Slow Down!!");
    delay(2000);
    tft.setTextColor(ST77XX_BLACK);
    tft.setCursor(0, 120);
    tft.println("Slow Down!!");

  }

  if (b = 1 && kmh > 75) {
    tft.setTextColor(ST77XX_RED);
    tft.setCursor(0, 120);
    tft.println("Slow Down!!");
    delay(2000);
    tft.setTextColor(ST77XX_BLACK);
    tft.setCursor(0, 120);
    tft.println("Slow Down!!");

  }



  delay(2000);

  
  //Clear displayed information

  tft.setTextColor(ST77XX_BLACK);
  tft.setTextSize(1);
  tft.setCursor(60, 0);
  tft.println(sensorValue / 10);

  tft.setCursor(0, 100);
  tft.println(kmh, 1);


}

Accelerometer and Weather Station Code:

#include <Wire.h>
#include "i2c.h"
#include <LiquidCrystal.h>
#include "i2c_BMP280.h"
#include "ADXL335.h"


BMP280 bmp280;
float pascalhigh;
float pascallow;
float pressurerise;
float pressuredrop;
float pascaldiff;
float pascaldiff1;
float hg;
float hg2;

ADXL335 accelerometer;

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// Connect BMP280 sensor to SDA (Y):20 SCL (B):21
// Connect Accel Sensor to O-A1, G-A2, Y-A3
void setup()
{
    Serial.begin(115200);
    lcd.begin(16, 2);
    accelerometer.begin();
    
    Serial.print("Probe BMP280: ");
    if (bmp280.initialize()) Serial.println("Sensor found");
    else
    {
        Serial.println("Sensor missing");
        while (1) {}
    }

   // onetime-measure:
    bmp280.setEnabled(0);
    bmp280.triggerMeasurement();
    float pascal;
    bmp280.getPressure(pascal);
    pascalhigh = 0;
    pascallow = 2000000;
    pascaldiff1 = 0;
    hg2 = pascal;
}

void loop()
{

  int x,y,z;
  accelerometer.getXYZ(&x,&y,&z);
  float ax,ay,az;
  accelerometer.getAcceleration(&ax,&ay,&az);
  Serial.println("accleration of X/Y/Z: ");
  Serial.print(ax);
  Serial.println(" g");
  Serial.print(ay);
  Serial.println(" g");
  Serial.print(az);
  Serial.println(" g");

 if ((ax+ay+az)>19){
  Serial.println("Danger, Slow Down");
  lcd.setCursor(0,1);
  lcd.print("Slow Down!!");
  delay(1000);
 }
 
    bmp280.awaitMeasurement();

    float temperature;
    bmp280.getTemperature(temperature);

    float pascal;
    bmp280.getPressure(pascal);

    hg = pascal / 3386.389;

    static float meters, metersold;
    bmp280.getAltitude(meters);
    metersold = (metersold * 10 + meters)/11;

    bmp280.triggerMeasurement();

    Serial.print("- Altitude: ");
    Serial.print(metersold);
    Serial.print(" - Temp ");
    Serial.print(temperature);
    Serial.println(" °C ");
    

    
    if(pascal>100914.3 && pascal<102269.0)
    {
      Serial.print(hg);
      Serial.print(" Hg; ");
      Serial.print(": Change");
      lcd.setCursor(0,0);
      lcd.print("Weather Change");
    }
    
    if(pascal<100914.4 && pascal > 97000.00)
    {
      Serial.print(hg);
      Serial.print(" Hg; ");
      Serial.print(": Rain/Snow");
      lcd.setCursor(0,0);
      lcd.print("Rain/Snow");
    }
    
    if(pascal<97000.1)
    {
      Serial.print(hg);
      Serial.print(" Hg; ");
      Serial.print(": Stormy");
      lcd.setCursor(0,0);
      lcd.print("Stormy");
    }
    
    if(pascal>102268.9 && pascal<105000.0)
    {
      Serial.print(hg);
      Serial.print(" Hg; ");
      Serial.print(": Fair");
      lcd.setCursor(0,0);
      lcd.print("Fair");
    }
    
    if(pascal>104999.9)
    {
      Serial.print(hg);
      Serial.print(" Hg; ");
      Serial.print(": Dry");
      lcd.setCursor(0,0);
      lcd.print("Dry");
    }


    
    if(hg2 > (hg-.05)or hg2 < (hg+.05))
    {
      Serial.print(" : No Change ");
      lcd.setCursor(0,1);
      lcd.print("No Change");
    }
    
    else if(hg2 > (hg-.15))
    {
      Serial.print(" : Weather to Improve ");
      lcd.setCursor(0,1);
      lcd.print("Weather Improve");
    }
    
    else if(hg2 < (hg+.15))
    {
      Serial.print(" : Weather to Decline ");
      lcd.setCursor(0,1);
      lcd.print("Weather Decline");
    }
    

    if(pascalhigh < pascal)
    {
      pascalhigh = pascal;
    }
    
    if(pascallow > pascal)
    {
      pascallow = pascal;
    }

    
   
  }

Here are pictures of the Speedometer/CO Sensor Output:

The first screen is where you set the current road conditions:

image

This screen is where you enter where you will be driving:

image

image

More to come tomorrow!!

Dale Winhold

  • Sign in to reply
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2025 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube