Hardware components | ||||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
This project was inspired by a need to find creative ways to read data from a Particle Argon microcontroller. The hardware is intended to be placed in the soil then the Morse Cam app for iOS is used to show data.
The below screenshot shows the hardware with data overlaid in real time.
Screenshot from Morse Cam app for iOS
Morse Cam is available for free on the App Store
/*
* Project LightCommunication
* Description: Uses a NeoPixel to send soil moisture data via morse code * to Morse Cam app for iOS
* Author: Christian Chavez
* Date: March 2021
*/
SYSTEM_MODE(SEMI_AUTOMATIC);
#include <neopixel.h>
#define PIXEL_PIN D2
#define PIXEL_COUNT 12
#define PIXEL_TYPE WS2812B
Adafruit_NeoPixel pixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);
unsigned int currentTime;
unsigned int delayTime;
unsigned int cameraTime;
unsigned int morseTime;
int soilRead;
int soilPin=A2;
uint8_t i;
uint8_t n;
uint8_t soil[4];
bool calState=true;
bool cameraState=false;
bool morseState=false;
void setup() {
pinMode(soilPin, INPUT);
pixel.begin();
pixel.show();
pixel.clear();
pixel.setBrightness(20);
currentTime=millis();
}
void loop() {
if(millis()-currentTime>10000){ //send morse code sequence every 10 seconds
soilRead=analogRead(soilPin);
soil[0]=soilRead/1000; //calculations for accessing individual characters from soil reading
soil[1]=((soilRead-(soil[0]*1000))/100);
soil[2]=(soilRead-(soil[0]*1000)-(soil[1]*100))/10;
soil[3]=(soilRead-(soil[0]*1000)-(soil[1]*100))%10;
sendMorse();
}
}
void sendMorse(){ //.-. / -.-.- <your message> .-.-. //format for sending messages
if(calState==true){
dot(); dash(); dot(); //calibrate camera brightness
calState=false;
cameraState=true;
cameraTime=millis();
Serial.printf("Calibrate\n");
}
if(millis()-cameraTime>300&&cameraState==true){
dash(); dot(); dash(); dot(); dash();//gain camera attention
cameraState=false;
morseState=true;
morseTime=millis();
Serial.printf("Camera\n");
}
if(millis()-morseTime>300&&morseState==true){
for(i=0;i<4;i++){ //loop for sending morse code to neopixel
Serial.printf("soil[i] = %i i = %i\n",soil[i],i);
switch (soil[i]){
case 0:
dash(); dash(); dash(); dash(); dash(); space(); break;
case 1:
dot(); dash(); dash(); dash(); dash(); space(); break;
case 2:
dot(); dot(); dash(); dash(); dash(); space(); break;
case 3:
dot(); dot(); dot(); dash(); dash(); space(); break;
case 4:
dot(); dot(); dot(); dot(); dash(); space(); break;
case 5:
dot(); dot(); dot(); dot(); dot(); space(); break;
case 6:
dash(); dot(); dot(); dot(); dot(); space(); break;
case 7:
dash(); dash(); dot(); dot(); dot(); space(); break;
case 8:
dash(); dash(); dash(); dot(); dot(); space(); break;
case 9:
dash(); dash(); dash(); dash(); dot(); space(); break;
}
if(i==3){
dot(); dash(); dot(); dash(); dot(); //end of message
Serial.printf("Over\n");
currentTime=millis();
calState=true;
cameraState=false;
morseState=false;
}
}
}
}
void dash(){
unsigned int dashOnTime=millis();
while(millis()-dashOnTime<300){
for(n=0;n<=12;n++){
pixel.setPixelColor(n,255,255,255);
pixel.show();
}
}
unsigned int dashOffTime=millis();
while(millis()-dashOffTime<100){
pixel.clear();
pixel.show();
}
}
void dot(){
unsigned int dotOnTime=millis();
while(millis()-dotOnTime<100){
for(n=0;n<=12;n++){
pixel.setPixelColor(n,255,255,255);
pixel.show();
}
}
unsigned int dotOffTime=millis();
while(millis()-dotOffTime<100){
pixel.clear();
pixel.show();
}
}
void space(){
unsigned int spaceTime=millis();
while(millis()-spaceTime<300){
pixel.clear();
pixel.show();
}
}
4 projects • 31 followers
Internet of Things Coding and Hardware Design
Comments