Posts Tagged ‘Arduino’


Assalamu’alaikum Wr. Wb.

Diagram Sync Data ke server slave

Diagram Sync Data ke server slave

alamat server slave di ralat di http://appscenter.aio.co.id/weatherlogger/

alamat master logger di http://weatherlogger.ap.ngrok.io/

Oke saya lanjutkan. remind lagi ini adalah seri berantai dari posting berikut ya

  1. https://tarecha.wordpress.com/2015/10/26/project-raspberry-pi/
  2. https://tarecha.wordpress.com/2017/06/05/project-weather-logger-part-1/
  3. https://tarecha.wordpress.com/2017/06/26/project-weather-logger-part-2-tambahan-sensor-tekanan-udara/
  4. https://tarecha.wordpress.com/2017/07/01/project-weather-logger-part-3-komunikasi-udp/
  5. https://tarecha.wordpress.com/2017/07/15/project-weather-logger-part-4-simpan-di-server-mysql/
  6. https://tarecha.wordpress.com/2017/07/24/project-weather-logger-part-5-view-data-dan-export/
  7. https://tarecha.wordpress.com/2017/07/25/project-weather-logger-part-6-plot-graphic/
  8. https://tarecha.wordpress.com/2017/07/29/project-weather-logger-part-7-ngrok-http-tunneling/
  9. https://tarecha.wordpress.com/2017/08/27/project-weather-logger-part-8-ganti-sensor-bme280/

 

sepertinya ini part terahir ya. selanjutnya cman tambahan2 fitur saja mungkin, seperti mbandingkan suhu malang sama pasuruan atau membandingkan suhu dalam 3 hari terakhir. cman improvement di PHP nya saja.

Big Picture System

Big Picture System

tentu masih ingat gambar ini kan di part sebelumnya. ya tujuan ada synconize data adalah mengatasi ketebatasan koneksi internet yang baru bisa jalan saat tehtering internet melalui smartphone dilakukan. dan ketika master logger raspberry pi tidak konek internet sehingga tidak bisa diakses langsung menggunakan ngrok http tunelling. user bisa akses ke slave server. tentu kombinasinya itu multi site, jadi berapapun master logger raspberry pi / windows yang ada bisa di sync datanya ke slave server. slave server ini pun bisa lebih dari 1, bisa 2, bisa 3. tapi sih cukup 1 saja saya rasa sudah lebih dari cukup

Jika Anda kritis dengan skema yang saya buat kira2 akan menanyakan hal seperti ini

  1. Mengapa menggunakan port 80 baik pada socket untuk komunikasi dengan node mcu maupun save datanya menggunakan php yang juga jalan di port 80 ?
  2. mengapa simpan datanya tidak langsung pakai mysql yang nembak langsung ke database, lebih efisien daripada masih harus bikin program php nya

Ok saya akan coba jawab

  1. Port 80 adalah port open yang sangat jarang sekali oleh administrator jaringan di blok ( klo di blok gk bisa buka kompas youtube ataupun gmail ) jadi karena “port yang pasti dibuka” maka saya gunakan port 80 untuk komunikasi nya. meski agak aneh kirim data UDP ke node mcu pakai port 80.
  2. Jarang sekali ada web hosting yang membuka port 3306 untuk akses MySQL secara langsung, saya berfikir kedepan gimana kalau saya taruh di webhosting yang murah atau bahkan webhosting gratisan ? setahu saya mereka gk buka port 3306 nya. Jadi saya pakai program PHP untuk save datanya karena dia jalan di port 80 yang pasti open dan bisa ditaruh di webhosting shared biasa. contohnya slave server http://appscenter.aio.co.id/weatherlogger/ s    ini hanya diopen port 80 nya saja karena ini adalah webserver yang bisa diakses dari luar :-). soal keamanan juga. sebenarnya saya numpang ke server saya sendiri he he . tapi insyaAllah aman kok.

 

kode lengkapnya saya upload di https://github.com/tarecha/weatherlogger karena saya gk bisa pakai git, biasanya pakai svn tortoise, ah ribet jadi diupload biasa pakai file .zip

file sync.py

import socket
import sys
import datetime
import time
import urllib2
import urllib

 

urlsourcegetsync = "http://localhost/getsync.php"
urlsourceupdatestatus = "http://localhost/updatestatussync.php"
urldestinationinsertdata = "http://isikan alamat slave server/insertdata.php"
key = "12345"
updateflag = 'sync1'
limit = '20'
sleeptime = 1
sleeptimeerror = 5
i=0
while 1:
         
        try :
                print '# '+str(i)
                datagetupdate={}
                datagetupdate['k']= key
                datagetupdate['sync'] = updateflag
                datagetupdate['limit'] = limit
                dataformaturl = urllib.urlencode(datagetupdate)                    
                requesttoserver = urllib2.urlopen(urlsourcegetsync,dataformaturl,timeout=5)
                datarowall=requesttoserver.read()
                             
                if(datarowall[0]!='i'): #jika kembalian ada i nya maka gagal kalau tidak maka lanjut
                        datarow = datarowall.split("#")
                        datarow.pop() #hapus last row karena isinya kosong (/r/n/r/n) new line                        
                        print 'ada data baru'
                        #print datarowall
                        #print datarowall
                        #print datarow
                        for valuetosync in datarow:
                                
                                datasync={}
                                datasync=valuetosync.split(",")
                                data={}
                                data['k']= key
                                data['iddata'] = datasync[0]
                                data['idnode'] = datasync[1]
                                data['hum'] = datasync[2]
                                data['temp'] = datasync[3]
                                data['press'] =  datasync[4]                                
                                data['waktu'] = datasync[5]                                
                                if updateflag=='sync1':
                                        data['sync1'] = '1'
                                else:
                                        data['sync1'] = '0'
                                if updateflag=='sync2':
                                        data['sync2'] = '1'
                                else:
                                        data['sync2'] = '0'
                                #print data
                                dataformaturl = urllib.urlencode(data)                                
                                requesttoserver = urllib2.urlopen(urldestinationinsertdata,dataformaturl,timeout=5)               
                                
                                infosavephp = requesttoserver.read().split("#")
                                time.sleep(sleeptime) 
                                
                                #print '=========================================================================='  
                                if(infosavephp[0]=='i')and(infosavephp[1]=='Berhasil Insert'):
                                        print 'Informasi : Sync ke Slave Server : ID '+infosavephp[2]
                                        #updatestatus
                                        dataupdatestatus={}
                                        dataupdatestatus['k']=key
                                        dataupdatestatus['iddata']=infosavephp[2]
                                        dataupdatestatus['sync']=updateflag
                                        dataformaturl = urllib.urlencode(dataupdatestatus)
                                        requesttoserver = urllib2.urlopen(urlsourceupdatestatus,dataformaturl,timeout=5)
                                        infosavephp = requesttoserver.read().split("#")                                       
                                        print 'Informasi : '+infosavephp[1]+ ' ke master logger'
                                else:
                                        print 'update status sync gagal '
                                        print infosavephp
                                
                                
                                     
                                        
                else: #kembalian getsync.php
                        print 'tidak ada data baru'
                        
                time.sleep(sleeptime)                        
                 
        except urllib2.HTTPError:
                print 'Tidak konek server untuk sync'
                sleep(sleeptimeerror) 
        except urllib2.URLError:
                print 'Tidak konek server untuk sync'
                time.sleep(sleeptimeerror) 
                
        except socket.error:
                print 'Tidak konek node'
                #tidak pernah exit karena kalau tidak konek dilewati dan ngulang
                #5 detik kemudian
                #sys.exit()
                time.sleep(sleeptimeerror) 
        except Exception as e:
                print 'Error Message '+ str(e)
                print('Error on line {}'.format(sys.exc_info()[-1].tb_lineno), type(e).__name__, e)
                print "General Error Unexpected error:", sys.exc_info()[0]
                time.sleep(sleeptimeerror) 
        i+=1
        
       


Sync Data

Sync Data

 

ini dari cara kerjanya adalah .

selama koneksi ada maka dia akan sync data, ketika tidak ada ya tetep jalan cman gk sync data karena gk konek. ketika ada koneksi maka list data yang belum di sync kana disync secara berurutan.

sekian kira2.

nanti akan saya buatkan resume dalam bahasa inggris sekalian di ikutkan dalam project hackster.io.

 

Terima Kasih

Wassalamu’alikum Wr. Wb.

Iklan

Assalamu’alaikum Wr. Wb.

Oke saya lanjutkan. remind lagi ini adalah seri berantai dari posting berikut ya

  1. https://tarecha.wordpress.com/2015/10/26/project-raspberry-pi/
  2. https://tarecha.wordpress.com/2017/06/05/project-weather-logger-part-1/
  3. https://tarecha.wordpress.com/2017/06/26/project-weather-logger-part-2-tambahan-sensor-tekanan-udara/
  4. https://tarecha.wordpress.com/2017/07/01/project-weather-logger-part-3-komunikasi-udp/
  5. https://tarecha.wordpress.com/2017/07/15/project-weather-logger-part-4-simpan-di-server-mysql/
  6. https://tarecha.wordpress.com/2017/07/24/project-weather-logger-part-5-view-data-dan-export/
  7. https://tarecha.wordpress.com/2017/07/25/project-weather-logger-part-6-plot-graphic/
  8. https://tarecha.wordpress.com/2017/07/29/project-weather-logger-part-7-ngrok-http-tunneling/

2017-08-27 11_34_15-untitled - Paint

setelah beberapa saat humidity dari sensor DHT drop menjadi 1.4 %. lalu saya perbaiki dengan di solder lagi, mungkin karena sensornya kena panas jadi dia kembali normal lagi. setelah beberapa saat drop lagi. saya yakin ini bukan soal softwarenya, dan setelah cari-cari memang sensor DHT22 ini sensor murah, jadi ya gak bisa perform lama.salah satu keterangan di forum berikut . https://arduino.stackexchange.com/questions/17237/humidity-values-returned-by-dht22-sensors-failing-after-some-time

jadi saya beli lagi sensor BME280 dan node mcu 1 unit lagi. dan mengganti seluruh codingnya jadi 3 data saja, humidity, temperature, dan pressure. tinggal edit2 sedikit sih.

bme 280

kurang lebih mirip sensor bmp 280, alamatnya juga diganti, dibrary dari adafruit librarynya bisa didownload dari sini https://learn.adafruit.com/adafruit-bme280-humidity-barometric-pressure-temperature-sensor-breakout/wiring-and-test 2017-08-27 11_42_50-D__arduino-1.8.2-windows_arduino-1.8.2-windows_arduino-1.8.2_libraries_Adafruit_

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

Adafruit_BME280 bme; // I2C

WiFiUDP Udp;
byte localUdpPort = 80;  // local port to listen on
char incomingPacket[255];  // buffer for incoming packets
char  replyPacket[255];

//untuk server
const char* ssid = "tarecha";
const byte buzzerPin = D8;
const char* password = "12345678a";
const String aHostname = "N1";
String dataSensor;
String infoNode;
unsigned long delayKirimDataSensor = 0;

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  Serial.begin(9600);

  Wire.begin(D2, D1); //Sensor bme
  WiFi.begin(ssid, password);
  if (!bme.begin()) {
    Serial.println(F("Could not find a valid bme280 sensor, check wiring!"));
    while (1);
  }
  //bagian setup wifi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.mode(WIFI_STA);
  WiFi.hostname(aHostname);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");

  }
  Serial.println(" connected");
  Udp.begin(localUdpPort);
  infoNode = (String)"Restart reason : " + ESP.getResetReason().c_str() + "\n MAC : " + WiFi.macAddress().c_str() + "\n Hostname : " + WiFi.hostname().c_str() + "\n Signal Stringth : " + WiFi.RSSI() +
             "\n Local IP : " + WiFi.localIP().toString().c_str() + "\n Port : " + localUdpPort + "\n CPU Freq : " + String(ESP.getCpuFreqMHz()) + " MHz\n Sketch Size : " + ESP.getSketchSize()
             + "\n Free Space Sketch Size : " + ESP.getFreeSketchSpace();

  Serial.println(infoNode);

  buzzerlampu();
}

void buzzerlampu()
{
  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(buzzerPin, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, HIGH);
  digitalWrite(buzzerPin, LOW);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(buzzerPin, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, HIGH);
  digitalWrite(buzzerPin, LOW);
  delay(500);

}

void lampu()
{
   digitalWrite(LED_BUILTIN, LOW);
   delay(500);
   digitalWrite(LED_BUILTIN, HIGH);
   delay(5); 

}

void loop()
{

  if (delayKirimDataSensor > 200000)
  {
    UpdateSensor();
    Serial.println(dataSensor);
    delayKirimDataSensor = 0;
  }
  delayKirimDataSensor++;
  requestHandler();

}

void UpdateSensor()
{

  dataSensor = (String)aHostname + "," + bme.readHumidity()+ "," + bme.readTemperature() + "," + bme.readPressure()/100.0F;
}

void requestHandler()
{
  int packetSize = Udp.parsePacket();

  if (packetSize)
  {
    // receive incoming UDP packets
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
       incomingPacket[len] = 0;
    }
    Serial.printf("UDP packet contents: %s\n", incomingPacket);
    if (incomingPacket[0] == 'd') //get data
    {
      dataSensor.toCharArray(replyPacket, 255);
    }
    else if (incomingPacket[0] == 'i') //get info sensor
    {
      infoNode.toCharArray(replyPacket, 255);
    }
    else if (incomingPacket[0] == 'r') //perintah restart
    {
      String perintah = (String)"Terima udp perintah restart dari "+ Udp.remoteIP().toString().c_str();
      perintah.toCharArray(replyPacket, 255);
      Serial.println(perintah);
      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
      Udp.write(replyPacket);
      Udp.endPacket();
      digitalWrite(buzzerPin, HIGH);
      digitalWrite(LED_BUILTIN, LOW);
      delay(10000);
      ESP.restart();
    }
    else
    {
      String lain = "masuk else";
      lain.toCharArray(replyPacket, 255);
    }

    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(replyPacket);
    Udp.endPacket();
    Serial.printf("isi reply packet %s\n", replyPacket);
    lampu(); //nyalakan lampu biru setiap kirim data

  }

}

kode lainnya tinggal penyesuaian saja dihilangkan temperature dht nya karena gk pakai sensor tersebut.

hasilnya sebagai berikut. nanti code terakhirnya saya svn kan saja, saya gk bisa pakai git he he.

dan jadinya seperti ini jadi 3 data saja. schematiknya tetap sama. saya gk jadi pakai yang baru. yang node sudah jadi lama saya upload ulang dan ganti sensor bme 280 saja. sedangkan node satunya mau saya pakai remote reboot saja untuk ikut kompetisi di hackster.io

2017-08-27 11_48_51-VNC Viewer

 

oh ya soal sync data ke slave server saya belum bisa. masih gagal ketika koneksi putus dan ada lagi langsung  lanjutkan sync data. jadi nanti saja saya posting kalau sudah berhasil. tinggal sync data doank sih. klo udah ya selesai. klo mau ya bisa ditambahkan perbandingan suhu di kota A dan di kota B dalam bentuk grafik. biar tahu perbandingannya.

oke udah ya

Wassabamu’alaikum Wr. Wb.


Eksperimen

Eksperimen

Wah habis eksperimen, jadi idenya bikin game sepeda pancal. kita maen game sekaligus olah raga. sistem ini pakai ngirim derajat kemudi, rem dan kecepatan. seru juga he he he …. ya nanti deh di update jika game nya udah jadi dan saya posting deh…

di awal saja deh kesimpulannya

jadi ini kesimpulan yang didapat

  1. Arduino duemilanove cukup mampu untuk menghitung kecepatan putar motor. tentu ada batasnya. kan tiap siklus clock mikrokontroller bisa saja lebih lambat dari kecepatan putar motor. perlu diingat It takes about 100 microseconds (0.0001 s) to read an analog input, so the maximum reading rate is about 10,000 times a second. (diambil dari reference nya analogRead Arduino) . ADC memiliki keterbatasan baca. selama percobaan sih sepertinya motornya masih lebih lambat daripada Arduino sehingga masih bisa dibaca. Dalam percobaan ini motor berputar sekitar 60 rps. (rotation per second).= 3600 rpm. Format data yang dikirimkan. kirim = (String)derajatKemudi()+”#”+Rem()+”#”+kecepatanMperSecond+”#”+digitalRead(A2)+”#”+rps+”#”+countBaling+”#”+countBalingtest;

    Hasil pengiriman data

    Hasil pengiriman data

  2. menggunakan Library EEPROMex. karena menyimpan data integer yang berukuran 2 byte. (library defaultnya hanya bisa 1 byte).
  3. encoder semacam ini sensitif terhadap CPU Time. sehingga bila Mikrokontroller melakukan tugas yang banyak dan terdelay kemungkinan akan mempengaruhi hasil perhitungan encoder. oleh karena itu ini saya buat sesimple mungkin untuk mikrokontroller… dan tidak saya beri delay sama sekali
    schema

    schema menggunakan fritizing

    encoder

    motor

    motor

    Hasil akhir game sepeda yang ingin dicapai.

hasil akhir yang ingin dicapai

hasil akhir yang ingin dicapai

=======================================START OF SOURCE CODE=================================================================

#include EEPROMex.h

const double kelilingRoda = 1.5; //Meter
const int waktuSampling = 250;//milisekon,
//waktuSampling tidak mempengaruhi kecepatan, hanya pengiriman datanya lebih cepat lebih responsif
const byte jmlBaling = 8; //jumlah baling putih saja artinya nanti menghasilkan 8 pulsa / putaran atau 20p/r

String kirim;
char mode;
unsigned int lowIn, highIn, lowRem,highRem, batasBlackWhite = 0;

void setup()
{

  pinMode(A2, INPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);

  //load nilai tersimpan pada EEPROM karena int 2 byte maka jangkah 2-2
  lowIn=EEPROM.readInt(0);
  highIn=EEPROM.readInt(2);
  batasBlackWhite=EEPROM.read(4);
  lowRem=EEPROM.readInt(6);
  highRem=EEPROM.readInt(8);
  mode=EEPROM.read(10);//1 byte
}

void loop()
{

  bacaPerintah();
  hitungKecepatan();

}

double derajatKemudi()
{
	//range setir -90 s/d 90 = 180
	int valueIn = analogRead(A0);
	double derajat=-90 +(valueIn-lowIn)*(180.00/(highIn-lowIn));
	//pembacaan akan eror nilainya jika derajat setir lebih dari batas yang ditentukan -90 sampai 90
	//di paskan
	if(valueIn<lowIn)
		derajat = -90.00;
	else if(valueIn>highIn)
		derajat = 90.00;

	return derajat;
}
double Rem()
{
	//range rem 0-9.
	int valueIn = analogRead(A3);
	double rem=0.0 +(valueIn-lowRem)*(9.00/(highRem-lowRem));
	if(valueIn<lowRem)
		rem = 0.00;
	else if(valueIn>highRem)
		rem = 9.00;

	return rem;
}

void hitungKecepatan()
{
   static unsigned int countBaling,countBalingtest;
   static unsigned long lastTime;
   static boolean statKec1, statKec2;
  //countBalingtest hanya digunakan untuk kalibrasi jumlah pulsa 1 putaran penuh.
  //jika sudah dikalibrasi tidak perlu di kirim ke serial
  unsigned int analogKec=analogRead(A1);
  if(analogKec<batasBlackWhite) //analog dijadikan digital
  {
	  statKec1=HIGH;
      digitalWrite(13, HIGH); //menyalakan led internal arduino agar terlihat beda sense hitam putih
  }
  else
  {
	  statKec1=LOW;
	  digitalWrite(13, LOW);
  }
  //togle bila kondisi tidak sama dengan sebelumnya maka hitung
  //bila sama maka sensor masih menghitung salah satu hitam atau putih dan belum berubah

  if(statKec2!=statKec1)
  {
	if( statKec1==HIGH)//rising .. dari lowh menjadi high yg dihitung. kalau high jadi low tidak dihitung.
	{
		countBaling++;
		countBalingtest++;
	}
    statKec2=statKec1;
  }

  if(millis()-lastTime>= waktuSampling )/*waktuSampling diganti dengan 1000 = 1 detik*/
  {
	//rps = rotation per second.
    double rps=((double)countBaling/jmlBaling)*(1000.0/waktuSampling);
	double kecepatanMperSecond = rps * kelilingRoda;

	//timer setelah hitung kecepatan putar selama >= waktu sampling lalu kirim
	//derajat kemudi # rem # kecepatanMperSecond # mundur  # countBaling # countBalingtest
	//untuk yang rem mirip dengan derajat kemudi. tinggal gunakan variable yang beda
	//perlu diingat karena arduino sangat "terbatas" maka gunakan variable sehemat mungkin.
	//gunakan tipe data yang tepat
	//A2 = tombol jalan mundur
	//count baling cuma buat coba2 bisa ngukur beda di kertas putih n hitam
	//countBalingtest cuma buat coba2 jumlah pulsa yang dihasilkan selama running mikrokontroller
	//usahakan pengiriman data seminimal mungkin
	//countBaling = jumlah pulsa yang dihasilkan baling dalam waktu sampling
	//countBalingtest = jumlah pulsa mulai dari hidup

	//mode pengiriman data
	if(mode=='D')//debug mode
	{
	    unsigned long runningTime = millis();
		kirim = (String)derajatKemudi()+"#"+Rem()+"#"+kecepatanMperSecond+"#"+digitalRead(A2)+"#"+rps+"#"+countBaling+"#"+countBalingtest+"#"+(runningTime/1000)/3600+" hours "+((runningTime/1000)/60)%60 +" minutes "+(runningTime/1000)%60+" seconds" ;

	}
	else if(mode=='R')//running mode
	{
		kirim = (String)derajatKemudi()+"#"+Rem()+"#"+kecepatanMperSecond+"#"+digitalRead(A2);
	}
	else
	{
		kirim = "info#Please set send mode fisrt";
	}

    Serial.println(kirim);
	countBaling = 0;
      lastTime=millis();
  }

}

void bacaPerintah()
{
	static unsigned int batasAnalogWhite;
	if (Serial.available()>0)
	{
		char perintah = Serial.read();

		//FYI EEPROM AVR memiliki batas tulis 100 ribu kali.
		//jadi jangan terlalu sering di write.
		if(perintah=='a')//kalibrasi lowIn (-90 derajat)
		{
			  lowIn = analogRead(A0);
			  //masukkan lowIn ke EEPROM;
			  if(EEPROM.updateInt(0, lowIn))
			  {
				  //diberi info# untuk membedakan header data sensor atau informasi.
				  //tinggal diberi if di unity
				  kirim = (String)"info#Analaog value "+lowIn+" as -90 calibration";
				  Serial.println(kirim);
			  }
		}
		else if(perintah=='b')//kalibrasi highIn (90 derajat)
		{
			  highIn = analogRead(A0);
			  //masukkan highIn ke EEPROM;
			  if(EEPROM.updateInt(2, highIn))
			  {
					kirim = (String)"info#Analaog value "+highIn+" as 90 calibration";
					Serial.println(kirim);
			  }
		}
		else if(perintah=='c')
		{
			batasAnalogWhite =  analogRead(A1);
			kirim = (String)"info#Analaog value "+batasAnalogWhite+" as white calibration";
			Serial.println(kirim);
		}
		else if(perintah=='d')
		{
			int batasAnalogBlack =  analogRead(A1);
			kirim = (String)"info#Analaog value "+batasAnalogBlack+" as black calibration";
			Serial.println(kirim);
			batasBlackWhite = (int)(batasAnalogBlack - batasAnalogWhite)/2; // batas tengah antara black white
			if(EEPROM.updateInt(4, batasBlackWhite))
			  {
					kirim = (String)"info#Analaog value "+batasBlackWhite+" as batasBlackWhite calibration";
					Serial.println(kirim);
			  }
		}
		else if(perintah=='e')//kalibrasi lowRem (tidak ngerem)
		{
			  lowRem = analogRead(A3);
			  //masukkan lowIn ke EEPROM;

			  if(EEPROM.updateInt(6, lowRem))
			  {
					kirim = (String)"info#Analaog value "+lowRem+" as lowRem calibration";
					Serial.println(kirim);
			  }
		}
		else if(perintah=='f')//kalibrasi highRem (sangat ngerem)
		{
			  highRem = analogRead(A3);
			  //masukkan highIn ke EEPROM;
			  if(EEPROM.updateInt(8, highRem))
			  {
					kirim = (String)"info#Analaog value "+highRem+" as highRem calibration";
					Serial.println(kirim);
			  }
		}
		else if(perintah=='g')//set debug mode
		{
			  mode='D';
			  if(EEPROM.update(10, mode))
			  {
					kirim = (String)"info#Data send mode "+mode;
					Serial.println(kirim);
			  }
		}
		else if(perintah=='h')//running mode
		{
			  mode='R';
			  if(EEPROM.update(10, mode))
			  {
					kirim = (String)"info#Data send mode "+mode;
					Serial.println(kirim);
			  }
		}
	}
}

=======================================END OF SOURCE CODE==================================================================


Assalamu’alaikum Wr. Wb.

Yah mau tidur… pengen nulis dikit2. Tadi siang saya membuat robot GeJe. Gerakannya ngawur tapi lucu juga :). Gerakannya tidak ditentukan namun random, belok kanan kiri maju mundur, seru juga :p. Saya nggak tahu apakah judul Randomisasi itu betul ? Apa kayak minimisasi yah ? Inget2 praktikum RD adjah he he he. Yah kali ini membahas fungsi random() sebenernya masih binggung beda antara randomSeed(). cari tahu sendiri lah, bahasa inggirs malas baca. Liad di referensinya. namun sekilas itu buat nggenerate nilai bila pin analog ini tidak disambungkan. jadi meski tidak digunakan masih bisa nggenerate nilai untuk fungsi analogRead(A0);

randomSeed(analogRead(0));

Oh ya artikel ini tinggal menyabung artikel sebelumnya https://tarecha.wordpress.com/2011/01/18/pengaturan-pwm-motor-menggunakan-arduino/

(lebih…)