Devices & Components
Grove Base Shield V2.0 for Arduino
Arduino Uno Rev3
Seeed Studio Grove - 16 x 2 LCD (White on Blue)
FG-3+ Sensor
Software & Tools
Arduino IDE
Project description
Code
Grove_Magnetometer_Sensor_Code
cpp
Grove_Magnetometer_Sensor_Code
1/* 2 * Grove Magenetometer sensor v1.0 3 * August 2022 4*/ 5 6#include <Wire.h> 7#include "rgb_lcd.h" 8 9rgb_lcd lcd; 10 11const int colorR = 255; 12const int colorG = 0; 13const int colorB = 0; 14 15/* Define names for used pins */ 16int sensorDig = 3; // D2 connector (D3 input for digital) 17 18/* Define sensor update rate in ms */ 19unsigned int updateRate = 500; 20 21/* Define sensor measure time in ms */ 22unsigned int measureTime = 100; 23 24/* Define variables */ 25int state = 0; //Stores current state 26volatile unsigned int intEnable = 0; //0-counter for sensors is not incremented; 1-counter for sensors is incremented 27volatile unsigned long sensorDigCnt = 0; //Stores number of counted changes for Digital sensor 28volatile int sensorAnalog = 0; //Variable to store the value coming from the analog sensor 29unsigned long prevMillis = 0; //Stores previous millis() for calculating refresh rate 30 31 32/* Setup loop */ 33void setup() { 34 /* Setup LCD column and row number */ 35 lcd.begin(16, 2); 36 lcd.setRGB(colorR, colorG, colorB); 37 38 lcd.setCursor(0,0); 39 lcd.print("GROVE MAG SENSOR"); 40 41 /* Setup pins */ 42 pinMode(sensorDig, INPUT); 43 44 /* Setup interrupts */ 45 attachInterrupt(digitalPinToInterrupt(sensorDig), sensorDigHandler, RISING); 46} 47 48/* Main loop */ 49void loop() { 50 /* Measure current time */ 51 unsigned long currMillis = millis(); 52 53 /* State machine - user can add more states */ 54 switch(state){ 55 /* Calculate new sensor data and update LCD */ 56 case 1: 57 /* Calculate number of actual pulses per [ms] 58 Divide by 2 since we measure change in signal and by measureTime to get number of pulses per [ms]*/ 59 60 sensorDigCnt = (sensorDigCnt); 61 62 /* Update LCD */ 63 lcdUpdate(sensorDigCnt); 64 65 /* Reset variables */ 66 state = 0; 67 68 /* User can add more cases (states) here */ 69 } 70 71 /* If defined sensor update rate has passed measure sensors */ 72 if(currMillis - prevMillis >= updateRate) { 73 /* Reset variables */ 74 sensorDigCnt = 0; 75 76 /* Save current time */ 77 prevMillis = currMillis; 78 79 /* Measure number of changes in signal for defined time */ 80 intEnable = 1; 81 delay(measureTime); 82 intEnable = 0; 83 84 /* Enable state 1 */ 85 state = 1; 86 } 87 88} 89 90/* Digital sensor interrupt handler */ 91void sensorDigHandler(){ 92 if (intEnable==1) 93 sensorDigCnt++; 94} 95 96/* Function to update the LCD */ 97void lcdUpdate(unsigned long sensorD){ 98 /*Write new data to LCD */ 99 lcd.setCursor(0,1); 100 lcd.print(" "); 101 if(sensorD>9999){ 102 lcd.print(sensorD); 103 } 104 else{ 105 lcd.print(" "); 106 lcd.print(sensorD); 107 } 108}
Comments
Only logged in users can leave comments