some arduino sketches
This commit is contained in:
110
arduino/wwvb/wwvb.ino
Normal file
110
arduino/wwvb/wwvb.ino
Normal file
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
ESP8266 Blink by Simon Peter
|
||||
Blink the blue LED on the ESP-01 module
|
||||
This example code is in the public domain
|
||||
|
||||
The blue LED on the ESP-01 module is connected to GPIO1
|
||||
(which is also the TXD pin; so we cannot use Serial.print() at the same time)
|
||||
|
||||
Note that this sketch uses LED_BUILTIN to find the pin with the internal LED
|
||||
*/
|
||||
|
||||
#define WWV_SIGNAL_PIN 14
|
||||
|
||||
void ICACHE_RAM_ATTR readLevel();
|
||||
|
||||
volatile byte wwvbInState; // store receiver signal level
|
||||
|
||||
byte prevWwvbInState; // store previous signal level
|
||||
unsigned int prevEdgeMillis; // store time signal was read
|
||||
byte bitVal; // bit decoded 0, 1 or Mark
|
||||
byte badBit; // bad bit, noise detected
|
||||
byte prevMark; // store previous mark bit
|
||||
|
||||
void setup() {
|
||||
pinMode(LED_BUILTIN, OUTPUT); // Initialize the LED_BUILTIN pin as an output
|
||||
pinMode(WWV_SIGNAL_PIN, INPUT);
|
||||
attachInterrupt(digitalPinToInterrupt(WWV_SIGNAL_PIN), readLevel, CHANGE); // fire interrupt on edge detected
|
||||
Serial.begin(9600);
|
||||
Serial.print("herro booted\n");
|
||||
}
|
||||
|
||||
// the loop function runs over and over again forever
|
||||
void loop() {
|
||||
if (wwvbInState != prevWwvbInState) {
|
||||
pulseValue();
|
||||
prevWwvbInState = wwvbInState;
|
||||
}
|
||||
yield();
|
||||
}
|
||||
|
||||
void pulseValue() {
|
||||
unsigned int edgeMillis = millis(); // save current time
|
||||
badBit = 0; // set noise counter to zero
|
||||
if (wwvbInState == 1) { // rising edge
|
||||
prevEdgeMillis = edgeMillis; // set previous time to current
|
||||
}
|
||||
else { // falling edge
|
||||
int pulseLength = edgeMillis - prevEdgeMillis; // calculate pulse length millis
|
||||
if (pulseLength < 100) { // less than 100ms, noise pulses
|
||||
badBit = 1;
|
||||
}
|
||||
else if (pulseLength < 400) { // 800ms carrier drop mark
|
||||
bitVal = 2;
|
||||
}
|
||||
else if (pulseLength < 700) { // 500ms carrier drop one
|
||||
bitVal = 1;
|
||||
}
|
||||
else { // 200ms carrier drop zero
|
||||
bitVal = 0;
|
||||
}
|
||||
if (badBit == 0) {
|
||||
printBitVal();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void readLevel() {
|
||||
wwvbInState = digitalRead(WWV_SIGNAL_PIN); // read signal level
|
||||
digitalWrite(LED_BUILTIN, !wwvbInState); // flash WWVB receiver indicator pin
|
||||
yield();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void printBitVal() {
|
||||
if ((bitVal == 2) && (prevMark == 0)) {
|
||||
Serial.print(" : ");
|
||||
|
||||
prevMark = 1;
|
||||
}
|
||||
else if ((bitVal == 2) && (prevMark == 1)) {
|
||||
Serial.print("\nBit Value: ");
|
||||
Serial.print("| ");
|
||||
|
||||
prevMark = 0;
|
||||
}
|
||||
else {
|
||||
Serial.print(bitVal, DEC);
|
||||
prevMark = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* Time display functions
|
||||
*****************************************************************************/
|
||||
|
||||
void printTime() {
|
||||
Serial.print("?x00?y0?f"); // movie cursor to line 1 char 1, clear screen
|
||||
}
|
||||
|
||||
// LCD routines to initialize LCD and clear screen
|
||||
void lcdInit() { // using P H Anderson Serial LCD driver board
|
||||
Serial.print("?G216"); // configure driver for 2 x 16 LCD
|
||||
delay(300);
|
||||
Serial.print("?BDD"); // set backlight brightness
|
||||
delay(300);
|
||||
Serial.print("?f"); // clear screen
|
||||
Serial.print("?c0"); // set cursor off
|
||||
}
|
||||
Reference in New Issue
Block a user