<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://onnocenter.or.id/wiki/index.php?action=history&amp;feed=atom&amp;title=WSPR%3A_Arduino_sederhana</id>
	<title>WSPR: Arduino sederhana - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://onnocenter.or.id/wiki/index.php?action=history&amp;feed=atom&amp;title=WSPR%3A_Arduino_sederhana"/>
	<link rel="alternate" type="text/html" href="https://onnocenter.or.id/wiki/index.php?title=WSPR:_Arduino_sederhana&amp;action=history"/>
	<updated>2026-04-03T18:00:35Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.4</generator>
	<entry>
		<id>https://onnocenter.or.id/wiki/index.php?title=WSPR:_Arduino_sederhana&amp;diff=46326&amp;oldid=prev</id>
		<title>Onnowpurbo: Created page with &quot;Sumber: http://blog.riyas.org/2015/01/weak-signals-and-random-piece-of-wire-arduino-ad9850-WSPR.html      /*    * A simple single freq AD9850 Arduino test script   * Original...&quot;</title>
		<link rel="alternate" type="text/html" href="https://onnocenter.or.id/wiki/index.php?title=WSPR:_Arduino_sederhana&amp;diff=46326&amp;oldid=prev"/>
		<updated>2016-10-06T07:52:22Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;Sumber: http://blog.riyas.org/2015/01/weak-signals-and-random-piece-of-wire-arduino-ad9850-WSPR.html      /*    * A simple single freq AD9850 Arduino test script   * Original...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Sumber: http://blog.riyas.org/2015/01/weak-signals-and-random-piece-of-wire-arduino-ad9850-WSPR.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 /* &lt;br /&gt;
  * A simple single freq AD9850 Arduino test script&lt;br /&gt;
  * Original AD9851 DDS sketch by Andrew Smallbone at www.rocketnumbernine.com&lt;br /&gt;
  * Modified for testing the inexpensive AD9850 ebay DDS modules&lt;br /&gt;
  * Pictures and pinouts at nr8o.dhlpilotcentral.com&lt;br /&gt;
  * 9850 datasheet at http://www.analog.com/static/imported-files/data_sheets/AD9850.pdf&lt;br /&gt;
  * From http://www.george-smart.co.uk/wiki/Arduino_WSPR&lt;br /&gt;
  *  modification by http://blog.riyas.org&lt;br /&gt;
  * Use freely&lt;br /&gt;
  */&lt;br /&gt;
  &lt;br /&gt;
 #define W_CLK 8       // Pin 8 - connect to AD9850 module word load clock pin (CLK)&lt;br /&gt;
 #define FQ_UD 9       // Pin 9 - connect to freq update pin (FQ)&lt;br /&gt;
 #define DATA 10       // Pin 10 - connect to serial data load pin (DATA)&lt;br /&gt;
 #define RESET 11      // Pin 11 - connect to reset pin (RST).&lt;br /&gt;
 #define LED       13 //flashes duty cycle&lt;br /&gt;
 #define SWITCH    A0 // connect this to a switch and the other end to vcc via 10k resistor&lt;br /&gt;
 #define CLOCKLED  3 //flash every seconds &lt;br /&gt;
 &lt;br /&gt;
 #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }&lt;br /&gt;
 &lt;br /&gt;
 #define WSPR_TX_B     7.040000e6  // this is the bottom of the band. The station moves about.&lt;br /&gt;
&lt;br /&gt;
 // DDS Offset in Hz&lt;br /&gt;
 #define DDS_OSET  50  //DDS #2&lt;br /&gt;
 #define WSPR_DUTY  3 // transmit every N slices.&lt;br /&gt;
 &lt;br /&gt;
 // WSPR Tone Data - line breaks in no parciular place, just to look pretty. (0-161).&lt;br /&gt;
 //callsign locator power in dbm&lt;br /&gt;
 // to bulid this array see:http://www.george-smart.co.uk/wiki/Arduino_WSPR&lt;br /&gt;
 static byte WSPR_DATA_HOME[] = {1,1,0,0,1,1,0,0,3,0,0,2,3,3,1,2,2,2,1,2,2,1,0,3,3,3,3,0,0,2,0,2,...................................,2}; &lt;br /&gt;
 &lt;br /&gt;
 #define WSPR_DATA WSPR_DATA_HOME&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 // Variables&lt;br /&gt;
 unsigned long  WSPR_TXF = 0;&lt;br /&gt;
 unsigned long minute =1;&lt;br /&gt;
 unsigned long seconds=0;&lt;br /&gt;
 unsigned long tstart=0;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 unsigned long startT = 0, stopT = 0;&lt;br /&gt;
 char sz[32];&lt;br /&gt;
 int duty=0;&lt;br /&gt;
 int val=0;&lt;br /&gt;
 int band=0;&lt;br /&gt;
  &lt;br /&gt;
 // transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line&lt;br /&gt;
 void tfr_byte(byte data)&lt;br /&gt;
 {&lt;br /&gt;
   for (int i=0; i&amp;lt;8; i++, data&amp;gt;&amp;gt;=1) {&lt;br /&gt;
     digitalWrite(DATA, data &amp;amp; 0x01);&lt;br /&gt;
     pulseHigh(W_CLK);   //after each bit sent, CLK is pulsed high&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 // frequency calc from datasheet page 8 = &amp;lt;sys clock&amp;gt; * &amp;lt;frequency tuning word&amp;gt;/2^32&lt;br /&gt;
 void sendFrequency(double frequency) {&lt;br /&gt;
   int32_t freq = frequency * 4294967295/125000000;  // note 125 MHz clock on 9850&lt;br /&gt;
   for (int b=0; b&amp;lt;4; b++, freq&amp;gt;&amp;gt;=8) {&lt;br /&gt;
     tfr_byte(freq &amp;amp; 0xFF);&lt;br /&gt;
   }&lt;br /&gt;
   tfr_byte(0x000);   // Final control byte, all 0 for 9850 chip&lt;br /&gt;
   pulseHigh(FQ_UD);  // Done!  Should see output&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void setup() {&lt;br /&gt;
  // configure arduino data pins for output&lt;br /&gt;
   pinMode(FQ_UD, OUTPUT);&lt;br /&gt;
   pinMode(W_CLK, OUTPUT);&lt;br /&gt;
   pinMode(DATA, OUTPUT);&lt;br /&gt;
   pinMode(RESET, OUTPUT);&lt;br /&gt;
     &lt;br /&gt;
   pulseHigh(RESET);&lt;br /&gt;
   pulseHigh(W_CLK);&lt;br /&gt;
   pulseHigh(FQ_UD);  // this pulse enables serial mode - Datasheet page 12 figure 10&lt;br /&gt;
   &lt;br /&gt;
   pinMode (LED,       OUTPUT);&lt;br /&gt;
   pinMode (CLOCKLED,       OUTPUT);&lt;br /&gt;
   pinMode(SWITCH, INPUT);&lt;br /&gt;
   &lt;br /&gt;
  &lt;br /&gt;
   Serial.begin(9600);&lt;br /&gt;
   &lt;br /&gt;
   sprintf(sz, &amp;quot;\nLB7UG Compiled %s %s&amp;quot;, __TIME__, __DATE__);&lt;br /&gt;
   Serial.println(sz);  &lt;br /&gt;
   Serial.print(&amp;quot;\n\nDDS Reset   &amp;quot;);&lt;br /&gt;
   delay(900);&lt;br /&gt;
   delay(100);&lt;br /&gt;
   Serial.println(&amp;quot;OK&amp;quot;);  &lt;br /&gt;
   duty = 0;  &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void loop() {&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
   //let us make a poor mans clock which needs a click on SWITCH pin to high at an even minute&lt;br /&gt;
         &lt;br /&gt;
          val=analogRead(SWITCH);&lt;br /&gt;
          //Serial.println(val);&lt;br /&gt;
          if (val == 1023) { &lt;br /&gt;
           //reset the clock here&lt;br /&gt;
      tstart = millis()/1000UL;&lt;br /&gt;
          wsprTX(); &lt;br /&gt;
          Serial.println(tstart);&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
      //WSPR_TXF = (WSPR_TX_B+DDS_OSET) + random(10, 190); // always choose a frequency,  a little with the pRNG.&lt;br /&gt;
      WSPR_TXF = (WSPR_TX_B+DDS_OSET); // always choose a frequency,  a little with the pRNG.&lt;br /&gt;
           //wsprTX();&lt;br /&gt;
          // UPDATING TIME DO NOT INSERT COMMANDS BELOW!!&lt;br /&gt;
      seconds=(millis()/1000UL)-tstart;&lt;br /&gt;
      minute= seconds/60UL; &lt;br /&gt;
          //Serial.println(minute);&lt;br /&gt;
 &lt;br /&gt;
       if ( (minute % 2 == 0) &amp;amp;&amp;amp; (minute &amp;gt; 1) &amp;amp;&amp;amp; (seconds &amp;gt;= 1) &amp;amp;&amp;amp; (seconds &amp;lt;= 4) ) {  // start transmission &lt;br /&gt;
         //if (duty % WSPR_DUTY == 0) {&lt;br /&gt;
           if (1) {&lt;br /&gt;
           //Serial.print(&amp;quot;Beginning WSPR Transmission on &amp;quot;);&lt;br /&gt;
           //Serial.print(WSPR_TXF-DDS_OSET);&lt;br /&gt;
           //Serial.println(&amp;quot; Hz.&amp;quot;);&lt;br /&gt;
           wsprTX();&lt;br /&gt;
           duty++;&lt;br /&gt;
           band++;&lt;br /&gt;
           //Serial.println(&amp;quot; Transmission Finished.&amp;quot;);    &lt;br /&gt;
         } else {&lt;br /&gt;
           duty++;&lt;br /&gt;
           digitalWrite (LED, LOW);          &lt;br /&gt;
           flash_led(WSPR_DUTY, LED); // flash the WSPR duty.&lt;br /&gt;
         }&lt;br /&gt;
       }&lt;br /&gt;
      //update time again &lt;br /&gt;
      seconds=(millis()/1000UL)-tstart;  &lt;br /&gt;
 &lt;br /&gt;
      if ((seconds % 2 ==0) &amp;amp;&amp;amp; (tstart!=0)){  // oru bhangikku vendi&lt;br /&gt;
      digitalWrite(CLOCKLED, HIGH);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
      digitalWrite(CLOCKLED, LOW);&lt;br /&gt;
      }&lt;br /&gt;
       &lt;br /&gt;
  } &lt;br /&gt;
  &lt;br /&gt;
 &lt;br /&gt;
 void flash_led(unsigned int t, int l) {&lt;br /&gt;
   unsigned int i = 0;&lt;br /&gt;
   if (t &amp;gt; 25) {&lt;br /&gt;
     digitalWrite(l, HIGH);&lt;br /&gt;
     delay(2000);&lt;br /&gt;
     digitalWrite(l, LOW);&lt;br /&gt;
   } else {&lt;br /&gt;
     for (i=0;i&amp;lt;t;i++) {&lt;br /&gt;
       digitalWrite(l, HIGH);&lt;br /&gt;
       delay(250);&lt;br /&gt;
       digitalWrite(l, LOW);&lt;br /&gt;
       delay(250);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
   &lt;br /&gt;
 void wsprTX() {&lt;br /&gt;
   int i = 0; &lt;br /&gt;
 &lt;br /&gt;
   digitalWrite(LED, HIGH);&lt;br /&gt;
   for (i=0;i&amp;lt;162;i++) {&lt;br /&gt;
     wsprTXtone( WSPR_DATA[i] );&lt;br /&gt;
     delay(682);&lt;br /&gt;
   }&lt;br /&gt;
   sendFrequency(0);&lt;br /&gt;
   digitalWrite(LED, LOW);&lt;br /&gt;
 }&lt;br /&gt;
     &lt;br /&gt;
 void wsprTXtone(int t) {&lt;br /&gt;
   if ((t &amp;gt;= 0) &amp;amp;&amp;amp; (t &amp;lt;= 3) ) {&lt;br /&gt;
      //Serial.print((WSPR_TXF + (t * 2)));&lt;br /&gt;
     sendFrequency((WSPR_TXF + (t * 2))); // should really be 1.4648 Hz not 2.&lt;br /&gt;
   } else {&lt;br /&gt;
     Serial.print(&amp;quot;Tone #&amp;quot;);&lt;br /&gt;
     Serial.print(t);&lt;br /&gt;
     Serial.println(&amp;quot; is not valid.  (0 &amp;lt;= t &amp;lt;= 3).&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referensi==&lt;br /&gt;
&lt;br /&gt;
* http://blog.riyas.org/2015/01/weak-signals-and-random-piece-of-wire-arduino-ad9850-WSPR.html&lt;/div&gt;</summary>
		<author><name>Onnowpurbo</name></author>
	</entry>
</feed>