Yongqiang Wang
/
Receiver
Weather Band Receiver
Revision 0:e8c6523f2c36, committed 2013-04-30
- Comitter:
- yongqiangwang
- Date:
- Tue Apr 30 03:55:17 2013 +0000
- Commit message:
- Receiver
Changed in this revision
diff -r 000000000000 -r e8c6523f2c36 NokiaLCD.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NokiaLCD.lib Tue Apr 30 03:55:17 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/NokiaLCD/#2d1b23692cbb
diff -r 000000000000 -r e8c6523f2c36 NokiaLCD/NokiaLCD.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NokiaLCD/NokiaLCD.cpp Tue Apr 30 03:55:17 2013 +0000 @@ -0,0 +1,467 @@ +/* mbed Nokia LCD Library + * Copyright (c) 2007-2010, sford + */ + +#include "NokiaLCD.h" + +#include "mbed.h" + +#define NOKIALCD_ROWS 16 +#define NOKIALCD_COLS 16 +#define NOKIALCD_WIDTH 130 +#define NOKIALCD_HEIGHT 132 +#define NOKIALCD_FREQUENCY 5000000 + +NokiaLCD::NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type) + : _spi(mosi, NC, sclk) + , _rst(rst) + , _cs(cs) { + + _type = type; + + _row = 0; + _column = 0; + _foreground = 0x00FFFFFF; + _background = 0x00000000; + + reset(); +} + +void NokiaLCD::reset() { + + // setup the SPI interface and bring display out of reset + _cs = 1; + _rst = 0; + _spi.format(9); + _spi.frequency(NOKIALCD_FREQUENCY); + wait_ms(1); + _rst = 1; + wait_ms(1); + + _cs = 0; + + switch (_type) { + case LCD6100: + command(0xCA); // display control + data(0); + data(32); + data(0); + command(0xBB); + data(1); + command(0xD1); // oscillator on + command(0x94); // sleep out + command(0x20); // power control + data(0x0F); + command(0xA7); // invert display + command(0x81); // Voltage control + data(39); // contrast setting: 0..63 + data(3); // resistance ratio + wait_ms(1); + command(0xBC); + data(0); + data(1); + data(4); + command(0xAF); // turn on the display + break; + + case LCD6610: + command(0xCA); // display control + data(0); + data(32); + data(0); + command(0xBB); + data(1); + command(0xD1); // oscillator on + command(0x94); // sleep out + command(0x20); // power control + data(0x0F); + command(0xA7); // invert display + command(0x81); // Voltage control + data(39); // contrast setting: 0..63 + data(3); // resistance ratio + wait_ms(1); + command(0xBC); + data(0); + data(0); + data(2); + command(0xAF); // turn on the display + break; + + case PCF8833: + command(0x11); // sleep out + command(0x3A); // column mode + data(0x05); + command(0x36); // madctl + data(0x60); // vertical RAM, flip x + command(0x25); // setcon + data(0x30);// contrast 0x30 + wait_ms(2); + command(0x29);//DISPON + command(0x03);//BSTRON + break; + } + + _cs = 1; + + cls(); +} + +void NokiaLCD::command(int value) { + _spi.write(value & 0xFF); +} + +void NokiaLCD::data(int value) { + _spi.write(value | 0x100); +} + +void NokiaLCD::_window(int x, int y, int width, int height) { + int x1 = x + 0; + int y1 = y + 0; + int x2 = x1 + width - 1; + int y2 = y1 + height - 1; + + switch (_type) { + case LCD6100: + case LCD6610: + command(0x15); // column + data(x1); + data(x2); + command(0x75); // row + data(y1); + data(y2); + command(0x5C); // start write to ram + break; + case PCF8833: + command(0x2A); // column + data(x1); + data(x2); + command(0x2B); // row + data(y1); + data(y2); + command(0x2C); // start write to ram + break; + } +} + +void NokiaLCD::_putp(int colour) { + int gr = ((colour >> 20) & 0x0F) // + | ((colour >> 8 ) & 0xF0); // + int nb = ((colour >> 4 ) & 0x0F); // ************************* LCD6xxx ************************* + data(nb); // 24-bit Color (0bRRRRRRRRGGGGGGGGBBBBBBBB) + data(gr); // + + /*// USE 24Bit RGB, and shift to 565 + // [R7R6R5R4R3R2R1R0][G7G6G5G4G3G2G1G0][B7B6B5B4B3B2B1B0] // + int rg = ((colour ) & 0xF8) // [B7B6B5B4B3______] // + | ((colour >> 13) & 0x07); // [__________G7G6G5] // + int gb = ((colour >> 19 ) & 0x1F) // [______R7R6R5R4R3] // ************************* PCF8833 ************************* + | ((colour >> 5 ) & 0xE0); // [G4G3G2__________] // 24-bit Color (0bBBBBBBBBGGGGGGGGRRRRRRRR) + data(rg); // + data(gb); // */ +} + +const unsigned char FONT8x8[97][8] = { + 0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20 + 0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00, // ! + 0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00, // " + 0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00, // # + 0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00, // $ + 0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00, // % + 0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00, // & + 0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00, // ' + 0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00, // ( + 0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00, // ) + 0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, // * + 0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00, // + + 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, // , + 0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, // - + 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, // . + 0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, // / (forward slash) + 0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00, // 0 0x30 + 0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00, // 1 + 0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00, // 2 + 0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00, // 3 + 0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00, // 4 + 0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00, // 5 + 0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00, // 6 + 0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00, // 7 + 0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00, // 8 + 0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00, // 9 + 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00, // : + 0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30, // ; + 0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00, // < + 0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00, // = + 0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00, // > + 0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00, // ? + 0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00, // @ 0x40 + 0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00, // A + 0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00, // B + 0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00, // C + 0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00, // D + 0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00, // E + 0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00, // F + 0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00, // G + 0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00, // H + 0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // I + 0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, // J + 0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00, // K + 0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00, // L + 0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00, // M + 0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00, // N + 0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00, // O + 0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00, // P 0x50 + 0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00, // Q + 0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00, // R + 0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00, // S + 0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00, // T + 0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00, // U + 0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00, // V + 0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, // W + 0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00, // X + 0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00, // Y + 0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00, // Z + 0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, // [ + 0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, // \ (back slash) + 0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, // ] + 0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, // ^ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, // _ + 0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00, // ` 0x60 + 0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00, // a + 0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00, // b + 0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00, // c + 0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00, // d + 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00, // e + 0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00, // f + 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C, // g + 0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00, // h + 0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00, // i + 0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C, // j + 0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00, // k + 0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00, // l + 0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00, // m + 0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00, // n + 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00, // o + 0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78, // p + 0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F, // q + 0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00, // r + 0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00, // s + 0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00, // t + 0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00, // u + 0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00, // v + 0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00, // w + 0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00, // x + 0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C, // y + 0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00, // z + 0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00, // { + 0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00, // | + 0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00, // } + 0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00, // ~ + 0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00 +}; // DEL + +void NokiaLCD::locate(int column, int row) { + _column = column; + _row = row; +} + +void NokiaLCD::newline() { + _column = 0; + _row++; + if (_row >= _rows) { + _row = 0; + } +} + +int NokiaLCD::_putc(int value) { + int x = _column * 8; // FIXME: Char sizes + int y = _row * 8; + bitblit(x + 1, y + 1, 8, 8, (char*)&(FONT8x8[value - 0x1F][0])); + + _column++; + + if (_column >= NOKIALCD_COLS) { + _row++; + _column = 0; + } + + if (_row >= NOKIALCD_ROWS) { + _row = 0; + } + + return value; +} + +void NokiaLCD::cls() { + fill(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT, _background); + _row = 0; + _column = 0; +} + + +void NokiaLCD::window(int x, int y, int width, int height) { + _cs = 0; + _window(x, y, width, height); + _cs = 1; +} + +void NokiaLCD::putp(int colour) { + _cs = 0; + _putp(colour); + _cs = 1; +} + +void NokiaLCD::pixel(int x, int y, int colour) { + _cs = 0; + _window(x, y, 1, 1); + switch (_type) { + case LCD6100: + case PCF8833: + + _putp(colour); + + break; + case LCD6610: + + int r4 = (colour >> (16 + 4)) & 0xF; + int g4 = (colour >> (8 + 4)) & 0xF; + int b4 = (colour >> (0 + 4)) & 0xF; + int d1 = (r4 << 4) | g4; + int d2 = (b4 << 4) | r4; + int d3 = (g4 << 4) | b4; + data(d1); + data(d2); + data(d3); + + break; + } + _cs = 1; +} + +void NokiaLCD::fill(int x, int y, int width, int height, int colour) { + _cs = 0; + _window(x, y, width, height); + switch (_type) { + case LCD6100: + case PCF8833: + for (int i=0; i<width*height; i++) { + _putp(colour); + } + break; + case LCD6610: + for (int i=0; i<width*height/2; i++) { + int r4 = (colour >> (16 + 4)) & 0xF; + int g4 = (colour >> (8 + 4)) & 0xF; + int b4 = (colour >> (0 + 4)) & 0xF; + int d1 = (r4 << 4) | g4; + int d2 = (b4 << 4) | r4; + int d3 = (g4 << 4) | b4; + data(d1); + data(d2); + data(d3); + } + break; + } + _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT); + _cs = 1; +} + +void NokiaLCD::blit(int x, int y, int width, int height, const int* colour) { + _cs = 0; + _window(x, y, width, height); + + switch (_type) { + case LCD6100: + case PCF8833: + for (int i=0; i<width*height; i++) { + _putp(colour[i]); + } + break; + case LCD6610: + for (int i=0; i<width*height/2; i++) { + int r41 = (colour[i*2] >> (16 + 4)) & 0xF; + int g41 = (colour[i*2] >> (8 + 4)) & 0xF; + int b41 = (colour[i*2] >> (0 + 4)) & 0xF; + + int r42 = (colour[i*2+1] >> (16 + 4)) & 0xF; + int g42 = (colour[i*2+1] >> (8 + 4)) & 0xF; + int b42 = (colour[i*2+1] >> (0 + 4)) & 0xF; + int d1 = (r41 << 4) | g41; + int d2 = (b41 << 4) | r42; + int d3 = (g42 << 4) | b42; + data(d1); + data(d2); + data(d3); + } + break; + } + _window(0, 0, NOKIALCD_WIDTH, NOKIALCD_HEIGHT); + _cs = 1; +} + +void NokiaLCD::bitblit(int x, int y, int width, int height, const char* bitstream) { + _cs = 0; + _window(x, y, width, height); + + switch (_type) { + case LCD6100: + case PCF8833: + for (int i=0; i<height*width; i++) { + int byte = i / 8; + int bit = i % 8; + int colour = ((bitstream[byte] << bit) & 0x80) ? _foreground : _background; + _putp(colour); + } + break; + case LCD6610: + for(int i=0; i<height*width/2; i++) { + int byte1 = (i*2) / 8; + int bit1 = (i*2) % 8; + int colour1 = ((bitstream[byte1] << bit1) & 0x80) ? _foreground : _background; + int byte2 = (i*2+1) / 8; + int bit2 = (i*2+1) % 8; + int colour2 = ((bitstream[byte2] << bit2) & 0x80) ? _foreground : _background; + + int r41 = (colour1 >> (16 + 4)) & 0xF; + int g41 = (colour1 >> (8 + 4)) & 0xF; + int b41 = (colour1 >> (0 + 4)) & 0xF; + + int r42 = (colour2 >> (16 + 4)) & 0xF; + int g42 = (colour2 >> (8 + 4)) & 0xF; + int b42 = (colour2 >> (0 + 4)) & 0xF; + int d1 = (r41 << 4) | g41; + int d2 = (b41 << 4) | r42; + int d3 = (g42 << 4) | b42; + data(d1); + data(d2); + data(d3); + } + break; + } + _window(0, 0, _width, _height); + _cs = 1; +} + +void NokiaLCD::foreground(int c) { + _foreground = c; +} + +void NokiaLCD::background(int c) { + _background = c; +} + +int NokiaLCD::width() { + return NOKIALCD_WIDTH; +} + +int NokiaLCD::height() { + return NOKIALCD_HEIGHT; +} + +int NokiaLCD::columns() { + return NOKIALCD_COLS; +} + +int NokiaLCD::rows() { + return NOKIALCD_ROWS; +}
diff -r 000000000000 -r e8c6523f2c36 NokiaLCD/NokiaLCD.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NokiaLCD/NokiaLCD.h Tue Apr 30 03:55:17 2013 +0000 @@ -0,0 +1,151 @@ +/* mbed NokiaLCD Library, for a 130x130 Nokia colour LCD + * Copyright (c) 2007-2010, sford + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MBED_NOKIALCD_H +#define MBED_NOKIALCD_H + +#include "mbed.h" + +/** An interface for the 130x130 Nokia Mobile phone screens + * + * @code + * #include "mbed.h" + * #include "NokiaLCD.h" + * + * NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::6610); // mosi, sclk, cs, rst, type + * + * int main() { + * lcd.printf("Hello World!"); + * } + * @endcode + */ +class NokiaLCD : public Stream { + +public: + /** LCD panel format */ + enum LCDType { + LCD6100 /**< Nokia 6100, as found on sparkfun board (default) */ + , LCD6610 /**< Nokia 6610, as found on olimex board */ + , PCF8833 + }; + + /** Create and Nokia LCD interface, using a SPI and two DigitalOut interfaces + * + * @param mosi SPI data out + * @param sclk SPI clock + * @param cs Chip Select (DigitalOut) + * @param rst Reset (DigitalOut) + * @param type The LCDType to select driver chip variants + */ + NokiaLCD(PinName mosi, PinName sclk, PinName cs, PinName rst, LCDType type = LCD6100); + +#if DOXYGEN_ONLY + /** Write a character to the LCD + * + * @param c The character to write to the display + */ + int putc(int c); + + /** Write a formated string to the LCD + * + * @param format A printf-style format string, followed by the + * variables to use in formating the string. + */ + int printf(const char* format, ...); +#endif + + /** Locate to a screen column and row + * + * @param column The horizontal position from the left, indexed from 0 + * @param row The vertical position from the top, indexed from 0 + */ + void locate(int column, int row); + + /** Clear the screen and locate to 0,0 */ + void cls(); + + /** Set a pixel on te screen + * + * @param x horizontal position from left + * @param y vertical position from top + * @param colour 24-bit colour in format 0x00RRGGBB + */ + void pixel(int x, int y, int colour); + + /** Fill an area of the screen + * + * @param x horizontal position from left + * @param y vertical position from top + * @param width width in pixels + * @param height height in pixels + * @param colour 24-bit colour in format 0x00RRGGBB + */ + void fill(int x, int y, int width, int height, int colour); + + void blit(int x, int y, int width, int height, const int* colour); + void bitblit(int x, int y, int width, int height, const char* bitstream); + + int width(); + int height(); + int columns(); + int rows(); + + void reset(); + + /** Set the foreground colour + * + * @param c 24-bit colour + */ + void foreground(int c); + + /** Set the background colour + * + * @param c 24-bit colour + */ + void background(int c); + +protected: + virtual void _window(int x, int y, int width, int height); + virtual void _putp(int colour); + + void command(int value); + void data(int value); + + void newline(); + virtual int _putc(int c); + virtual int _getc() { + return 0; + } + void putp(int v); + void window(int x, int y, int width, int height); + + SPI _spi; + DigitalOut _rst; + DigitalOut _cs; + + LCDType _type; + int _row, _column, _rows, _columns, _foreground, _background, _width, _height; +}; + +#endif + +
diff -r 000000000000 -r e8c6523f2c36 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Apr 30 03:55:17 2013 +0000 @@ -0,0 +1,204 @@ +// - Weather Warning Alert System Receiver + +#include "mbed.h" +#include "NokiaLCD.h" + +Serial Xbee1(p13, p14); // TX, RX +I2C radio(p28, p27); // sda, scl +NokiaLCD lcd(p5, p7, p8, p9, NokiaLCD::LCD6610); // mosi, sclk, cs, rst, type LCD6610, PCF8833 +DigitalOut Weather_rst(p29); // Weather band radio reset +DigitalOut rst1(p26); // Xbee reset +DigitalOut beep(p21); // Piezo speaker +DigitalOut MyRx(LED1); // Data receive +DigitalIn cancel(p20); // Acknowledge alert + +//====================================== Global Variables ============================================= +const int write_addr=0x22; +int wb_pwr_up[3]={0x01, 0x13, 0x05}; // Weather band power-up command +int wb_station[4]={0x50, 0x00, 0xFD, 0xFC}; // Set weather band station to 162.55MHz +int reg_station=0xFDFC, i=0, Response, ack=0, pwr_down=0x11, tune=0x31; +int count,j; +int* p_pwr_down = &pwr_down; +int* p_tune = &tune; +float f = 162.5500; +float wndspd=0, wnddir=0,rngg=0,temp=0,humdty=0,press=0,sunint=0; +char c; +char t[100], // Debug String ==> S1.2 34.5 6.7 89.0 12.8 34.5 67890.1@ +ws[10], wd[10], rg[10], tp[10], hd[10], ps[10], sn[10]; +bool alert=0; + +//=============================== Support Functions for WB Radio ====================================== +void SendCommand(int* array, int length) { /* Send Command to Si4707 */ + radio.start(); + ack=radio.write(write_addr); + for(i=0; i<length; i++) ack=radio.write(array[i]); + Response=radio.read(ack); + radio.stop(); + wait(.2); +} + +void Reset(void) { /* Reset weather band radio */ + Weather_rst=0; + wait(.2); + Weather_rst=1; + wait(.2); +} + +void WB_Restart(void) { /* Reinitialize Weather band receiver */ + SendCommand(p_tune, 1); // Disable carrier + wait(.2); + SendCommand(p_pwr_down, 1); // Power down sequence + wait(.2); + Reset(); + SendCommand(wb_pwr_up, 3); // Launch Weather band radio + wait(.5); + SendCommand(wb_station, 4); // Play current weather band station +} + +// =========================================== Main Program =========================================== +int main() { + cancel.mode(PullUp); + beep=0; + MyRx=0; + rst1 = 0; + wait_ms(200); + rst1 = 1; // Reset Xbee + radio.frequency(100000); // I^2C frequency setting 100kHz + lcd.cls(); // Clear LCD + lcd.background(0x0000FF); // Set LCD background to blue + while(1) { + if(alert) { + beep=1; + wait(1); + beep=0; + wait(1); + beep=1; + wait(1); + beep=0; + wait(1); + beep=1; + wait(1); + beep=0; + wait(1); + beep=1; + wait(1); + beep=0; + wait(1); + Reset(); + WB_Restart(); // Start WB radio + while(cancel); // Wait for user response + alert=0; + lcd.cls(); + lcd.background(0x0000FF); + SendCommand(p_tune, 1); + wait(.2); + SendCommand(p_pwr_down, 1); // Stop WB radio + wait(.2); + } + if(Xbee1.readable()) { // Data available to receive + c=Xbee1.getc(); + if(c=='A') alert=1; // Send 'A' on serial port to sound speaker + if(c=='S'){ // Beginning of data array + int i=0; + while((c=Xbee1.getc())!='@') // Loop until terminator reached + t[i++]=c; + t[i]='\0'; + count=0; + j=0; + MyRx=1; + wait_ms(200); + MyRx=0; + for(int i=0; i<sizeof(t); i++) { // Parse data array + if(t[i]=='\0') break; + if(t[i]==' ') continue; + if((t[i]!=' ')&&(t[i-1]==' ')) { + j=0; + count++; + } + switch(count) { // Space count of data array + case 1: // Build wind speed subarray + ws[j++]=t[i]; + break; + case 2: // Build wind direction subarray + wd[j++]=t[i]; + break; + case 3: // Build rain gauge subarray + rg[j++]=t[i]; + break; + case 4: // Build temperature subarray + tp[j++]=t[i]; + break; + case 5: // Build humidity subarray + hd[j++]=t[i]; + break; + case 6: // Build pressure subarray + ps[j++]=t[i]; + break; + case 7: // Build sunlight intensity subarray + sn[j++]=t[i]; + break; + default:; + } + } + wndspd=atof(ws); + wnddir=atof(wd); + rngg=atof(rg); + temp=atof(tp); + humdty=atof(hd); + press=atof(ps); + sunint=atof(sn); + lcd.cls(); + //------------------------- Define alerts ------------------------- + if((temp>40)||(temp<0)) { + alert=1; + lcd.locate(0,10); + lcd.printf("Temperature!!!"); + lcd.background(0xFF0000); + } + else if (wndspd>4){ + alert=1; + lcd.locate(0,10); + lcd.printf("Wind!!!"); + lcd.background(0xFF0000); + } + else if (humdty>95){ + alert=1; + lcd.locate(0,10); + lcd.printf("Humidity!!!"); + lcd.background(0xFF0000); + } + else if (sunint<10){ + alert=1; + lcd.locate(0,10); + lcd.printf("Cloudy!!!"); + lcd.background(0xFF0000); + } + else if ((3*rngg)>25){ + alert=1; + lcd.locate(0,10); + lcd.printf("Flood!!!"); + lcd.background(0xFF0000); + } + else lcd.background(0x0000FF); + lcd.locate(0,1); + lcd.printf("WndSPd: %3.1fm/s",wndspd); + lcd.locate(0,2); + lcd.printf("WndDir: %3.1fdg",wnddir); + lcd.locate(0,3); + lcd.printf("Rain: %3.1fmm/hr",3*rngg); + lcd.locate(0,4); + lcd.printf("TEMP: %3.1fC",temp); + lcd.locate(0,5); + lcd.printf("Humidity: %3.1f%%",humdty); + lcd.locate(0,6); + lcd.printf("Press: %5.1fPa",press); + lcd.locate(0,7); + lcd.printf("Sun: %3.1f%%",sunint); + wait(1); + } + MyRx=1; + wait_ms(200); + MyRx=0; + } + } +} \ No newline at end of file
diff -r 000000000000 -r e8c6523f2c36 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Apr 30 03:55:17 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/7e6c9f46b3bd \ No newline at end of file